[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/kernel-apimodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/zh_TW/core-api/kernel-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/it_IT/core-api/kernel-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ja_JP/core-api/kernel-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ko_KR/core-api/kernel-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/pt_BR/core-api/kernel-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/sp_SP/core-api/kernel-apimodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hThe Linux Kernel APIh]hThe Linux Kernel API}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhA/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api.rsthKubh)}(hhh](h)}(hBasic C Library Functionsh]hBasic C Library Functions}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hX#When writing drivers, you cannot in general use routines which are from the C Library. Some of the functions have been found generally useful and they are listed below. The behaviour of these functions may vary slightly from those defined by ANSI, and these deviations are noted in the text.h]hX#When writing drivers, you cannot in general use routines which are from the C Library. Some of the functions have been found generally useful and they are listed below. The behaviour of these functions may vary slightly from those defined by ANSI, and these deviations are noted in the text.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hhh](h)}(hString Conversionsh]hString Conversions}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlesimple_strtoull (C function)c.simple_strtoullhNtauh1hhhhhhNhNubhdesc)}(hhh](hdesc_signature)}(hSunsigned long long simple_strtoull (const char *cp, char **endp, unsigned int base)h]hdesc_signature_line)}(hRunsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)h](hdesc_sig_keyword_type)}(hunsignedh]hunsigned}(hj!hhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhubhdesc_sig_space)}(h h]h }(hj3hhhNhNubah}(h]h ]wah"]h$]h&]uh1j1hjhhhj0hKhubj )}(hlongh]hlong}(hjBhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhj0hKhubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj0hKhubj )}(hlongh]hlong}(hj^hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhj0hKhubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj0hKhubh desc_name)}(hsimple_strtoullh]h desc_sig_name)}(hsimple_strtoullh]hsimple_strtoull}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhj|ubah}(h]h ](sig-namedescnameeh"]h$]h&] xml:spacepreserveuh1jzhjhhhj0hKhubhdesc_parameterlist)}(h0(const char *cp, char **endp, unsigned int base)h](hdesc_parameter)}(hconst char *cph](hdesc_sig_keyword)}(hconsth]hconst}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjubj)}(hcph]hcp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h char **endph](j )}(hcharh]hchar}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hendph]hendp}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int baseh](j )}(hunsignedh]hunsigned}(hj[hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj )}(hinth]hint}(hjwhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hbaseh]hbase}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj0hKhubeh}(h]h ]h"]h$]h&]jj add_permalinkuh1jsphinx_line_type declaratorhjhhhj0hKhubah}(h]j ah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhj0hKhhjhhubh desc_content)}(hhh]h)}(h)convert a string to an unsigned long longh]h)convert a string to an unsigned long long}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj0hKhubeh}(h]h ](cfunctioneh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhhhNhNubh container)}(hX**Parameters** ``const char *cp`` The start of the string ``char **endp`` A pointer to the end of the parsed string will be placed here ``unsigned int base`` The number base to use **Description** This function has caveats. Please use kstrtoull instead.h](h)}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKlhjubhdefinition_list)}(hhh](hdefinition_list_item)}(h+``const char *cp`` The start of the string h](hterm)}(h``const char *cp``h]hliteral)}(hjh]hconst char *cp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKihjubh definition)}(hhh]h)}(hThe start of the stringh]hThe start of the string}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hKihj3ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj0hKihj ubj)}(hN``char **endp`` A pointer to the end of the parsed string will be placed here h](j)}(h``char **endp``h]j)}(hjVh]h char **endp}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKjhjPubj2)}(hhh]h)}(h=A pointer to the end of the parsed string will be placed hereh]h=A pointer to the end of the parsed string will be placed here}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhKjhjlubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhjkhKjhj ubj)}(h-``unsigned int base`` The number base to use h](j)}(h``unsigned int base``h]j)}(hjh]hunsigned int base}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKkhjubj2)}(hhh]h)}(hThe number base to useh]hThe number base to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKkhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKkhj ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKmhjubh)}(h8This function has caveats. Please use kstrtoull instead.h]h8This function has caveats. Please use kstrtoull instead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKlhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j simple_strtoul (C function)c.simple_strtoulhNtauh1hhhhhhNhNubj)}(hhh](j)}(hMunsigned long simple_strtoul (const char *cp, char **endp, unsigned int base)h]j)}(hLunsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKwubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhKwubj )}(hlongh]hlong}(hj,hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhjhKwubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhKwubj{)}(hsimple_strtoulh]j)}(hsimple_strtoulh]hsimple_strtoul}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhKwubj)}(h0(const char *cp, char **endp, unsigned int base)h](j)}(hconst char *cph](j)}(hjh]hconst}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hcph]hcp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj`ubj)}(h char **endph](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hendph]hendp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj`ubj)}(hunsigned int baseh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hbaseh]hbase}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj`ubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhjhKwubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKwubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKwhjhhubj)}(hhh]h)}(h$convert a string to an unsigned longh]h$convert a string to an unsigned long}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKwhjshhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKwubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhhhNhNubj)}(hX**Parameters** ``const char *cp`` The start of the string ``char **endp`` A pointer to the end of the parsed string will be placed here ``unsigned int base`` The number base to use **Description** This function has caveats. Please use kstrtoul instead.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chK{hjubj )}(hhh](j)}(h+``const char *cp`` The start of the string h](j)}(h``const char *cp``h]j)}(hjh]hconst char *cp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKxhjubj2)}(hhh]h)}(hThe start of the stringh]hThe start of the string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKxhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKxhjubj)}(hN``char **endp`` A pointer to the end of the parsed string will be placed here h](j)}(h``char **endp``h]j)}(hjh]h char **endp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKyhjubj2)}(hhh]h)}(h=A pointer to the end of the parsed string will be placed hereh]h=A pointer to the end of the parsed string will be placed here}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKyhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKyhjubj)}(h-``unsigned int base`` The number base to use h](j)}(h``unsigned int base``h]j)}(hj)h]hunsigned int base}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKzhj#ubj2)}(hhh]h)}(hThe number base to useh]hThe number base to use}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hKzhj?ubah}(h]h ]h"]h$]h&]uh1j1hj#ubeh}(h]h ]h"]h$]h&]uh1jhj>hKzhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjdh]h Description}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chK|hjubh)}(h7This function has caveats. Please use kstrtoul instead.h]h7This function has caveats. Please use kstrtoul instead.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chK{hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j simple_strtol (C function)c.simple_strtolhNtauh1hhhhhhNhNubj)}(hhh](j)}(hClong simple_strtol (const char *cp, char **endp, unsigned int base)h]j)}(hBlong simple_strtol(const char *cp, char **endp, unsigned int base)h](j )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(h simple_strtolh]j)}(h simple_strtolh]h simple_strtol}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h0(const char *cp, char **endp, unsigned int base)h](j)}(hconst char *cph](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcph]hcp}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h char **endph](j )}(hcharh]hchar}(hjChhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj?ubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubj)}(hjh]h*}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hjh]h*}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hendph]hendp}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int baseh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hbaseh]hbase}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h!convert a string to a signed longh]h!convert a string to a signed long}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhhhNhNubj)}(hX**Parameters** ``const char *cp`` The start of the string ``char **endp`` A pointer to the end of the parsed string will be placed here ``unsigned int base`` The number base to use **Description** This function has caveats. Please use kstrtol instead.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhjubj )}(hhh](j)}(h+``const char *cp`` The start of the string h](j)}(h``const char *cp``h]j)}(hj5h]hconst char *cp}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhj/ubj2)}(hhh]h)}(hThe start of the stringh]hThe start of the string}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhKhjKubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhjJhKhj,ubj)}(hN``char **endp`` A pointer to the end of the parsed string will be placed here h](j)}(h``char **endp``h]j)}(hjnh]h char **endp}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhjhubj2)}(hhh]h)}(h=A pointer to the end of the parsed string will be placed hereh]h=A pointer to the end of the parsed string will be placed here}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhjhKhj,ubj)}(h-``unsigned int base`` The number base to use h](j)}(h``unsigned int base``h]j)}(hjh]hunsigned int base}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhjubj2)}(hhh]h)}(hThe number base to useh]hThe number base to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj,ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhjubh)}(h6This function has caveats. Please use kstrtol instead.h]h6This function has caveats. Please use kstrtol instead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j simple_strtoll (C function)c.simple_strtollhNtauh1hhhhhhNhNubj)}(hhh](j)}(hIlong long simple_strtoll (const char *cp, char **endp, unsigned int base)h]j)}(hHlong long simple_strtoll(const char *cp, char **endp, unsigned int base)h](j )}(hlongh]hlong}(hj' hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj# hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKubj2)}(h h]h }(hj6 hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj# hhhj5 hKubj )}(hlongh]hlong}(hjD hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj# hhhj5 hKubj2)}(h h]h }(hjR hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj# hhhj5 hKubj{)}(hsimple_strtollh]j)}(hsimple_strtollh]hsimple_strtoll}(hjd hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj` ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj# hhhj5 hKubj)}(h0(const char *cp, char **endp, unsigned int base)h](j)}(hconst char *cph](j)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj| ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj| ubj )}(hcharh]hchar}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj| ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj| ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj| ubj)}(hcph]hcp}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj| ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjx ubj)}(h char **endph](j )}(hcharh]hchar}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hendph]hendp}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjx ubj)}(hunsigned int baseh](j )}(hunsignedh]hunsigned}(hj, hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj( ubj2)}(h h]h }(hj: hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj( ubj )}(hinth]hint}(hjH hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj( ubj2)}(h h]h }(hjV hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj( ubj)}(hbaseh]hbase}(hjd hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj( ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjx ubeh}(h]h ]h"]h$]h&]jjuh1jhj# hhhj5 hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj5 hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj5 hKhj hhubj)}(hhh]h)}(h&convert a string to a signed long longh]h&convert a string to a signed long long}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj5 hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhhhNhNubj)}(hX**Parameters** ``const char *cp`` The start of the string ``char **endp`` A pointer to the end of the parsed string will be placed here ``unsigned int base`` The number base to use **Description** This function has caveats. Please use kstrtoll instead.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhj ubj )}(hhh](j)}(h+``const char *cp`` The start of the string h](j)}(h``const char *cp``h]j)}(hj h]hconst char *cp}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhj ubj2)}(hhh]h)}(hThe start of the stringh]hThe start of the string}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubj)}(hN``char **endp`` A pointer to the end of the parsed string will be placed here h](j)}(h``char **endp``h]j)}(hj h]h char **endp}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhj ubj2)}(hhh]h)}(h=A pointer to the end of the parsed string will be placed hereh]h=A pointer to the end of the parsed string will be placed here}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubj)}(h-``unsigned int base`` The number base to use h](j)}(h``unsigned int base``h]j)}(hjA h]hunsigned int base}(hjC hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj? ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhj; ubj2)}(hhh]h)}(hThe number base to useh]hThe number base to use}(hjZ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjV hKhjW ubah}(h]h ]h"]h$]h&]uh1j1hj; ubeh}(h]h ]h"]h$]h&]uh1jhjV hKhj ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hj| h]h Description}(hj~ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhj ubh)}(h7This function has caveats. Please use kstrtoll instead.h]h7This function has caveats. Please use kstrtoll instead.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chKhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j vsnprintf (C function) c.vsnprintfhNtauh1hhhhhhNhNubj)}(hhh](j)}(hIint vsnprintf (char *buf, size_t size, const char *fmt_str, va_list args)h]j)}(hHint vsnprintf(char *buf, size_t size, const char *fmt_str, va_list args)h](j )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj hM ubj{)}(h vsnprintfh]j)}(h vsnprintfh]h vsnprintf}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj hM ubj)}(h;(char *buf, size_t size, const char *fmt_str, va_list args)h](j)}(h char *bufh](j )}(hcharh]hchar}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hbufh]hbuf}(hj' hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjC hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ ubah}(h]h ]h"]h$]h&] refdomainjreftype identifier reftargetjE modnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j^ ASTIdentifier)}jY j sb c.vsnprintfasbuh1hhj< ubj2)}(h h]h }(hjk hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj< ubj)}(hsizeh]hsize}(hjy hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj< ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hconst char *fmt_strh](j)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hcharh]hchar}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hfmt_strh]hfmt_str}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(h va_list argsh](h)}(hhh]j)}(hva_listh]hva_list}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jg c.vsnprintfasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hargsh]hargs}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhj hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hM ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hM hj hhubj)}(hhh]h)}(h(Format a string and place it in a bufferh]h(Format a string and place it in a buffer}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjE hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj` jj` jjjuh1jhhhhhNhNubj)}(hX**Parameters** ``char *buf`` The buffer to place the result into ``size_t size`` The size of the buffer, including the trailing null space ``const char *fmt_str`` The format string to use ``va_list args`` Arguments for the format string **Description** This function generally follows C99 vsnprintf, but has some extensions and a few limitations: - ````n```` is unsupported - ````p*```` is handled by pointer() See pointer() or Documentation/core-api/printk-formats.rst for more extensive description. **Please update the documentation in both places when making changes** The return value is the number of characters which would be generated for the given input, excluding the trailing '\0', as per ISO C99. If you want to have the exact number of characters written into **buf** as return value (not including the trailing '\0'), use vscnprintf(). If the return is greater than or equal to **size**, the resulting string is truncated. If you're not already dealing with a va_list consider using snprintf().h](h)}(h**Parameters**h]j)}(hjj h]h Parameters}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjd ubj )}(hhh](j)}(h2``char *buf`` The buffer to place the result into h](j)}(h ``char *buf``h]j)}(hj h]h char *buf}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj ubj2)}(hhh]h)}(h#The buffer to place the result intoh]h#The buffer to place the result into}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM hj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hM hj ubj)}(hJ``size_t size`` The size of the buffer, including the trailing null space h](j)}(h``size_t size``h]j)}(hj h]h size_t size}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj ubj2)}(hhh]h)}(h9The size of the buffer, including the trailing null spaceh]h9The size of the buffer, including the trailing null space}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM hj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hM hj ubj)}(h1``const char *fmt_str`` The format string to use h](j)}(h``const char *fmt_str``h]j)}(hj h]hconst char *fmt_str}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj ubj2)}(hhh]h)}(hThe format string to useh]hThe format string to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhjhM hj ubj)}(h1``va_list args`` Arguments for the format string h](j)}(h``va_list args``h]j)}(hj4h]h va_list args}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj.ubj2)}(hhh]h)}(hArguments for the format stringh]hArguments for the format string}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhM hjJubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhM hj ubeh}(h]h ]h"]h$]h&]uh1j hjd ubh)}(h**Description**h]j)}(hjoh]h Description}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjd ubh)}(h]This function generally follows C99 vsnprintf, but has some extensions and a few limitations:h]h]This function generally follows C99 vsnprintf, but has some extensions and a few limitations:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjd ubh block_quote)}(h@- ````n```` is unsupported - ````p*```` is handled by pointer() h]h bullet_list)}(hhh](h list_item)}(h````n```` is unsupportedh]h)}(hjh](j)}(h ````n````h]h``n``}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is unsupported}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h#````p*```` is handled by pointer() h]h)}(h"````p*```` is handled by pointer()h](j)}(h ````p*````h]h``p*``}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is handled by pointer()}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjhM hjd ubh)}(hZSee pointer() or Documentation/core-api/printk-formats.rst for more extensive description.h]hZSee pointer() or Documentation/core-api/printk-formats.rst for more extensive description.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjd ubh)}(hF**Please update the documentation in both places when making changes**h]j)}(hj h]hBPlease update the documentation in both places when making changes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjd ubh)}(hXkThe return value is the number of characters which would be generated for the given input, excluding the trailing '\0', as per ISO C99. If you want to have the exact number of characters written into **buf** as return value (not including the trailing '\0'), use vscnprintf(). If the return is greater than or equal to **size**, the resulting string is truncated.h](hThe return value is the number of characters which would be generated for the given input, excluding the trailing ‘0’, as per ISO C99. If you want to have the exact number of characters written into }(hj#hhhNhNubj)}(h**buf**h]hbuf}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubht as return value (not including the trailing ‘0’), use vscnprintf(). If the return is greater than or equal to }(hj#hhhNhNubj)}(h**size**h]hsize}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh$, the resulting string is truncated.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM! hjd ubh)}(hGIf you're not already dealing with a va_list consider using snprintf().h]hIIf you’re not already dealing with a va_list consider using snprintf().}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM) hjd ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j vscnprintf (C function) c.vscnprintfhNtauh1hhhhhhNhNubj)}(hhh](j)}(hFint vscnprintf (char *buf, size_t size, const char *fmt, va_list args)h]j)}(hEint vscnprintf(char *buf, size_t size, const char *fmt, va_list args)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM ubj{)}(h vscnprintfh]j)}(h vscnprintfh]h vscnprintf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM ubj)}(h7(char *buf, size_t size, const char *fmt, va_list args)h](j)}(h char *bufh](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY jsb c.vscnprintfasbuh1hhjubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *fmth](j)}(hjh]hconst}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubj )}(hcharh]hchar}(hjihhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj)}(hfmth]hfmt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h va_list argsh](h)}(hhh]j)}(hva_listh]hva_list}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j# c.vscnprintfasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hargsh]hargs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj}hhhjhM ubah}(h]jxah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjzhhubj)}(hhh]h)}(h(Format a string and place it in a bufferh]h(Format a string and place it in a buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjzhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhhhNhNubj)}(hX=**Parameters** ``char *buf`` The buffer to place the result into ``size_t size`` The size of the buffer, including the trailing null space ``const char *fmt`` The format string to use ``va_list args`` Arguments for the format string **Description** The return value is the number of characters which have been written into the **buf** not including the trailing '\0'. If **size** is == 0 the function returns 0. If you're not already dealing with a va_list consider using scnprintf(). See the vsnprintf() documentation for format string extensions over C99.h](h)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj ubj )}(hhh](j)}(h2``char *buf`` The buffer to place the result into h](j)}(h ``char *buf``h]j)}(hjEh]h char *buf}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj?ubj2)}(hhh]h)}(h#The buffer to place the result intoh]h#The buffer to place the result into}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhM hj[ubah}(h]h ]h"]h$]h&]uh1j1hj?ubeh}(h]h ]h"]h$]h&]uh1jhjZhM hj<ubj)}(hJ``size_t size`` The size of the buffer, including the trailing null space h](j)}(h``size_t size``h]j)}(hj~h]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjxubj2)}(hhh]h)}(h9The size of the buffer, including the trailing null spaceh]h9The size of the buffer, including the trailing null space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjxubeh}(h]h ]h"]h$]h&]uh1jhjhM hj<ubj)}(h-``const char *fmt`` The format string to use h](j)}(h``const char *fmt``h]j)}(hjh]hconst char *fmt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj2)}(hhh]h)}(hThe format string to useh]hThe format string to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hj<ubj)}(h1``va_list args`` Arguments for the format string h](j)}(h``va_list args``h]j)}(hjh]h va_list args}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj2)}(hhh]h)}(hArguments for the format stringh]hArguments for the format string}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hj<ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hj+h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj ubh)}(hThe return value is the number of characters which have been written into the **buf** not including the trailing '\0'. If **size** is == 0 the function returns 0.h](hNThe return value is the number of characters which have been written into the }(hjAhhhNhNubj)}(h**buf**h]hbuf}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh) not including the trailing ‘0’. If }(hjAhhhNhNubj)}(h**size**h]hsize}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh is == 0 the function returns 0.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj ubh)}(hHIf you're not already dealing with a va_list consider using scnprintf().h]hJIf you’re not already dealing with a va_list consider using scnprintf().}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj ubh)}(hHSee the vsnprintf() documentation for format string extensions over C99.h]hHSee the vsnprintf() documentation for format string extensions over C99.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j snprintf (C function) c.snprintfhNtauh1hhhhhhNhNubj)}(hhh](j)}(h;int snprintf (char *buf, size_t size, const char *fmt, ...)h]j)}(h:int snprintf(char *buf, size_t size, const char *fmt, ...)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM ubj{)}(hsnprintfh]j)}(hsnprintfh]hsnprintf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM ubj)}(h.(char *buf, size_t size, const char *fmt, ...)h](j)}(h char *bufh](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj6modnameN classnameNj] j` )}jc ]jf )}jY jsb c.snprintfasbuh1hhj-ubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(hsizeh]hsize}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *fmth](j)}(hjh]hconst}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjwubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hfmth]hfmt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h...h]j)}(h...h]h...}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h(Format a string and place it in a bufferh]h(Format a string and place it in a buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhhhNhNubj)}(hX'**Parameters** ``char *buf`` The buffer to place the result into ``size_t size`` The size of the buffer, including the trailing null space ``const char *fmt`` The format string to use ``...`` Arguments for the format string **Description** The return value is the number of characters which would be generated for the given input, excluding the trailing null, as per ISO C99. If the return is greater than or equal to **size**, the resulting string is truncated. See the vsnprintf() documentation for format string extensions over C99.h](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj )}(hhh](j)}(h2``char *buf`` The buffer to place the result into h](j)}(h ``char *buf``h]j)}(hjCh]h char *buf}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj=ubj2)}(hhh]h)}(h#The buffer to place the result intoh]h#The buffer to place the result into}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhM hjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhM hj:ubj)}(hJ``size_t size`` The size of the buffer, including the trailing null space h](j)}(h``size_t size``h]j)}(hj|h]h size_t size}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjvubj2)}(hhh]h)}(h9The size of the buffer, including the trailing null spaceh]h9The size of the buffer, including the trailing null space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhM hj:ubj)}(h-``const char *fmt`` The format string to use h](j)}(h``const char *fmt``h]j)}(hjh]hconst char *fmt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj2)}(hhh]h)}(hThe format string to useh]hThe format string to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hj:ubj)}(h(``...`` Arguments for the format string h](j)}(h``...``h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj2)}(hhh]h)}(hArguments for the format stringh]hArguments for the format string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hj:ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj)h]h Description}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubh)}(hThe return value is the number of characters which would be generated for the given input, excluding the trailing null, as per ISO C99. If the return is greater than or equal to **size**, the resulting string is truncated.h](hThe return value is the number of characters which would be generated for the given input, excluding the trailing null, as per ISO C99. If the return is greater than or equal to }(hj?hhhNhNubj)}(h**size**h]hsize}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh$, the resulting string is truncated.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubh)}(hHSee the vsnprintf() documentation for format string extensions over C99.h]hHSee the vsnprintf() documentation for format string extensions over C99.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j scnprintf (C function) c.scnprintfhNtauh1hhhhhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjhhhjhM ubj{)}(h scnprintfh]j)}(h scnprintfh]h scnprintf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM ubj)}(h.(char *buf, size_t size, const char *fmt, ...)h](j)}(h char *bufh](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.scnprintfasbuh1hhj ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hsizeh]hsize}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *fmth](j)}(hjh]hconst}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj )}(hcharh]hchar}(hjshhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjTubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hfmth]hfmt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h...h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h(Format a string and place it in a bufferh]h(Format a string and place it in a buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhhhNhNubj)}(hX**Parameters** ``char *buf`` The buffer to place the result into ``size_t size`` The size of the buffer, including the trailing null space ``const char *fmt`` The format string to use ``...`` Arguments for the format string **Description** The return value is the number of characters written into **buf** not including the trailing '\0'. If **size** is == 0 the function returns 0.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj )}(hhh](j)}(h2``char *buf`` The buffer to place the result into h](j)}(h ``char *buf``h]j)}(hjh]h char *buf}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj2)}(hhh]h)}(h#The buffer to place the result intoh]h#The buffer to place the result into}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hM hj5ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj4hM hjubj)}(hJ``size_t size`` The size of the buffer, including the trailing null space h](j)}(h``size_t size``h]j)}(hjXh]h size_t size}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjRubj2)}(hhh]h)}(h9The size of the buffer, including the trailing null spaceh]h9The size of the buffer, including the trailing null space}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhM hjnubah}(h]h ]h"]h$]h&]uh1j1hjRubeh}(h]h ]h"]h$]h&]uh1jhjmhM hjubj)}(h-``const char *fmt`` The format string to use h](j)}(h``const char *fmt``h]j)}(hjh]hconst char *fmt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj2)}(hhh]h)}(hThe format string to useh]hThe format string to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h(``...`` Arguments for the format string h](j)}(h``...``h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj2)}(hhh]h)}(hArguments for the format stringh]hArguments for the format string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubh)}(hThe return value is the number of characters written into **buf** not including the trailing '\0'. If **size** is == 0 the function returns 0.h](h:The return value is the number of characters written into }(hjhhhNhNubj)}(h**buf**h]hbuf}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) not including the trailing ‘0’. If }(hjhhhNhNubj)}(h**size**h]hsize}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is == 0 the function returns 0.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j vsprintf (C function) c.vsprintfhNtauh1hhhhhhNhNubj)}(hhh](j)}(h7int vsprintf (char *buf, const char *fmt, va_list args)h]j)}(h6int vsprintf(char *buf, const char *fmt, va_list args)h](j )}(hinth]hint}(hjnhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM ubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjhhhj|hM ubj{)}(hvsprintfh]j)}(hvsprintfh]hvsprintf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjjhhhj|hM ubj)}(h*(char *buf, const char *fmt, va_list args)h](j)}(h char *bufh](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *fmth](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfmth]hfmt}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h va_list argsh](h)}(hhh]j)}(hva_listh]hva_list}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjOmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.vsprintfasbuh1hhjFubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj)}(hargsh]hargs}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjjhhhj|hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjfhhhj|hM ubah}(h]jaah ](jjeh"]h$]h&]jj)jhuh1jhj|hM hjchhubj)}(hhh]h)}(h(Format a string and place it in a bufferh]h(Format a string and place it in a buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjchhhj|hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhhhNhNubj)}(hX**Parameters** ``char *buf`` The buffer to place the result into ``const char *fmt`` The format string to use ``va_list args`` Arguments for the format string **Description** The return value is the number of characters written into **buf** not including the trailing '\0'. Use vsnprintf() or vscnprintf() in order to avoid buffer overflows. If you're not already dealing with a va_list consider using sprintf(). See the vsnprintf() documentation for format string extensions over C99.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj )}(hhh](j)}(h2``char *buf`` The buffer to place the result into h](j)}(h ``char *buf``h]j)}(hjh]h char *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj2)}(hhh]h)}(h#The buffer to place the result intoh]h#The buffer to place the result into}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h-``const char *fmt`` The format string to use h](j)}(h``const char *fmt``h]j)}(hjh]hconst char *fmt}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj2)}(hhh]h)}(hThe format string to useh]hThe format string to use}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hM hj5ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj4hM hjubj)}(h1``va_list args`` Arguments for the format string h](j)}(h``va_list args``h]j)}(hjXh]h va_list args}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjRubj2)}(hhh]h)}(hArguments for the format stringh]hArguments for the format string}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhM hjnubah}(h]h ]h"]h$]h&]uh1j1hjRubeh}(h]h ]h"]h$]h&]uh1jhjmhM hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubh)}(hThe return value is the number of characters written into **buf** not including the trailing '\0'. Use vsnprintf() or vscnprintf() in order to avoid buffer overflows.h](h:The return value is the number of characters written into }(hjhhhNhNubj)}(h**buf**h]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhi not including the trailing ‘0’. Use vsnprintf() or vscnprintf() in order to avoid buffer overflows.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubh)}(hFIf you're not already dealing with a va_list consider using sprintf().h]hHIf you’re not already dealing with a va_list consider using sprintf().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubh)}(hHSee the vsnprintf() documentation for format string extensions over C99.h]hHSee the vsnprintf() documentation for format string extensions over C99.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j sprintf (C function) c.sprintfhNtauh1hhhhhhNhNubj)}(hhh](j)}(h-int sprintf (char *buf, const char *fmt, ...)h]j)}(h,int sprintf(char *buf, const char *fmt, ...)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM ubj{)}(hsprintfh]j)}(hsprintfh]hsprintf}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM ubj)}(h!(char *buf, const char *fmt, ...)h](j)}(h char *bufh](j )}(hcharh]hchar}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjAubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubj)}(hjh]h*}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(hbufh]hbuf}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(hconst char *fmth](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfmth]hfmt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(h...h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h(Format a string and place it in a bufferh]h(Format a string and place it in a buffer}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj%jj%jjjuh1jhhhhhNhNubj)}(hX**Parameters** ``char *buf`` The buffer to place the result into ``const char *fmt`` The format string to use ``...`` Arguments for the format string **Description** The return value is the number of characters written into **buf** not including the trailing '\0'. Use snprintf() or scnprintf() in order to avoid buffer overflows. See the vsnprintf() documentation for format string extensions over C99.h](h)}(h**Parameters**h]j)}(hj/h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj)ubj )}(hhh](j)}(h2``char *buf`` The buffer to place the result into h](j)}(h ``char *buf``h]j)}(hjNh]h char *buf}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjHubj2)}(hhh]h)}(h#The buffer to place the result intoh]h#The buffer to place the result into}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchM hjdubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjchM hjEubj)}(h-``const char *fmt`` The format string to use h](j)}(h``const char *fmt``h]j)}(hjh]hconst char *fmt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj2)}(hhh]h)}(hThe format string to useh]hThe format string to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjEubj)}(h(``...`` Arguments for the format string h](j)}(h``...``h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjubj2)}(hhh]h)}(hArguments for the format stringh]hArguments for the format string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjEubeh}(h]h ]h"]h$]h&]uh1j hj)ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj)ubh)}(hThe return value is the number of characters written into **buf** not including the trailing '\0'. Use snprintf() or scnprintf() in order to avoid buffer overflows.h](h:The return value is the number of characters written into }(hjhhhNhNubj)}(h**buf**h]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhg not including the trailing ‘0’. Use snprintf() or scnprintf() in order to avoid buffer overflows.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj)ubh)}(hHSee the vsnprintf() documentation for format string extensions over C99.h]hHSee the vsnprintf() documentation for format string extensions over C99.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j vbin_printf (C function) c.vbin_printfhNtauh1hhhhhhNhNubj)}(hhh](j)}(hNint vbin_printf (u32 *bin_buf, size_t size, const char *fmt_str, va_list args)h]j)}(hMint vbin_printf(u32 *bin_buf, size_t size, const char *fmt_str, va_list args)h](j )}(hinth]hint}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM7 ubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]hhhjohM7 ubj{)}(h vbin_printfh]j)}(h vbin_printfh]h vbin_printf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj]hhhjohM7 ubj)}(h>(u32 *bin_buf, size_t size, const char *fmt_str, va_list args)h](j)}(h u32 *bin_bufh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.vbin_printfasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbin_bufh]hbin_buf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.vbin_printfasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *fmt_strh](j)}(hjh]hconst}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubj )}(hcharh]hchar}(hjXhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj9ubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hfmt_strh]hfmt_str}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h va_list argsh](h)}(hhh]j)}(hva_listh]hva_list}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.vbin_printfasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hargsh]hargs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj]hhhjohM7 ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjYhhhjohM7 ubah}(h]jTah ](jjeh"]h$]h&]jj)jhuh1jhjohM7 hjVhhubj)}(hhh]h)}(h>Parse a format string and place args' binary value in a bufferh]h@Parse a format string and place args’ binary value in a buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM7 hjhhubah}(h]h ]h"]h$]h&]uh1jhjVhhhjohM7 ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhhhNhNubj)}(hX5**Parameters** ``u32 *bin_buf`` The buffer to place args' binary value ``size_t size`` The size of the buffer(by words(32bits), not characters) ``const char *fmt_str`` The format string to use ``va_list args`` Arguments for the format string **Description** The format follows C99 vsnprintf, except ``n`` is ignored, and its argument is skipped. The return value is the number of words(32bits) which would be generated for the given input. **NOTE** If the return value is greater than **size**, the resulting bin_buf is NOT valid for bstr_printf().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM; hjubj )}(hhh](j)}(h8``u32 *bin_buf`` The buffer to place args' binary value h](j)}(h``u32 *bin_buf``h]j)}(hj4h]h u32 *bin_buf}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM8 hj.ubj2)}(hhh]h)}(h&The buffer to place args' binary valueh]h(The buffer to place args’ binary value}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhM8 hjJubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhM8 hj+ubj)}(hI``size_t size`` The size of the buffer(by words(32bits), not characters) h](j)}(h``size_t size``h]j)}(hjmh]h size_t size}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM9 hjgubj2)}(hhh]h)}(h8The size of the buffer(by words(32bits), not characters)h]h8The size of the buffer(by words(32bits), not characters)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM9 hjubah}(h]h ]h"]h$]h&]uh1j1hjgubeh}(h]h ]h"]h$]h&]uh1jhjhM9 hj+ubj)}(h1``const char *fmt_str`` The format string to use h](j)}(h``const char *fmt_str``h]j)}(hjh]hconst char *fmt_str}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM: hjubj2)}(hhh]h)}(hThe format string to useh]hThe format string to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM: hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM: hj+ubj)}(h1``va_list args`` Arguments for the format string h](j)}(h``va_list args``h]j)}(hjh]h va_list args}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM; hjubj2)}(hhh]h)}(hArguments for the format stringh]hArguments for the format string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM; hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM; hj+ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM= hjubh)}(hWThe format follows C99 vsnprintf, except ``n`` is ignored, and its argument is skipped.h](h)The format follows C99 vsnprintf, except }(hj0 hhhNhNubj)}(h``n``h]hn}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0 ubh) is ignored, and its argument is skipped.}(hj0 hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM< hjubh)}(h]The return value is the number of words(32bits) which would be generated for the given input.h]h]The return value is the number of words(32bits) which would be generated for the given input.}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM? hjubh)}(h**NOTE**h]j)}(hjb h]hNOTE}(hjd hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj` ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chMB hjubh)}(hcIf the return value is greater than **size**, the resulting bin_buf is NOT valid for bstr_printf().h](h$If the return value is greater than }(hjx hhhNhNubj)}(h**size**h]hsize}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx ubh7, the resulting bin_buf is NOT valid for bstr_printf().}(hjx hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chMC hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bstr_printf (C function) c.bstr_printfhNtauh1hhhhhhNhNubj)}(hhh](j)}(hQint bstr_printf (char *buf, size_t size, const char *fmt_str, const u32 *bin_buf)h]j)}(hPint bstr_printf(char *buf, size_t size, const char *fmt_str, const u32 *bin_buf)h](j )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj hM ubj{)}(h bstr_printfh]j)}(h bstr_printfh]h bstr_printf}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj hM ubj)}(hA(char *buf, size_t size, const char *fmt_str, const u32 *bin_buf)h](j)}(h char *bufh](j )}(hcharh]hchar}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hbufh]hbuf}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj;!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8!ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj=!modnameN classnameNj] j` )}jc ]jf )}jY j sb c.bstr_printfasbuh1hhj4!ubj2)}(h h]h }(hj[!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4!ubj)}(hsizeh]hsize}(hji!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hconst char *fmt_strh](j)}(hjh]hconst}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~!ubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~!ubj )}(hcharh]hchar}(hj!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~!ubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~!ubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~!ubj)}(hfmt_strh]hfmt_str}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hconst u32 *bin_bufh](j)}(hjh]hconst}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!ubh)}(hhh]j)}(hu32h]hu32}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj!modnameN classnameNj] j` )}jc ]jW! c.bstr_printfasbuh1hhj!ubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!ubj)}(hjh]h*}(hj)"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(hbin_bufh]hbin_buf}(hj6"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhj hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hM ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hM hj hhubj)}(hhh]h)}(h>Format a string from binary arguments and place it in a bufferh]h>Format a string from binary arguments and place it in a buffer}(hj`"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj]"hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjx"jjx"jjjuh1jhhhhhNhNubj)}(hX**Parameters** ``char *buf`` The buffer to place the result into ``size_t size`` The size of the buffer, including the trailing null space ``const char *fmt_str`` The format string to use ``const u32 *bin_buf`` Binary arguments for the format string **Description** This function like C99 vsnprintf, but the difference is that vsnprintf gets arguments from stack, and bstr_printf gets arguments from **bin_buf** which is a binary buffer that generated by vbin_printf. The format follows C99 vsnprintf, but has some extensions: see vsnprintf comment for details. The return value is the number of characters which would be generated for the given input, excluding the trailing '\0', as per ISO C99. If you want to have the exact number of characters written into **buf** as return value (not including the trailing '\0'), use vscnprintf(). If the return is greater than or equal to **size**, the resulting string is truncated.h](h)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj|"ubj )}(hhh](j)}(h2``char *buf`` The buffer to place the result into h](j)}(h ``char *buf``h]j)}(hj"h]h char *buf}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj"ubj2)}(hhh]h)}(h#The buffer to place the result intoh]h#The buffer to place the result into}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hM hj"ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hM hj"ubj)}(hJ``size_t size`` The size of the buffer, including the trailing null space h](j)}(h``size_t size``h]j)}(hj"h]h size_t size}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj"ubj2)}(hhh]h)}(h9The size of the buffer, including the trailing null spaceh]h9The size of the buffer, including the trailing null space}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hM hj"ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hM hj"ubj)}(h1``const char *fmt_str`` The format string to use h](j)}(h``const char *fmt_str``h]j)}(hj#h]hconst char *fmt_str}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj #ubj2)}(hhh]h)}(hThe format string to useh]hThe format string to use}(hj,#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(#hM hj)#ubah}(h]h ]h"]h$]h&]uh1j1hj #ubeh}(h]h ]h"]h$]h&]uh1jhj(#hM hj"ubj)}(h>``const u32 *bin_buf`` Binary arguments for the format string h](j)}(h``const u32 *bin_buf``h]j)}(hjL#h]hconst u32 *bin_buf}(hjN#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ#ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjF#ubj2)}(hhh]h)}(h&Binary arguments for the format stringh]h&Binary arguments for the format string}(hje#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhja#hM hjb#ubah}(h]h ]h"]h$]h&]uh1j1hjF#ubeh}(h]h ]h"]h$]h&]uh1jhja#hM hj"ubeh}(h]h ]h"]h$]h&]uh1j hj|"ubh)}(h**Description**h]j)}(hj#h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj|"ubh)}(hThis function like C99 vsnprintf, but the difference is that vsnprintf gets arguments from stack, and bstr_printf gets arguments from **bin_buf** which is a binary buffer that generated by vbin_printf.h](hThis function like C99 vsnprintf, but the difference is that vsnprintf gets arguments from stack, and bstr_printf gets arguments from }(hj#hhhNhNubj)}(h **bin_buf**h]hbin_buf}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh8 which is a binary buffer that generated by vbin_printf.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj|"ubj )}(hhh]j)}(h^The format follows C99 vsnprintf, but has some extensions: see vsnprintf comment for details. h](j)}(h:The format follows C99 vsnprintf, but has some extensions:h]h:The format follows C99 vsnprintf, but has some extensions:}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj#ubj2)}(hhh]h)}(h"see vsnprintf comment for details.h]h"see vsnprintf comment for details.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hM hj#ubah}(h]h ]h"]h$]h&]uh1j1hj#ubeh}(h]h ]h"]h$]h&]uh1jhj#hM hj#ubah}(h]h ]h"]h$]h&]uh1j hj|"ubh)}(hXkThe return value is the number of characters which would be generated for the given input, excluding the trailing '\0', as per ISO C99. If you want to have the exact number of characters written into **buf** as return value (not including the trailing '\0'), use vscnprintf(). If the return is greater than or equal to **size**, the resulting string is truncated.h](hThe return value is the number of characters which would be generated for the given input, excluding the trailing ‘0’, as per ISO C99. If you want to have the exact number of characters written into }(hj#hhhNhNubj)}(h**buf**h]hbuf}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubht as return value (not including the trailing ‘0’), use vscnprintf(). If the return is greater than or equal to }(hj#hhhNhNubj)}(h**size**h]hsize}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh$, the resulting string is truncated.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj|"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j vsscanf (C function) c.vsscanfhNtauh1hhhhhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjF$hhhjX$hM} ubj{)}(hvsscanfh]j)}(hvsscanfh]hvsscanf}(hjk$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjg$ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjF$hhhjX$hM} ubj)}(h0(const char *buf, const char *fmt, va_list args)h](j)}(hconst char *bufh](j)}(hjh]hconst}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj )}(hcharh]hchar}(hj$hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(hjh]h*}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hbufh]hbuf}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj$ubj)}(hconst char *fmth](j)}(hjh]hconst}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj )}(hcharh]hchar}(hj$hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hj %hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hfmth]hfmt}(hj(%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj$ubj)}(h va_list argsh](h)}(hhh]j)}(hva_listh]hva_list}(hjD%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA%ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjF%modnameN classnameNj] j` )}jc ]jf )}jY jm$sb c.vsscanfasbuh1hhj=%ubj2)}(h h]h }(hjd%hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=%ubj)}(hargsh]hargs}(hjr%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=%ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj$ubeh}(h]h ]h"]h$]h&]jjuh1jhjF$hhhjX$hM} ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjB$hhhjX$hM} ubah}(h]j=$ah ](jjeh"]h$]h&]jj)jhuh1jhjX$hM} hj?$hhubj)}(hhh]h)}(h*Unformat a buffer into a list of argumentsh]h*Unformat a buffer into a list of arguments}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM} hj%hhubah}(h]h ]h"]h$]h&]uh1jhj?$hhhjX$hM} ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj%jj%jjjuh1jhhhhhNhNubj)}(hx**Parameters** ``const char *buf`` input buffer ``const char *fmt`` format of buffer ``va_list args`` argumentsh](h)}(h**Parameters**h]j)}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj%ubj )}(hhh](j)}(h!``const char *buf`` input buffer h](j)}(h``const char *buf``h]j)}(hj%h]hconst char *buf}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM~ hj%ubj2)}(hhh]h)}(h input bufferh]h input buffer}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hM~ hj%ubah}(h]h ]h"]h$]h&]uh1j1hj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hM~ hj%ubj)}(h%``const char *fmt`` format of buffer h](j)}(h``const char *fmt``h]j)}(hj&h]hconst char *fmt}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hj&ubj2)}(hhh]h)}(hformat of bufferh]hformat of buffer}(hj/&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+&hM hj,&ubah}(h]h ]h"]h$]h&]uh1j1hj&ubeh}(h]h ]h"]h$]h&]uh1jhj+&hM hj%ubj)}(h``va_list args`` argumentsh](j)}(h``va_list args``h]j)}(hjO&h]h va_list args}(hjQ&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM&ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hjI&ubj2)}(hhh]h)}(h argumentsh]h arguments}(hjh&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chM hje&ubah}(h]h ]h"]h$]h&]uh1j1hjI&ubeh}(h]h ]h"]h$]h&]uh1jhjd&hM hj%ubeh}(h]h ]h"]h$]h&]uh1j hj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j sscanf (C function)c.sscanfhNtauh1hhhhhhNhNubj)}(hhh](j)}(h2int sscanf (const char *buf, const char *fmt, ...)h]j)}(h1int sscanf(const char *buf, const char *fmt, ...)h](j )}(hinth]hint}(hj&hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chMubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&hhhj&hMubj{)}(hsscanfh]j)}(hsscanfh]hsscanf}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj&hhhj&hMubj)}(h'(const char *buf, const char *fmt, ...)h](j)}(hconst char *bufh](j)}(hjh]hconst}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj )}(hcharh]hchar}(hj'hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&ubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj)}(hjh]h*}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hbufh]hbuf}(hj*'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj&ubj)}(hconst char *fmth](j)}(hjh]hconst}(hjC'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?'ubj2)}(h h]h }(hjP'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?'ubj )}(hcharh]hchar}(hj^'hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj?'ubj2)}(h h]h }(hjl'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?'ubj)}(hjh]h*}(hjz'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?'ubj)}(hfmth]hfmt}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?'ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj&ubj)}(h...h]j)}(hjh]h...}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj&ubeh}(h]h ]h"]h$]h&]jjuh1jhj&hhhj&hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj&hhhj&hMubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1jhj&hMhj&hhubj)}(hhh]h)}(h*Unformat a buffer into a list of argumentsh]h*Unformat a buffer into a list of arguments}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chMhj'hhubah}(h]h ]h"]h$]h&]uh1jhj&hhhj&hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj'jj'jjjuh1jhhhhhNhNubj)}(h}**Parameters** ``const char *buf`` input buffer ``const char *fmt`` formatting of buffer ``...`` resulting argumentsh](h)}(h**Parameters**h]j)}(hj'h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chMhj'ubj )}(hhh](j)}(h!``const char *buf`` input buffer h](j)}(h``const char *buf``h]j)}(hj (h]hconst char *buf}(hj (hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chMhj(ubj2)}(hhh]h)}(h input bufferh]h input buffer}(hj#(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj (ubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhj(hMhj(ubj)}(h)``const char *fmt`` formatting of buffer h](j)}(h``const char *fmt``h]j)}(hjC(h]hconst char *fmt}(hjE(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA(ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chMhj=(ubj2)}(hhh]h)}(hformatting of bufferh]hformatting of buffer}(hj\(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjX(hMhjY(ubah}(h]h ]h"]h$]h&]uh1j1hj=(ubeh}(h]h ]h"]h$]h&]uh1jhjX(hMhj(ubj)}(h``...`` resulting argumentsh](j)}(h``...``h]j)}(hj|(h]h...}(hj~(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz(ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chMhjv(ubj2)}(hhh]h)}(hresulting argumentsh]hresulting arguments}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:18: ./lib/vsprintf.chMhj(ubah}(h]h ]h"]h$]h&]uh1j1hjv(ubeh}(h]h ]h"]h$]h&]uh1jhj(hMhj(ubeh}(h]h ]h"]h$]h&]uh1j hj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kstrtoul (C function) c.kstrtoulhNtauh1hhhhhhNhNubj)}(hhh](j)}(hCint kstrtoul (const char *s, unsigned int base, unsigned long *res)h]j)}(hBint kstrtoul(const char *s, unsigned int base, unsigned long *res)h](j )}(hinth]hint}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj(hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhKubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(hhhj(hKubj{)}(hkstrtoulh]j)}(hkstrtoulh]hkstrtoul}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj(hhhj(hKubj)}(h6(const char *s, unsigned int base, unsigned long *res)h](j)}(h const char *sh](j)}(hjh]hconst}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj )hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj )}(hcharh]hchar}(hj.)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj<)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(hjh]h*}(hjJ)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hsh]hs}(hjW)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj )ubj)}(hunsigned int baseh](j )}(hunsignedh]hunsigned}(hjp)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjl)ubj2)}(h h]h }(hj~)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjl)ubj )}(hinth]hint}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjl)ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjl)ubj)}(hbaseh]hbase}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj )ubj)}(hunsigned long *resh](j )}(hunsignedh]hunsigned}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj )}(hlongh]hlong}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hresh]hres}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj )ubeh}(h]h ]h"]h$]h&]jjuh1jhj(hhhj(hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj(hhhj(hKubah}(h]j(ah ](jjeh"]h$]h&]jj)jhuh1jhj(hKhj(hhubj)}(hhh]h)}(h$convert a string to an unsigned longh]h$convert a string to an unsigned long}(hj0*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhKhj-*hhubah}(h]h ]h"]h$]h&]uh1jhj(hhhj(hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjH*jjH*jjjuh1jhhhhhNhNubj)}(hXa**Parameters** ``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign. ``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. ``unsigned long *res`` Where to write the result of the conversion on success. **Description** Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoul(). Return code must be checked.h](h)}(h**Parameters**h]j)}(hjR*h]h Parameters}(hjT*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP*ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhKhjL*ubj )}(hhh](j)}(h``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign. h](j)}(h``const char *s``h]j)}(hjq*h]h const char *s}(hjs*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo*ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhKhjk*ubj2)}(hhh]h)}(hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign.h]hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhKhj*ubah}(h]h ]h"]h$]h&]uh1j1hjk*ubeh}(h]h ]h"]h$]h&]uh1jhj*hKhjh*ubj)}(hX``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. h](j)}(h``unsigned int base``h]j)}(hj*h]hunsigned int base}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhKhj*ubj2)}(hhh]h)}(hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.h]hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhKhj*ubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hKhjh*ubj)}(hO``unsigned long *res`` Where to write the result of the conversion on success. h](j)}(h``unsigned long *res``h]j)}(hj*h]hunsigned long *res}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhKhj*ubj2)}(hhh]h)}(h7Where to write the result of the conversion on success.h]h7Where to write the result of the conversion on success.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hKhj*ubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hKhjh*ubeh}(h]h ]h"]h$]h&]uh1j hjL*ubh)}(h**Description**h]j)}(hj +h]h Description}(hj"+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhKhjL*ubh)}(hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoul(). Return code must be checked.h]hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoul(). Return code must be checked.}(hj6+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhKhjL*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kstrtol (C function) c.kstrtolhNtauh1hhhhhhNhNubj)}(hhh](j)}(h9int kstrtol (const char *s, unsigned int base, long *res)h]j)}(h8int kstrtol(const char *s, unsigned int base, long *res)h](j )}(hinth]hint}(hje+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhja+hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhK,ubj2)}(h h]h }(hjt+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hja+hhhjs+hK,ubj{)}(hkstrtolh]j)}(hkstrtolh]hkstrtol}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhja+hhhjs+hK,ubj)}(h-(const char *s, unsigned int base, long *res)h](j)}(h const char *sh](j)}(hjh]hconst}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj )}(hcharh]hchar}(hj+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+ubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hjY)h]hs}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(hunsigned int baseh](j )}(hunsignedh]hunsigned}(hj+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+ubj2)}(h h]h }(hj ,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj )}(hinth]hint}(hj,hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+ubj2)}(h h]h }(hj(,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj)}(hbaseh]hbase}(hj6,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(h long *resh](j )}(hlongh]hlong}(hjO,hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjK,ubj2)}(h h]h }(hj],hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjK,ubj)}(hjh]h*}(hjk,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK,ubj)}(hresh]hres}(hjx,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubeh}(h]h ]h"]h$]h&]jjuh1jhja+hhhjs+hK,ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]+hhhjs+hK,ubah}(h]jX+ah ](jjeh"]h$]h&]jj)jhuh1jhjs+hK,hjZ+hhubj)}(hhh]h)}(hconvert a string to a longh]hconvert a string to a long}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhK,hj,hhubah}(h]h ]h"]h$]h&]uh1jhjZ+hhhjs+hK,ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj,jj,jjjuh1jhhhhhNhNubj)}(hXQ**Parameters** ``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign. ``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. ``long *res`` Where to write the result of the conversion on success. **Description** Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtol(). Return code must be checked.h](h)}(h**Parameters**h]j)}(hj,h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$] h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhK0hj,ubj )}(hhh](j)}(h``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign. h](j)}(h``const char *s``h]j)}(hj,h]h const char *s}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhK/hj,ubj2)}(hhh]h)}(hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign.h]hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhK-hj,ubah}(h]h ]h"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hK/hj,ubj)}(hX``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. h](j)}(h``unsigned int base``h]j)}(hj-h]hunsigned int base}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhK4hj-ubj2)}(hhh]h)}(hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.h]hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.}(hj6-hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhK0hj3-ubah}(h]h ]h"]h$]h&]uh1j1hj-ubeh}(h]h ]h"]h$]h&]uh1jhj2-hK4hj,ubj)}(hF``long *res`` Where to write the result of the conversion on success. h](j)}(h ``long *res``h]j)}(hjW-h]h long *res}(hjY-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU-ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhK5hjQ-ubj2)}(hhh]h)}(h7Where to write the result of the conversion on success.h]h7Where to write the result of the conversion on success.}(hjp-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjl-hK5hjm-ubah}(h]h ]h"]h$]h&]uh1j1hjQ-ubeh}(h]h ]h"]h$]h&]uh1jhjl-hK5hj,ubeh}(h]h ]h"]h$]h&]uh1j hj,ubh)}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhK7hj,ubh)}(hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtol(). Return code must be checked.h]hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtol(). Return code must be checked.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:21: ./include/linux/kstrtox.hhK6hj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kstrtoull (C function) c.kstrtoullhNtauh1hhhhhhNhNubj)}(hhh](j)}(hIint kstrtoull (const char *s, unsigned int base, unsigned long long *res)h]j)}(hHint kstrtoull(const char *s, unsigned int base, unsigned long long *res)h](j )}(hinth]hint}(hj-hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj-hhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chK|ubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-hhhj-hK|ubj{)}(h kstrtoullh]j)}(h kstrtoullh]h kstrtoull}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj-hhhj-hK|ubj)}(h;(const char *s, unsigned int base, unsigned long long *res)h](j)}(h const char *sh](j)}(hjh]hconst}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj!.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj )}(hcharh]hchar}(hj/.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj=.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hjh]h*}(hjK.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hjY)h]hs}(hjX.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj .ubj)}(hunsigned int baseh](j )}(hunsignedh]hunsigned}(hjp.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjl.ubj2)}(h h]h }(hj~.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjl.ubj )}(hinth]hint}(hj.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjl.ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjl.ubj)}(hbaseh]hbase}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj .ubj)}(hunsigned long long *resh](j )}(hunsignedh]hunsigned}(hj.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj )}(hlongh]hlong}(hj.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj )}(hlongh]hlong}(hj.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hjh]h*}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hresh]hres}(hj"/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj .ubeh}(h]h ]h"]h$]h&]jjuh1jhj-hhhj-hK|ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj-hhhj-hK|ubah}(h]j-ah ](jjeh"]h$]h&]jj)jhuh1jhj-hK|hj-hhubj)}(hhh]h)}(h)convert a string to an unsigned long longh]h)convert a string to an unsigned long long}(hjL/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chK|hjI/hhubah}(h]h ]h"]h$]h&]uh1jhj-hhhj-hK|ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjd/jjd/jjjuh1jhhhhhNhNubj)}(hXg**Parameters** ``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign. ``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. ``unsigned long long *res`` Where to write the result of the conversion on success. **Description** Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoull(). Return code must be checked.h](h)}(h**Parameters**h]j)}(hjn/h]h Parameters}(hjp/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl/ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhjh/ubj )}(hhh](j)}(h``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign. h](j)}(h``const char *s``h]j)}(hj/h]h const char *s}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj/ubj2)}(hhh]h)}(hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign.h]hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chK}hj/ubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhj/hKhj/ubj)}(hX``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. h](j)}(h``unsigned int base``h]j)}(hj/h]hunsigned int base}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj/ubj2)}(hhh]h)}(hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.h]hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj/ubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhj/hKhj/ubj)}(hT``unsigned long long *res`` Where to write the result of the conversion on success. h](j)}(h``unsigned long long *res``h]j)}(hj0h]hunsigned long long *res}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj/ubj2)}(hhh]h)}(h7Where to write the result of the conversion on success.h]h7Where to write the result of the conversion on success.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hKhj0ubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhj0hKhj/ubeh}(h]h ]h"]h$]h&]uh1j hjh/ubh)}(h**Description**h]j)}(hj<0h]h Description}(hj>0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:0ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhjh/ubh)}(hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoull(). Return code must be checked.h]hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoull(). Return code must be checked.}(hjR0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhjh/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kstrtoll (C function) c.kstrtollhNtauh1hhhhhhNhNubj)}(hhh](j)}(h?int kstrtoll (const char *s, unsigned int base, long long *res)h]j)}(h>int kstrtoll(const char *s, unsigned int base, long long *res)h](j )}(hinth]hint}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}0hhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}0hhhj0hKubj{)}(hkstrtollh]j)}(hkstrtollh]hkstrtoll}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj}0hhhj0hKubj)}(h2(const char *s, unsigned int base, long long *res)h](j)}(h const char *sh](j)}(hjh]hconst}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0ubj )}(hcharh]hchar}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj0ubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0ubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hjY)h]hs}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj0ubj)}(hunsigned int baseh](j )}(hunsignedh]hunsigned}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj1ubj2)}(h h]h }(hj(1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1ubj )}(hinth]hint}(hj61hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj1ubj2)}(h h]h }(hjD1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1ubj)}(hbaseh]hbase}(hjR1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj0ubj)}(hlong long *resh](j )}(hlongh]hlong}(hjk1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjg1ubj2)}(h h]h }(hjy1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjg1ubj )}(hlongh]hlong}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjg1ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjg1ubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjg1ubj)}(hresh]hres}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjg1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj0ubeh}(h]h ]h"]h$]h&]jjuh1jhj}0hhhj0hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjy0hhhj0hKubah}(h]jt0ah ](jjeh"]h$]h&]jj)jhuh1jhj0hKhjv0hhubj)}(hhh]h)}(hconvert a string to a long longh]hconvert a string to a long long}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj1hhubah}(h]h ]h"]h$]h&]uh1jhjv0hhhj0hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj1jj1jjjuh1jhhhhhNhNubj)}(hXW**Parameters** ``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign. ``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. ``long long *res`` Where to write the result of the conversion on success. **Description** Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoll(). Return code must be checked.h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj1ubj )}(hhh](j)}(h``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign. h](j)}(h``const char *s``h]j)}(hj2h]h const char *s}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj2ubj2)}(hhh]h)}(hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign.h]hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign.}(hj42hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj12ubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhj02hKhj2ubj)}(hX``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. h](j)}(h``unsigned int base``h]j)}(hjU2h]hunsigned int base}(hjW2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS2ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhjO2ubj2)}(hhh]h)}(hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.h]hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.}(hjn2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhjk2ubah}(h]h ]h"]h$]h&]uh1j1hjO2ubeh}(h]h ]h"]h$]h&]uh1jhjj2hKhj2ubj)}(hK``long long *res`` Where to write the result of the conversion on success. h](j)}(h``long long *res``h]j)}(hj2h]hlong long *res}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj2ubj2)}(hhh]h)}(h7Where to write the result of the conversion on success.h]h7Where to write the result of the conversion on success.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hKhj2ubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhj2hKhj2ubeh}(h]h ]h"]h$]h&]uh1j hj1ubh)}(h**Description**h]j)}(hj2h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj1ubh)}(hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoll(). Return code must be checked.h]hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoll(). Return code must be checked.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kstrtouint (C function) c.kstrtouinthNtauh1hhhhhhNhNubj)}(hhh](j)}(hDint kstrtouint (const char *s, unsigned int base, unsigned int *res)h]j)}(hCint kstrtouint(const char *s, unsigned int base, unsigned int *res)h](j )}(hinth]hint}(hj3hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj 3hhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj 3hhhj3hKubj{)}(h kstrtouinth]j)}(h kstrtouinth]h kstrtouint}(hj03hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,3ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj 3hhhj3hKubj)}(h5(const char *s, unsigned int base, unsigned int *res)h](j)}(h const char *sh](j)}(hjh]hconst}(hjL3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH3ubj2)}(h h]h }(hjY3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjH3ubj )}(hcharh]hchar}(hjg3hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjH3ubj2)}(h h]h }(hju3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjH3ubj)}(hjh]h*}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH3ubj)}(hjY)h]hs}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjD3ubj)}(hunsigned int baseh](j )}(hunsignedh]hunsigned}(hj3hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj3ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj )}(hinth]hint}(hj3hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj3ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj)}(hbaseh]hbase}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjD3ubj)}(hunsigned int *resh](j )}(hunsignedh]hunsigned}(hj3hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj3ubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj )}(hinth]hint}(hj4hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj3ubj2)}(h h]h }(hj#4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj)}(hjh]h*}(hj14hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj)}(hresh]hres}(hj>4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjD3ubeh}(h]h ]h"]h$]h&]jjuh1jhj 3hhhj3hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj3hhhj3hKubah}(h]j3ah ](jjeh"]h$]h&]jj)jhuh1jhj3hKhj3hhubj)}(hhh]h)}(h#convert a string to an unsigned inth]h#convert a string to an unsigned int}(hjh4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhje4hhubah}(h]h ]h"]h$]h&]uh1jhj3hhhj3hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4jj4jjjuh1jhhhhhNhNubj)}(hX`**Parameters** ``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign. ``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. ``unsigned int *res`` Where to write the result of the conversion on success. **Description** Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoul(). Return code must be checked.h](h)}(h**Parameters**h]j)}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj4ubj )}(hhh](j)}(h``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign. h](j)}(h``const char *s``h]j)}(hj4h]h const char *s}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj4ubj2)}(hhh]h)}(hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign.h]hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign, but not a minus sign.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj4ubah}(h]h ]h"]h$]h&]uh1j1hj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hKhj4ubj)}(hX``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. h](j)}(h``unsigned int base``h]j)}(hj4h]hunsigned int base}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj4ubj2)}(hhh]h)}(hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.h]hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj4ubah}(h]h ]h"]h$]h&]uh1j1hj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hKhj4ubj)}(hN``unsigned int *res`` Where to write the result of the conversion on success. h](j)}(h``unsigned int *res``h]j)}(hj5h]hunsigned int *res}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj5ubj2)}(hhh]h)}(h7Where to write the result of the conversion on success.h]h7Where to write the result of the conversion on success.}(hj65hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj25hKhj35ubah}(h]h ]h"]h$]h&]uh1j1hj5ubeh}(h]h ]h"]h$]h&]uh1jhj25hKhj4ubeh}(h]h ]h"]h$]h&]uh1j hj4ubh)}(h**Description**h]j)}(hjX5h]h Description}(hjZ5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV5ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj4ubh)}(hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoul(). Return code must be checked.h]hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtoul(). Return code must be checked.}(hjn5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kstrtoint (C function) c.kstrtointhNtauh1hhhhhhNhNubj)}(hhh](j)}(h:int kstrtoint (const char *s, unsigned int base, int *res)h]j)}(h9int kstrtoint(const char *s, unsigned int base, int *res)h](j )}(hinth]hint}(hj5hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5hhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5hhhj5hKubj{)}(h kstrtointh]j)}(h kstrtointh]h kstrtoint}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj5hhhj5hKubj)}(h,(const char *s, unsigned int base, int *res)h](j)}(h const char *sh](j)}(hjh]hconst}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj )}(hcharh]hchar}(hj5hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hjY)h]hs}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubj)}(hunsigned int baseh](j )}(hunsignedh]hunsigned}(hj66hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj26ubj2)}(h h]h }(hjD6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj26ubj )}(hinth]hint}(hjR6hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj26ubj2)}(h h]h }(hj`6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj26ubj)}(hbaseh]hbase}(hjn6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj26ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubj)}(hint *resh](j )}(hinth]hint}(hj6hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hresh]hres}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubeh}(h]h ]h"]h$]h&]jjuh1jhj5hhhj5hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj5hhhj5hKubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1jhj5hKhj5hhubj)}(hhh]h)}(hconvert a string to an inth]hconvert a string to an int}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj6hhubah}(h]h ]h"]h$]h&]uh1jhj5hhhj5hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj6jj6jjjuh1jhhhhhNhNubj)}(hXP**Parameters** ``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign. ``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. ``int *res`` Where to write the result of the conversion on success. **Description** Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtol(). Return code must be checked.h](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj6ubj )}(hhh](j)}(h``const char *s`` The start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign. h](j)}(h``const char *s``h]j)}(hj7h]h const char *s}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj7ubj2)}(hhh]h)}(hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign.h]hThe start of the string. The string must be null-terminated, and may also include a single newline before its terminating null. The first character may also be a plus sign or a minus sign.}(hj47hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhj17ubah}(h]h ]h"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]uh1jhj07hKhj7ubj)}(hX``unsigned int base`` The number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal. h](j)}(h``unsigned int base``h]j)}(hjU7h]hunsigned int base}(hjW7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS7ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chMhjO7ubj2)}(hhh]h)}(hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.h]hXkThe number base to use. The maximum supported base is 16. If base is given as 0, then the base of the string is automatically detected with the conventional semantics - If it begins with 0x the number will be parsed as a hexadecimal (case insensitive), if it otherwise begins with 0, it will be parsed as an octal number. Otherwise it will be parsed as a decimal.}(hjn7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chKhjk7ubah}(h]h ]h"]h$]h&]uh1j1hjO7ubeh}(h]h ]h"]h$]h&]uh1jhjj7hMhj7ubj)}(hE``int *res`` Where to write the result of the conversion on success. h](j)}(h ``int *res``h]j)}(hj7h]hint *res}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chMhj7ubj2)}(hhh]h)}(h7Where to write the result of the conversion on success.h]h7Where to write the result of the conversion on success.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMhj7ubah}(h]h ]h"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]uh1jhj7hMhj7ubeh}(h]h ]h"]h$]h&]uh1j hj6ubh)}(h**Description**h]j)}(hj7h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chMhj6ubh)}(hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtol(). Return code must be checked.h]hReturns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. Preferred over simple_strtol(). Return code must be checked.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chMhj6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kstrtobool (C function) c.kstrtoboolhNtauh1hhhhhhNhNubj)}(hhh](j)}(h)int kstrtobool (const char *s, bool *res)h]j)}(h(int kstrtobool(const char *s, bool *res)h](j )}(hinth]hint}(hj8hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj 8hhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chMZubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj 8hhhj8hMZubj{)}(h kstrtoboolh]j)}(h kstrtoboolh]h kstrtobool}(hj08hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,8ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj 8hhhj8hMZubj)}(h(const char *s, bool *res)h](j)}(h const char *sh](j)}(hjh]hconst}(hjL8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH8ubj2)}(h h]h }(hjY8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjH8ubj )}(hcharh]hchar}(hjg8hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjH8ubj2)}(h h]h }(hju8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjH8ubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH8ubj)}(hjY)h]hs}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjD8ubj)}(h bool *resh](j )}(hboolh]hbool}(hj8hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj8ubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hresh]hres}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjD8ubeh}(h]h ]h"]h$]h&]jjuh1jhj 8hhhj8hMZubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj8hhhj8hMZubah}(h]j8ah ](jjeh"]h$]h&]jj)jhuh1jhj8hMZhj8hhubj)}(hhh]h)}(h.convert common user inputs into boolean valuesh]h.convert common user inputs into boolean values}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chMZhj8hhubah}(h]h ]h"]h$]h&]uh1jhj8hhhj8hMZubeh}(h]h ](jfunctioneh"]h$]h&]jjjj9jj9jjjuh1jhhhhhNhNubj)}(hX#**Parameters** ``const char *s`` input string ``bool *res`` result **Description** This routine returns 0 iff the first character is one of 'EeYyTt1DdNnFf0', or [oO][NnFf] for "on" and "off". Otherwise it will return -EINVAL. Value pointed to by res is updated upon finding a match.h](h)}(h**Parameters**h]j)}(hj9h]h Parameters}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chM^hj9ubj )}(hhh](j)}(h``const char *s`` input string h](j)}(h``const char *s``h]j)}(hj<9h]h const char *s}(hj>9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:9ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chM[hj69ubj2)}(hhh]h)}(h input stringh]h input string}(hjU9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ9hM[hjR9ubah}(h]h ]h"]h$]h&]uh1j1hj69ubeh}(h]h ]h"]h$]h&]uh1jhjQ9hM[hj39ubj)}(h``bool *res`` result h](j)}(h ``bool *res``h]j)}(hju9h]h bool *res}(hjw9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs9ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chM\hjo9ubj2)}(hhh]h)}(hresulth]hresult}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hM\hj9ubah}(h]h ]h"]h$]h&]uh1j1hjo9ubeh}(h]h ]h"]h$]h&]uh1jhj9hM\hj39ubeh}(h]h ]h"]h$]h&]uh1j hj9ubh)}(h**Description**h]j)}(hj9h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chM^hj9ubh)}(hThis routine returns 0 iff the first character is one of 'EeYyTt1DdNnFf0', or [oO][NnFf] for "on" and "off". Otherwise it will return -EINVAL. Value pointed to by res is updated upon finding a match.h]hThis routine returns 0 iff the first character is one of ‘EeYyTt1DdNnFf0’, or [oO][NnFf] for “on” and “off”. Otherwise it will return -EINVAL. Value pointed to by res is updated upon finding a match.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:24: ./lib/kstrtox.chM]hj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j string_get_size (C function)c.string_get_sizehNtauh1hhhhhhNhNubj)}(hhh](j)}(hdint string_get_size (u64 size, u64 blk_size, const enum string_size_units units, char *buf, int len)h]j)}(hcint string_get_size(u64 size, u64 blk_size, const enum string_size_units units, char *buf, int len)h](j )}(hinth]hint}(hj9hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj9hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9hhhj:hKubj{)}(hstring_get_sizeh]j)}(hstring_get_sizeh]hstring_get_size}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj9hhhj:hKubj)}(hP(u64 size, u64 blk_size, const enum string_size_units units, char *buf, int len)h](j)}(hu64 sizeh](h)}(hhh]j)}(hu64h]hu64}(hj5:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2:ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7:modnameN classnameNj] j` )}jc ]jf )}jY j:sbc.string_get_sizeasbuh1hhj.:ubj2)}(h h]h }(hjU:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.:ubj)}(hsizeh]hsize}(hjc:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*:ubj)}(h u64 blk_sizeh](h)}(hhh]j)}(hu64h]hu64}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|:ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj:modnameN classnameNj] j` )}jc ]jQ:c.string_get_sizeasbuh1hhjx:ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjx:ubj)}(hblk_sizeh]hblk_size}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*:ubj)}(h"const enum string_size_units unitsh](j)}(hjh]hconst}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(henumh]henum}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubh)}(hhh]j)}(hstring_size_unitsh]hstring_size_units}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj;modnameN classnameNj] j` )}jc ]jQ:c.string_get_sizeasbuh1hhj:ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(hunitsh]hunits}(hj*;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*:ubj)}(h char *bufh](j )}(hcharh]hchar}(hjC;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj?;ubj2)}(h h]h }(hjQ;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?;ubj)}(hjh]h*}(hj_;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?;ubj)}(hbufh]hbuf}(hjl;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?;ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*:ubj)}(hint lenh](j )}(hinth]hint}(hj;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj;ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;ubj)}(hlenh]hlen}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*:ubeh}(h]h ]h"]h$]h&]jjuh1jhj9hhhj:hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj9hhhj:hKubah}(h]j9ah ](jjeh"]h$]h&]jj)jhuh1jhj:hKhj9hhubj)}(hhh]h)}(h#get the size in the specified unitsh]h#get the size in the specified units}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj;hhubah}(h]h ]h"]h$]h&]uh1jhj9hhhj:hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj;jj;jjjuh1jhhhhhNhNubj)}(hX**Parameters** ``u64 size`` The size to be converted in blocks ``u64 blk_size`` Size of the block (use 1 for size in bytes) ``const enum string_size_units units`` Units to use (powers of 1000 or 1024), whether to include space separator ``char *buf`` buffer to format to ``int len`` length of buffer **Description** This function returns a string formatted to 3 significant figures giving the size in the required units. **buf** should have room for at least 9 bytes and will always be zero terminated. Return value: number of characters of output that would have been written (which may be greater than len, if output was truncated).h](h)}(h**Parameters**h]j)}(hj;h]h Parameters}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj;ubj )}(hhh](j)}(h0``u64 size`` The size to be converted in blocks h](j)}(h ``u64 size``h]j)}(hj <h]hu64 size}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj <ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj<ubj2)}(hhh]h)}(h"The size to be converted in blocksh]h"The size to be converted in blocks}(hj%<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!<hKhj"<ubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhj!<hKhj<ubj)}(h=``u64 blk_size`` Size of the block (use 1 for size in bytes) h](j)}(h``u64 blk_size``h]j)}(hjE<h]h u64 blk_size}(hjG<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC<ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj?<ubj2)}(hhh]h)}(h+Size of the block (use 1 for size in bytes)h]h+Size of the block (use 1 for size in bytes)}(hj^<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZ<hKhj[<ubah}(h]h ]h"]h$]h&]uh1j1hj?<ubeh}(h]h ]h"]h$]h&]uh1jhjZ<hKhj<ubj)}(hq``const enum string_size_units units`` Units to use (powers of 1000 or 1024), whether to include space separator h](j)}(h&``const enum string_size_units units``h]j)}(hj~<h]h"const enum string_size_units units}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|<ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhjx<ubj2)}(hhh]h)}(hIUnits to use (powers of 1000 or 1024), whether to include space separatorh]hIUnits to use (powers of 1000 or 1024), whether to include space separator}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hKhj<ubah}(h]h ]h"]h$]h&]uh1j1hjx<ubeh}(h]h ]h"]h$]h&]uh1jhj<hKhj<ubj)}(h"``char *buf`` buffer to format to h](j)}(h ``char *buf``h]j)}(hj<h]h char *buf}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj<ubj2)}(hhh]h)}(hbuffer to format toh]hbuffer to format to}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hKhj<ubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhj<hKhj<ubj)}(h``int len`` length of buffer h](j)}(h ``int len``h]j)}(hj<h]hint len}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj<ubj2)}(hhh]h)}(hlength of bufferh]hlength of buffer}(hj =hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj=ubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhj=hKhj<ubeh}(h]h ]h"]h$]h&]uh1j hj;ubh)}(h**Description**h]j)}(hj+=h]h Description}(hj-=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)=ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chK!hj;ubh)}(hThis function returns a string formatted to 3 significant figures giving the size in the required units. **buf** should have room for at least 9 bytes and will always be zero terminated.h](hjThis function returns a string formatted to 3 significant figures giving the size in the required units. }(hjA=hhhNhNubj)}(h**buf**h]hbuf}(hjI=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA=ubhJ should have room for at least 9 bytes and will always be zero terminated.}(hjA=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chK hj;ubh)}(hReturn value: number of characters of output that would have been written (which may be greater than len, if output was truncated).h]hReturn value: number of characters of output that would have been written (which may be greater than len, if output was truncated).}(hjb=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chK$hj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !parse_int_array_user (C function)c.parse_int_array_userhNtauh1hhhhhhNhNubj)}(hhh](j)}(hMint parse_int_array_user (const char __user *from, size_t count, int **array)h]j)}(hLint parse_int_array_user(const char __user *from, size_t count, int **array)h](j )}(hinth]hint}(hj=hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj=hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=hhhj=hKubj{)}(hparse_int_array_userh]j)}(hparse_int_array_userh]hparse_int_array_user}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj=hhhj=hKubj)}(h4(const char __user *from, size_t count, int **array)h](j)}(hconst char __user *fromh](j)}(hjh]hconst}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=ubj )}(hcharh]hchar}(hj=hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj=ubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=ubh__user}(hj=hhhNhNubj2)}(h h]h }(hj >hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=ubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(hfromh]hfrom}(hj$>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hj@>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=>ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjB>modnameN classnameNj] j` )}jc ]jf )}jY j=sbc.parse_int_array_userasbuh1hhj9>ubj2)}(h h]h }(hj`>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9>ubj)}(hcounth]hcount}(hjn>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(h int **arrayh](j )}(hinth]hint}(hj>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(harrayh]harray}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubeh}(h]h ]h"]h$]h&]jjuh1jhj=hhhj=hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj=hhhj=hKubah}(h]j=ah ](jjeh"]h$]h&]jj)jhuh1jhj=hKhj=hhubj)}(hhh]h)}(h(Split string into a sequence of integersh]h(Split string into a sequence of integers}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj>hhubah}(h]h ]h"]h$]h&]uh1jhj=hhhj=hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj>jj>jjjuh1jhhhhhNhNubj)}(hX**Parameters** ``const char __user *from`` The user space buffer to read from ``size_t count`` The maximum number of bytes to read ``int **array`` Returned pointer to sequence of integers **Description** On success **array** is allocated and initialized with a sequence of integers extracted from the **from** plus an additional element that begins the sequence and specifies the integers count. Caller takes responsibility for freeing **array** when it is no longer needed.h](h)}(h**Parameters**h]j)}(hj ?h]h Parameters}(hj ?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj?ubj )}(hhh](j)}(h?``const char __user *from`` The user space buffer to read from h](j)}(h``const char __user *from``h]j)}(hj(?h]hconst char __user *from}(hj*?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&?ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj"?ubj2)}(hhh]h)}(h"The user space buffer to read fromh]h"The user space buffer to read from}(hjA?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=?hKhj>?ubah}(h]h ]h"]h$]h&]uh1j1hj"?ubeh}(h]h ]h"]h$]h&]uh1jhj=?hKhj?ubj)}(h5``size_t count`` The maximum number of bytes to read h](j)}(h``size_t count``h]j)}(hja?h]h size_t count}(hjc?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_?ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj[?ubj2)}(hhh]h)}(h#The maximum number of bytes to readh]h#The maximum number of bytes to read}(hjz?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjv?hKhjw?ubah}(h]h ]h"]h$]h&]uh1j1hj[?ubeh}(h]h ]h"]h$]h&]uh1jhjv?hKhj?ubj)}(h9``int **array`` Returned pointer to sequence of integers h](j)}(h``int **array``h]j)}(hj?h]h int **array}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj?ubj2)}(hhh]h)}(h(Returned pointer to sequence of integersh]h(Returned pointer to sequence of integers}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hKhj?ubah}(h]h ]h"]h$]h&]uh1j1hj?ubeh}(h]h ]h"]h$]h&]uh1jhj?hKhj?ubeh}(h]h ]h"]h$]h&]uh1j hj?ubh)}(h**Description**h]j)}(hj?h]h Description}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj?ubh)}(hOn success **array** is allocated and initialized with a sequence of integers extracted from the **from** plus an additional element that begins the sequence and specifies the integers count.h](h On success }(hj?hhhNhNubj)}(h **array**h]harray}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubhM is allocated and initialized with a sequence of integers extracted from the }(hj?hhhNhNubj)}(h**from**h]hfrom}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubhV plus an additional element that begins the sequence and specifies the integers count.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj?ubh)}(hNCaller takes responsibility for freeing **array** when it is no longer needed.h](h(Caller takes responsibility for freeing }(hj@hhhNhNubj)}(h **array**h]harray}(hj&@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubh when it is no longer needed.}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chKhj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j string_unescape (C function)c.string_unescapehNtauh1hhhhhhNhNubj)}(hhh](j)}(hKint string_unescape (char *src, char *dst, size_t size, unsigned int flags)h]j)}(hJint string_unescape(char *src, char *dst, size_t size, unsigned int flags)h](j )}(hinth]hint}(hj_@hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[@hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMubj2)}(h h]h }(hjn@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[@hhhjm@hMubj{)}(hstring_unescapeh]j)}(hstring_unescapeh]hstring_unescape}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|@ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj[@hhhjm@hMubj)}(h7(char *src, char *dst, size_t size, unsigned int flags)h](j)}(h char *srch](j )}(hcharh]hchar}(hj@hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj@ubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@ubj)}(hjh]h*}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hsrch]hsrc}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@ubj)}(h char *dsth](j )}(hcharh]hchar}(hj@hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj@ubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@ubj)}(hjh]h*}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hdsth]hdst}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@ubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj#AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Aubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj%AmodnameN classnameNj] j` )}jc ]jf )}jY j@sbc.string_unescapeasbuh1hhjAubj2)}(h h]h }(hjCAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubj)}(hsizeh]hsize}(hjQAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@ubj)}(hunsigned int flagsh](j )}(hunsignedh]hunsigned}(hjjAhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfAubj2)}(h h]h }(hjxAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfAubj )}(hinth]hint}(hjAhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfAubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfAubj)}(hflagsh]hflags}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@ubeh}(h]h ]h"]h$]h&]jjuh1jhj[@hhhjm@hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjW@hhhjm@hMubah}(h]jR@ah ](jjeh"]h$]h&]jj)jhuh1jhjm@hMhjT@hhubj)}(hhh]h)}(h&unquote characters in the given stringh]h&unquote characters in the given string}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjAhhubah}(h]h ]h"]h$]h&]uh1jhjT@hhhjm@hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjAjjAjjjuh1jhhhhhNhNubj)}(hX**Parameters** ``char *src`` source buffer (escaped) ``char *dst`` destination buffer (unescaped) ``size_t size`` size of the destination buffer (0 to unlimit) ``unsigned int flags`` combination of the flags. **Description** The function unquotes characters in the given string. Because the size of the output will be the same as or less than the size of the input, the transformation may be performed in place. Caller must provide valid source and destination pointers. Be aware that destination buffer will always be NULL-terminated. Source string must be NULL-terminated as well. The supported flags are:: UNESCAPE_SPACE: '\f' - form feed '\n' - new line '\r' - carriage return '\t' - horizontal tab '\v' - vertical tab UNESCAPE_OCTAL: '\NNN' - byte with octal value NNN (1 to 3 digits) UNESCAPE_HEX: '\xHH' - byte with hexadecimal value HH (1 to 2 digits) UNESCAPE_SPECIAL: '\"' - double quote '\\' - backslash '\a' - alert (BEL) '\e' - escape UNESCAPE_ANY: all previous together **Return** The amount of the characters processed to the destination buffer excluding trailing '\0' is returned.h](h)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM"hjAubj )}(hhh](j)}(h&``char *src`` source buffer (escaped) h](j)}(h ``char *src``h]j)}(hj Bh]h char *src}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Bubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjBubj2)}(hhh]h)}(hsource buffer (escaped)h]hsource buffer (escaped)}(hj&BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"BhMhj#Bubah}(h]h ]h"]h$]h&]uh1j1hjBubeh}(h]h ]h"]h$]h&]uh1jhj"BhMhjBubj)}(h-``char *dst`` destination buffer (unescaped) h](j)}(h ``char *dst``h]j)}(hjFBh]h char *dst}(hjHBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDBubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM hj@Bubj2)}(hhh]h)}(hdestination buffer (unescaped)h]hdestination buffer (unescaped)}(hj_BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[BhM hj\Bubah}(h]h ]h"]h$]h&]uh1j1hj@Bubeh}(h]h ]h"]h$]h&]uh1jhj[BhM hjBubj)}(h>``size_t size`` size of the destination buffer (0 to unlimit) h](j)}(h``size_t size``h]j)}(hjBh]h size_t size}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}Bubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM!hjyBubj2)}(hhh]h)}(h-size of the destination buffer (0 to unlimit)h]h-size of the destination buffer (0 to unlimit)}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhM!hjBubah}(h]h ]h"]h$]h&]uh1j1hjyBubeh}(h]h ]h"]h$]h&]uh1jhjBhM!hjBubj)}(h1``unsigned int flags`` combination of the flags. h](j)}(h``unsigned int flags``h]j)}(hjBh]hunsigned int flags}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM"hjBubj2)}(hhh]h)}(hcombination of the flags.h]hcombination of the flags.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhM"hjBubah}(h]h ]h"]h$]h&]uh1j1hjBubeh}(h]h ]h"]h$]h&]uh1jhjBhM"hjBubeh}(h]h ]h"]h$]h&]uh1j hjAubh)}(h**Description**h]j)}(hjBh]h Description}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM$hjAubh)}(h5The function unquotes characters in the given string.h]h5The function unquotes characters in the given string.}(hj ChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM$hjAubh)}(hBecause the size of the output will be the same as or less than the size of the input, the transformation may be performed in place.h]hBecause the size of the output will be the same as or less than the size of the input, the transformation may be performed in place.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM&hjAubh)}(hCaller must provide valid source and destination pointers. Be aware that destination buffer will always be NULL-terminated. Source string must be NULL-terminated as well. The supported flags are::h]hCaller must provide valid source and destination pointers. Be aware that destination buffer will always be NULL-terminated. Source string must be NULL-terminated as well. The supported flags are:}(hj'ChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM)hjAubh literal_block)}(hXUNESCAPE_SPACE: '\f' - form feed '\n' - new line '\r' - carriage return '\t' - horizontal tab '\v' - vertical tab UNESCAPE_OCTAL: '\NNN' - byte with octal value NNN (1 to 3 digits) UNESCAPE_HEX: '\xHH' - byte with hexadecimal value HH (1 to 2 digits) UNESCAPE_SPECIAL: '\"' - double quote '\\' - backslash '\a' - alert (BEL) '\e' - escape UNESCAPE_ANY: all previous togetherh]hXUNESCAPE_SPACE: '\f' - form feed '\n' - new line '\r' - carriage return '\t' - horizontal tab '\v' - vertical tab UNESCAPE_OCTAL: '\NNN' - byte with octal value NNN (1 to 3 digits) UNESCAPE_HEX: '\xHH' - byte with hexadecimal value HH (1 to 2 digits) UNESCAPE_SPECIAL: '\"' - double quote '\\' - backslash '\a' - alert (BEL) '\e' - escape UNESCAPE_ANY: all previous together}hj8Csbah}(h]h ]h"]h$]h&]jjuh1j6ChX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM-hjAubh)}(h **Return**h]j)}(hjICh]hReturn}(hjKChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGCubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM?hjAubh)}(heThe amount of the characters processed to the destination buffer excluding trailing '\0' is returned.h]hiThe amount of the characters processed to the destination buffer excluding trailing ‘0’ is returned.}(hj_ChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM@hjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j string_escape_mem (C function)c.string_escape_memhNtauh1hhhhhhNhNubj)}(hhh](j)}(hpint string_escape_mem (const char *src, size_t isz, char *dst, size_t osz, unsigned int flags, const char *only)h]j)}(hoint string_escape_mem(const char *src, size_t isz, char *dst, size_t osz, unsigned int flags, const char *only)h](j )}(hinth]hint}(hjChhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjChhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjChhhjChMubj{)}(hstring_escape_memh]j)}(hstring_escape_memh]hstring_escape_mem}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjChhhjChMubj)}(hZ(const char *src, size_t isz, char *dst, size_t osz, unsigned int flags, const char *only)h](j)}(hconst char *srch](j)}(hjh]hconst}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubj )}(hcharh]hchar}(hjChhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjCubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubj)}(hjh]h*}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hsrch]hsrc}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubj)}(h size_t iszh](h)}(hhh]j)}(hsize_th]hsize_t}(hj+DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(Dubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj-DmodnameN classnameNj] j` )}jc ]jf )}jY jCsbc.string_escape_memasbuh1hhj$Dubj2)}(h h]h }(hjKDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$Dubj)}(hiszh]hisz}(hjYDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$Dubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubj)}(h char *dsth](j )}(hcharh]hchar}(hjrDhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnDubj2)}(h h]h }(hjDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnDubj)}(hjh]h*}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnDubj)}(hdsth]hdst}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnDubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubj)}(h size_t oszh](h)}(hhh]j)}(hsize_th]hsize_t}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjDmodnameN classnameNj] j` )}jc ]jGDc.string_escape_memasbuh1hhjDubj2)}(h h]h }(hjDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDubj)}(hoszh]hosz}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubj)}(hunsigned int flagsh](j )}(hunsignedh]hunsigned}(hjDhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjDubj2)}(h h]h }(hj EhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDubj )}(hinth]hint}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjDubj2)}(h h]h }(hj&EhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDubj)}(hflagsh]hflags}(hj4EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubj)}(hconst char *onlyh](j)}(hjh]hconst}(hjMEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIEubj2)}(h h]h }(hjZEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIEubj )}(hcharh]hchar}(hjhEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjIEubj2)}(h h]h }(hjvEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIEubj)}(hjh]h*}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIEubj)}(honlyh]honly}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIEubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubeh}(h]h ]h"]h$]h&]jjuh1jhjChhhjChMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjChhhjChMubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1jhjChMhjChhubj)}(hhh]h)}(h+quote characters in the given memory bufferh]h+quote characters in the given memory buffer}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjEhhubah}(h]h ]h"]h$]h&]uh1jhjChhhjChMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjEjjEjjjuh1jhhhhhNhNubj)}(hX **Parameters** ``const char *src`` source buffer (unescaped) ``size_t isz`` source buffer size ``char *dst`` destination buffer (escaped) ``size_t osz`` destination buffer size ``unsigned int flags`` combination of the flags ``const char *only`` NULL-terminated string containing characters used to limit the selected escape class. If characters are included in **only** that would not normally be escaped by the classes selected in **flags**, they will be copied to **dst** unescaped. **Description** The process of escaping byte buffer includes several parts. They are applied in the following sequence. 1. The character is not matched to the one from **only** string and thus must go as-is to the output. 2. The character is matched to the printable and ASCII classes, if asked, and in case of match it passes through to the output. 3. The character is matched to the printable or ASCII class, if asked, and in case of match it passes through to the output. 4. The character is checked if it falls into the class given by **flags**. ``ESCAPE_OCTAL`` and ``ESCAPE_HEX`` are going last since they cover any character. Note that they actually can't go together, otherwise ``ESCAPE_HEX`` will be ignored. Caller must provide valid source and destination pointers. Be aware that destination buffer will not be NULL-terminated, thus caller have to append it if needs. The supported flags are:: %ESCAPE_SPACE: (special white space, not space itself) '\f' - form feed '\n' - new line '\r' - carriage return '\t' - horizontal tab '\v' - vertical tab %ESCAPE_SPECIAL: '\"' - double quote '\\' - backslash '\a' - alert (BEL) '\e' - escape %ESCAPE_NULL: '\0' - null %ESCAPE_OCTAL: '\NNN' - byte with octal value NNN (3 digits) %ESCAPE_ANY: all previous together %ESCAPE_NP: escape only non-printable characters, checked by isprint() %ESCAPE_ANY_NP: all previous together %ESCAPE_HEX: '\xHH' - byte with hexadecimal value HH (2 digits) %ESCAPE_NA: escape only non-ascii characters, checked by isascii() %ESCAPE_NAP: escape only non-printable or non-ascii characters %ESCAPE_APPEND: append characters from @only to be escaped by the given classes ``ESCAPE_APPEND`` would help to pass additional characters to the escaped, when one of ``ESCAPE_NP``, ``ESCAPE_NA``, or ``ESCAPE_NAP`` is provided. One notable caveat, the ``ESCAPE_NAP``, ``ESCAPE_NP`` and ``ESCAPE_NA`` have the higher priority than the rest of the flags (``ESCAPE_NAP`` is the highest). It doesn't make much sense to use either of them without ``ESCAPE_OCTAL`` or ``ESCAPE_HEX``, because they cover most of the other character classes. ``ESCAPE_NAP`` can utilize ``ESCAPE_SPACE`` or ``ESCAPE_SPECIAL`` in addition to the above. **Return** The total size of the escaped output that would be generated for the given input and flags. To check whether the output was truncated, compare the return value to osz. There is room left in dst for a '\0' terminator if and only if ret < osz.h](h)}(h**Parameters**h]j)}(hjEh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjEubj )}(hhh](j)}(h.``const char *src`` source buffer (unescaped) h](j)}(h``const char *src``h]j)}(hjEh]hconst char *src}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjEubj2)}(hhh]h)}(hsource buffer (unescaped)h]hsource buffer (unescaped)}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMhjFubah}(h]h ]h"]h$]h&]uh1j1hjEubeh}(h]h ]h"]h$]h&]uh1jhjFhMhjEubj)}(h"``size_t isz`` source buffer size h](j)}(h``size_t isz``h]j)}(hj5Fh]h size_t isz}(hj7FhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3Fubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj/Fubj2)}(hhh]h)}(hsource buffer sizeh]hsource buffer size}(hjNFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJFhMhjKFubah}(h]h ]h"]h$]h&]uh1j1hj/Fubeh}(h]h ]h"]h$]h&]uh1jhjJFhMhjEubj)}(h+``char *dst`` destination buffer (escaped) h](j)}(h ``char *dst``h]j)}(hjnFh]h char *dst}(hjpFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlFubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjhFubj2)}(hhh]h)}(hdestination buffer (escaped)h]hdestination buffer (escaped)}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMhjFubah}(h]h ]h"]h$]h&]uh1j1hjhFubeh}(h]h ]h"]h$]h&]uh1jhjFhMhjEubj)}(h'``size_t osz`` destination buffer size h](j)}(h``size_t osz``h]j)}(hjFh]h size_t osz}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjFubj2)}(hhh]h)}(hdestination buffer sizeh]hdestination buffer size}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMhjFubah}(h]h ]h"]h$]h&]uh1j1hjFubeh}(h]h ]h"]h$]h&]uh1jhjFhMhjEubj)}(h0``unsigned int flags`` combination of the flags h](j)}(h``unsigned int flags``h]j)}(hjFh]hunsigned int flags}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjFubj2)}(hhh]h)}(hcombination of the flagsh]hcombination of the flags}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMhjFubah}(h]h ]h"]h$]h&]uh1j1hjFubeh}(h]h ]h"]h$]h&]uh1jhjFhMhjEubj)}(hX``const char *only`` NULL-terminated string containing characters used to limit the selected escape class. If characters are included in **only** that would not normally be escaped by the classes selected in **flags**, they will be copied to **dst** unescaped. h](j)}(h``const char *only``h]j)}(hjGh]hconst char *only}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjGubj2)}(hhh]h)}(hNULL-terminated string containing characters used to limit the selected escape class. If characters are included in **only** that would not normally be escaped by the classes selected in **flags**, they will be copied to **dst** unescaped.h](htNULL-terminated string containing characters used to limit the selected escape class. If characters are included in }(hj2GhhhNhNubj)}(h**only**h]honly}(hj:GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2Gubh? that would not normally be escaped by the classes selected in }(hj2GhhhNhNubj)}(h **flags**h]hflags}(hjLGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2Gubh, they will be copied to }(hj2GhhhNhNubj)}(h**dst**h]hdst}(hj^GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2Gubh unescaped.}(hj2GhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj/Gubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhj.GhMhjEubeh}(h]h ]h"]h$]h&]uh1j hjEubh)}(h**Description**h]j)}(hjGh]h Description}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjEubh)}(hgThe process of escaping byte buffer includes several parts. They are applied in the following sequence.h]hgThe process of escaping byte buffer includes several parts. They are applied in the following sequence.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjEubj)}(hXh1. The character is not matched to the one from **only** string and thus must go as-is to the output. 2. The character is matched to the printable and ASCII classes, if asked, and in case of match it passes through to the output. 3. The character is matched to the printable or ASCII class, if asked, and in case of match it passes through to the output. 4. The character is checked if it falls into the class given by **flags**. ``ESCAPE_OCTAL`` and ``ESCAPE_HEX`` are going last since they cover any character. Note that they actually can't go together, otherwise ``ESCAPE_HEX`` will be ignored. h]henumerated_list)}(hhh](j)}(hbThe character is not matched to the one from **only** string and thus must go as-is to the output.h]h)}(hbThe character is not matched to the one from **only** string and thus must go as-is to the output.h](h-The character is not matched to the one from }(hjGhhhNhNubj)}(h**only**h]honly}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubh- string and thus must go as-is to the output.}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjGubah}(h]h ]h"]h$]h&]uh1jhjGubj)}(h|The character is matched to the printable and ASCII classes, if asked, and in case of match it passes through to the output.h]h)}(h|The character is matched to the printable and ASCII classes, if asked, and in case of match it passes through to the output.h]h|The character is matched to the printable and ASCII classes, if asked, and in case of match it passes through to the output.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjGubah}(h]h ]h"]h$]h&]uh1jhjGubj)}(hyThe character is matched to the printable or ASCII class, if asked, and in case of match it passes through to the output.h]h)}(hyThe character is matched to the printable or ASCII class, if asked, and in case of match it passes through to the output.h]hyThe character is matched to the printable or ASCII class, if asked, and in case of match it passes through to the output.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjGubah}(h]h ]h"]h$]h&]uh1jhjGubj)}(hThe character is checked if it falls into the class given by **flags**. ``ESCAPE_OCTAL`` and ``ESCAPE_HEX`` are going last since they cover any character. Note that they actually can't go together, otherwise ``ESCAPE_HEX`` will be ignored. h]h)}(hThe character is checked if it falls into the class given by **flags**. ``ESCAPE_OCTAL`` and ``ESCAPE_HEX`` are going last since they cover any character. Note that they actually can't go together, otherwise ``ESCAPE_HEX`` will be ignored.h](h=The character is checked if it falls into the class given by }(hjHhhhNhNubj)}(h **flags**h]hflags}(hj"HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh. }(hjHhhhNhNubj)}(h``ESCAPE_OCTAL``h]h ESCAPE_OCTAL}(hj4HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh and }(hjHhhhNhNubj)}(h``ESCAPE_HEX``h]h ESCAPE_HEX}(hjFHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubhg are going last since they cover any character. Note that they actually can’t go together, otherwise }(hjHhhhNhNubj)}(h``ESCAPE_HEX``h]h ESCAPE_HEX}(hjXHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh will be ignored.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM hjHubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jGhjGubah}(h]h ]h"]h$]h&]uh1jhjGhMhjEubh)}(hCaller must provide valid source and destination pointers. Be aware that destination buffer will not be NULL-terminated, thus caller have to append it if needs. The supported flags are::h]hCaller must provide valid source and destination pointers. Be aware that destination buffer will not be NULL-terminated, thus caller have to append it if needs. The supported flags are:}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjEubj7C)}(hXx%ESCAPE_SPACE: (special white space, not space itself) '\f' - form feed '\n' - new line '\r' - carriage return '\t' - horizontal tab '\v' - vertical tab %ESCAPE_SPECIAL: '\"' - double quote '\\' - backslash '\a' - alert (BEL) '\e' - escape %ESCAPE_NULL: '\0' - null %ESCAPE_OCTAL: '\NNN' - byte with octal value NNN (3 digits) %ESCAPE_ANY: all previous together %ESCAPE_NP: escape only non-printable characters, checked by isprint() %ESCAPE_ANY_NP: all previous together %ESCAPE_HEX: '\xHH' - byte with hexadecimal value HH (2 digits) %ESCAPE_NA: escape only non-ascii characters, checked by isascii() %ESCAPE_NAP: escape only non-printable or non-ascii characters %ESCAPE_APPEND: append characters from @only to be escaped by the given classesh]hXx%ESCAPE_SPACE: (special white space, not space itself) '\f' - form feed '\n' - new line '\r' - carriage return '\t' - horizontal tab '\v' - vertical tab %ESCAPE_SPECIAL: '\"' - double quote '\\' - backslash '\a' - alert (BEL) '\e' - escape %ESCAPE_NULL: '\0' - null %ESCAPE_OCTAL: '\NNN' - byte with octal value NNN (3 digits) %ESCAPE_ANY: all previous together %ESCAPE_NP: escape only non-printable characters, checked by isprint() %ESCAPE_ANY_NP: all previous together %ESCAPE_HEX: '\xHH' - byte with hexadecimal value HH (2 digits) %ESCAPE_NA: escape only non-ascii characters, checked by isascii() %ESCAPE_NAP: escape only non-printable or non-ascii characters %ESCAPE_APPEND: append characters from @only to be escaped by the given classes}hjHsbah}(h]h ]h"]h$]h&]jjuh1j6ChX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjEubh)}(h``ESCAPE_APPEND`` would help to pass additional characters to the escaped, when one of ``ESCAPE_NP``, ``ESCAPE_NA``, or ``ESCAPE_NAP`` is provided.h](j)}(h``ESCAPE_APPEND``h]h ESCAPE_APPEND}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubhF would help to pass additional characters to the escaped, when one of }(hjHhhhNhNubj)}(h ``ESCAPE_NP``h]h ESCAPE_NP}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh, }(hjHhhhNhNubj)}(h ``ESCAPE_NA``h]h ESCAPE_NA}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh, or }(hjHhhhNhNubj)}(h``ESCAPE_NAP``h]h ESCAPE_NAP}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh is provided.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM1hjEubh)}(hXOne notable caveat, the ``ESCAPE_NAP``, ``ESCAPE_NP`` and ``ESCAPE_NA`` have the higher priority than the rest of the flags (``ESCAPE_NAP`` is the highest). It doesn't make much sense to use either of them without ``ESCAPE_OCTAL`` or ``ESCAPE_HEX``, because they cover most of the other character classes. ``ESCAPE_NAP`` can utilize ``ESCAPE_SPACE`` or ``ESCAPE_SPECIAL`` in addition to the above.h](hOne notable caveat, the }(hjHhhhNhNubj)}(h``ESCAPE_NAP``h]h ESCAPE_NAP}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh, }(hjHhhhNhNubj)}(h ``ESCAPE_NP``h]h ESCAPE_NP}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh and }(hjHhhhNhNubj)}(h ``ESCAPE_NA``h]h ESCAPE_NA}(hj%IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh6 have the higher priority than the rest of the flags (}(hjHhhhNhNubj)}(h``ESCAPE_NAP``h]h ESCAPE_NAP}(hj7IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubhM is the highest). It doesn’t make much sense to use either of them without }(hjHhhhNhNubj)}(h``ESCAPE_OCTAL``h]h ESCAPE_OCTAL}(hjIIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh or }(hjHhhhNhNubj)}(h``ESCAPE_HEX``h]h ESCAPE_HEX}(hj[IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh:, because they cover most of the other character classes. }(hjHhhhNhNubj)}(h``ESCAPE_NAP``h]h ESCAPE_NAP}(hjmIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh can utilize }(hjHhhhNhNubj)}(h``ESCAPE_SPACE``h]h ESCAPE_SPACE}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh or }(hjHhhhNhNubj)}(h``ESCAPE_SPECIAL``h]hESCAPE_SPECIAL}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh in addition to the above.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM4hjEubh)}(h **Return**h]j)}(hjIh]hReturn}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM;hjEubh)}(hThe total size of the escaped output that would be generated for the given input and flags. To check whether the output was truncated, compare the return value to osz. There is room left in dst for a '\0' terminator if and only if ret < osz.h]hThe total size of the escaped output that would be generated for the given input and flags. To check whether the output was truncated, compare the return value to osz. There is room left in dst for a ‘0’ terminator if and only if ret < osz.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM<hjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kasprintf_strarray (C function)c.kasprintf_strarrayhNtauh1hhhhhhNhNubj)}(hhh](j)}(hDchar ** kasprintf_strarray (gfp_t gfp, const char *prefix, size_t n)h]j)}(hBchar **kasprintf_strarray(gfp_t gfp, const char *prefix, size_t n)h](j )}(hcharh]hchar}(hjIhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjIhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIhhhjIhMubj)}(hjh]h*}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIhhhjIhMubj)}(hjh]h*}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIhhhjIhMubj{)}(hkasprintf_strarrayh]j)}(hkasprintf_strarrayh]hkasprintf_strarray}(hj,JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(Jubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjIhhhjIhMubj)}(h)(gfp_t gfp, const char *prefix, size_t n)h](j)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjKJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHJubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjMJmodnameN classnameNj] j` )}jc ]jf )}jY j.Jsbc.kasprintf_strarrayasbuh1hhjDJubj2)}(h h]h }(hjkJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDJubj)}(hgfph]hgfp}(hjyJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDJubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@Jubj)}(hconst char *prefixh](j)}(hjh]hconst}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubj )}(hcharh]hchar}(hjJhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubj)}(hjh]h*}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj)}(hprefixh]hprefix}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@Jubj)}(hsize_t nh](h)}(hhh]j)}(hsize_th]hsize_t}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjJmodnameN classnameNj] j` )}jc ]jgJc.kasprintf_strarrayasbuh1hhjJubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubj)}(hjh]hn}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@Jubeh}(h]h ]h"]h$]h&]jjuh1jhjIhhhjIhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjIhhhjIhMubah}(h]jIah ](jjeh"]h$]h&]jj)jhuh1jhjIhMhjIhhubj)}(hhh]h)}(h-allocate and fill array of sequential stringsh]h-allocate and fill array of sequential strings}(hjGKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjDKhhubah}(h]h ]h"]h$]h&]uh1jhjIhhhjIhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj_Kjj_Kjjjuh1jhhhhhNhNubj)}(hX**Parameters** ``gfp_t gfp`` flags for the slab allocator ``const char *prefix`` prefix to be used ``size_t n`` number of strings to be allocated and filled **Description** Allocates and fills **n** strings using pattern "``s-````zu``", where prefix is provided by caller. The caller is responsible to free them with kfree_strarray() after use. Returns array of strings or NULL when memory can't be allocated.h](h)}(h**Parameters**h]j)}(hjiKh]h Parameters}(hjkKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgKubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjcKubj )}(hhh](j)}(h+``gfp_t gfp`` flags for the slab allocator h](j)}(h ``gfp_t gfp``h]j)}(hjKh]h gfp_t gfp}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjKubj2)}(hhh]h)}(hflags for the slab allocatorh]hflags for the slab allocator}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMhjKubah}(h]h ]h"]h$]h&]uh1j1hjKubeh}(h]h ]h"]h$]h&]uh1jhjKhMhjKubj)}(h)``const char *prefix`` prefix to be used h](j)}(h``const char *prefix``h]j)}(hjKh]hconst char *prefix}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjKubj2)}(hhh]h)}(hprefix to be usedh]hprefix to be used}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMhjKubah}(h]h ]h"]h$]h&]uh1j1hjKubeh}(h]h ]h"]h$]h&]uh1jhjKhMhjKubj)}(h:``size_t n`` number of strings to be allocated and filled h](j)}(h ``size_t n``h]j)}(hjKh]hsize_t n}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjKubj2)}(hhh]h)}(h,number of strings to be allocated and filledh]h,number of strings to be allocated and filled}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjLubah}(h]h ]h"]h$]h&]uh1j1hjKubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjKubeh}(h]h ]h"]h$]h&]uh1j hjcKubh)}(h**Description**h]j)}(hj5Lh]h Description}(hj7LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3Lubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjcKubh)}(hAllocates and fills **n** strings using pattern "``s-````zu``", where prefix is provided by caller. The caller is responsible to free them with kfree_strarray() after use.h](hAllocates and fills }(hjKLhhhNhNubj)}(h**n**h]hn}(hjSLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKLubh strings using pattern “}(hjKLhhhNhNubj)}(h ``s-````zu``h]hs-````zu}(hjeLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKLubhp”, where prefix is provided by caller. The caller is responsible to free them with kfree_strarray() after use.}(hjKLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjcKubh)}(h@Returns array of strings or NULL when memory can't be allocated.h]hBReturns array of strings or NULL when memory can’t be allocated.}(hj~LhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjcKubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfree_strarray (C function)c.kfree_strarrayhNtauh1hhhhhhNhNubj)}(hhh](j)}(h,void kfree_strarray (char **array, size_t n)h]j)}(h+void kfree_strarray(char **array, size_t n)h](j )}(hvoidh]hvoid}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLhhhjLhMubj{)}(hkfree_strarrayh]j)}(hkfree_strarrayh]hkfree_strarray}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjLhhhjLhMubj)}(h(char **array, size_t n)h](j)}(h char **arrayh](j )}(hcharh]hchar}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hjh]h*}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hjh]h*}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(harrayh]harray}(hj MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjLubj)}(hsize_t nh](h)}(hhh]j)}(hsize_th]hsize_t}(hjMmodnameN classnameNj] j` )}jc ]jf )}jY jLsbc.kfree_strarrayasbuh1hhj5Mubj2)}(h h]h }(hj\MhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5Mubj)}(hjh]hn}(hjjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5Mubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjLubeh}(h]h ]h"]h$]h&]jjuh1jhjLhhhjLhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjLhhhjLhMubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1jhjLhMhjLhhubj)}(hhh]h)}(hYfree a number of dynamically allocated strings contained in an array and the array itselfh]hYfree a number of dynamically allocated strings contained in an array and the array itself}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjMhhubah}(h]h ]h"]h$]h&]uh1jhjLhhhjLhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjMjjMjjjuh1jhhhhhNhNubj)}(hXF**Parameters** ``char **array`` Dynamically allocated array of strings to free. ``size_t n`` Number of strings (starting from the beginning of the array) to free. **Description** Passing a non-NULL **array** and **n** == 0 as well as NULL **array** are valid use-cases. If **array** is NULL, the function does nothing.h](h)}(h**Parameters**h]j)}(hjMh]h Parameters}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjMubj )}(hhh](j)}(hA``char **array`` Dynamically allocated array of strings to free. h](j)}(h``char **array``h]j)}(hjMh]h char **array}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjMubj2)}(hhh]h)}(h/Dynamically allocated array of strings to free.h]h/Dynamically allocated array of strings to free.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMhjMubah}(h]h ]h"]h$]h&]uh1j1hjMubeh}(h]h ]h"]h$]h&]uh1jhjMhMhjMubj)}(hS``size_t n`` Number of strings (starting from the beginning of the array) to free. h](j)}(h ``size_t n``h]j)}(hj Nh]hsize_t n}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Nubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjNubj2)}(hhh]h)}(hENumber of strings (starting from the beginning of the array) to free.h]hENumber of strings (starting from the beginning of the array) to free.}(hj&NhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"NhMhj#Nubah}(h]h ]h"]h$]h&]uh1j1hjNubeh}(h]h ]h"]h$]h&]uh1jhj"NhMhjMubeh}(h]h ]h"]h$]h&]uh1j hjMubh)}(h**Description**h]j)}(hjHNh]h Description}(hjJNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjMubh)}(hPassing a non-NULL **array** and **n** == 0 as well as NULL **array** are valid use-cases. If **array** is NULL, the function does nothing.h](hPassing a non-NULL }(hj^NhhhNhNubj)}(h **array**h]harray}(hjfNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^Nubh and }(hj^NhhhNhNubj)}(h**n**h]hn}(hjxNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^Nubh == 0 as well as NULL }(hj^NhhhNhNubj)}(h **array**h]harray}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^Nubh are valid use-cases. If }(hj^NhhhNhNubj)}(h **array**h]harray}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^Nubh$ is NULL, the function does nothing.}(hj^NhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j skip_spaces (C function) c.skip_spaceshNtauh1hhhhhhNhNubj)}(hhh](j)}(h$char * skip_spaces (const char *str)h]j)}(h"char *skip_spaces(const char *str)h](j )}(hcharh]hchar}(hjNhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjNhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMIubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNhhhjNhMIubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNhhhjNhMIubj{)}(h skip_spacesh]j)}(h skip_spacesh]h skip_spaces}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjNhhhjNhMIubj)}(h(const char *str)h]j)}(hconst char *strh](j)}(hjh]hconst}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj2)}(h h]h }(hj,OhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOubj )}(hcharh]hchar}(hj:OhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjOubj2)}(h h]h }(hjHOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOubj)}(hjh]h*}(hjVOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj)}(hstrh]hstr}(hjcOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubah}(h]h ]h"]h$]h&]jjuh1jhjNhhhjNhMIubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjNhhhjNhMIubah}(h]jNah ](jjeh"]h$]h&]jj)jhuh1jhjNhMIhjNhhubj)}(hhh]h)}(h(Removes leading whitespace from **str**.h](h Removes leading whitespace from }(hjOhhhNhNubj)}(h**str**h]hstr}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh.}(hjOhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMIhjOhhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjNhMIubeh}(h]h ](jfunctioneh"]h$]h&]jjjjOjjOjjjuh1jhhhhhNhNubj)}(h**Parameters** ``const char *str`` The string to be stripped. **Description** Returns a pointer to the first non-whitespace character in **str**.h](h)}(h**Parameters**h]j)}(hjOh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMMhjOubj )}(hhh]j)}(h/``const char *str`` The string to be stripped. h](j)}(h``const char *str``h]j)}(hjOh]hconst char *str}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMJhjOubj2)}(hhh]h)}(hThe string to be stripped.h]hThe string to be stripped.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMJhjOubah}(h]h ]h"]h$]h&]uh1j1hjOubeh}(h]h ]h"]h$]h&]uh1jhjOhMJhjOubah}(h]h ]h"]h$]h&]uh1j hjOubh)}(h**Description**h]j)}(hjPh]h Description}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMLhjOubh)}(hCReturns a pointer to the first non-whitespace character in **str**.h](h;Returns a pointer to the first non-whitespace character in }(hj1PhhhNhNubj)}(h**str**h]hstr}(hj9PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1Pubh.}(hj1PhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMKhjOubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strim (C function)c.strimhNtauh1hhhhhhNhNubj)}(hhh](j)}(hchar * strim (char *s)h]j)}(hchar *strim(char *s)h](j )}(hcharh]hchar}(hjrPhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnPhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMWubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnPhhhjPhMWubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnPhhhjPhMWubj{)}(hstrimh]j)}(hstrimh]hstrim}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnPhhhjPhMWubj)}(h (char *s)h]j)}(hchar *sh](j )}(hcharh]hchar}(hjPhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjPubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hjY)h]hs}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubah}(h]h ]h"]h$]h&]jjuh1jhjnPhhhjPhMWubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjjPhhhjPhMWubah}(h]jePah ](jjeh"]h$]h&]jj)jhuh1jhjPhMWhjgPhhubj)}(hhh]h)}(h3Removes leading and trailing whitespace from **s**.h](h-Removes leading and trailing whitespace from }(hjQhhhNhNubj)}(h**s**h]hs}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubh.}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMWhj Qhhubah}(h]h ]h"]h$]h&]uh1jhjgPhhhjPhMWubeh}(h]h ](jfunctioneh"]h$]h&]jjjj8Qjj8Qjjjuh1jhhhhhNhNubj)}(h**Parameters** ``char *s`` The string to be stripped. **Description** Note that the first trailing whitespace is replaced with a ``NUL-terminator`` in the given string **s**. Returns a pointer to the first non-whitespace character in **s**.h](h)}(h**Parameters**h]j)}(hjBQh]h Parameters}(hjDQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@Qubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chM[hjah"]h$]h&]uh1j1hjRhhhj$RhMqubj{)}(h sysfs_streqh]j)}(h sysfs_streqh]h sysfs_streq}(hj7RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Rubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjRhhhj$RhMqubj)}(h (const char *s1, const char *s2)h](j)}(hconst char *s1h](j)}(hjh]hconst}(hjSRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjORubj2)}(h h]h }(hj`RhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjORubj )}(hcharh]hchar}(hjnRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjORubj2)}(h h]h }(hj|RhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjORubj)}(hjh]h*}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjORubj)}(hs1h]hs1}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjORubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjKRubj)}(hconst char *s2h](j)}(hjh]hconst}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRubj )}(hcharh]hchar}(hjRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjRubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRubj)}(hjh]h*}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubj)}(hs2h]hs2}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjKRubeh}(h]h ]h"]h$]h&]jjuh1jhjRhhhj$RhMqubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjRhhhj$RhMqubah}(h]j Rah ](jjeh"]h$]h&]jj)jhuh1jhj$RhMqhj Rhhubj)}(hhh]h)}(h9return true if strings are equal, modulo trailing newlineh]h9return true if strings are equal, modulo trailing newline}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMqhjShhubah}(h]h ]h"]h$]h&]uh1jhj Rhhhj$RhMqubeh}(h]h ](jfunctioneh"]h$]h&]jjjj6Sjj6Sjjjuh1jhhhhhNhNubj)}(hXn**Parameters** ``const char *s1`` one string ``const char *s2`` another string **Description** This routine returns true iff two strings are equal, treating both NUL and newline-then-NUL as equivalent string terminations. It's geared for use with sysfs input strings, which generally terminate with newlines but are compared against values without newlines.h](h)}(h**Parameters**h]j)}(hj@Sh]h Parameters}(hjBShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>Subah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMuhj:Subj )}(hhh](j)}(h``const char *s1`` one string h](j)}(h``const char *s1``h]j)}(hj_Sh]hconst char *s1}(hjaShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]Subah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMrhjYSubj2)}(hhh]h)}(h one stringh]h one string}(hjxShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjtShMrhjuSubah}(h]h ]h"]h$]h&]uh1j1hjYSubeh}(h]h ]h"]h$]h&]uh1jhjtShMrhjVSubj)}(h"``const char *s2`` another string h](j)}(h``const char *s2``h]j)}(hjSh]hconst char *s2}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMshjSubj2)}(hhh]h)}(hanother stringh]hanother string}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMshjSubah}(h]h ]h"]h$]h&]uh1j1hjSubeh}(h]h ]h"]h$]h&]uh1jhjShMshjVSubeh}(h]h ]h"]h$]h&]uh1j hj:Subh)}(h**Description**h]j)}(hjSh]h Description}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMuhj:Subh)}(hXThis routine returns true iff two strings are equal, treating both NUL and newline-then-NUL as equivalent string terminations. It's geared for use with sysfs input strings, which generally terminate with newlines but are compared against values without newlines.h]hX This routine returns true iff two strings are equal, treating both NUL and newline-then-NUL as equivalent string terminations. It’s geared for use with sysfs input strings, which generally terminate with newlines but are compared against values without newlines.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMthj:Subeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j match_string (C function)c.match_stringhNtauh1hhhhhhNhNubj)}(hhh](j)}(hJint match_string (const char * const *array, size_t n, const char *string)h]j)}(hHint match_string(const char *const *array, size_t n, const char *string)h](j )}(hinth]hint}(hjThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjThhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMubj2)}(h h]h }(hj'ThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjThhhj&ThMubj{)}(h match_stringh]j)}(h match_stringh]h match_string}(hj9ThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5Tubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjThhhj&ThMubj)}(h8(const char *const *array, size_t n, const char *string)h](j)}(hconst char *const *arrayh](j)}(hjh]hconst}(hjUThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQTubj2)}(h h]h }(hjbThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQTubj )}(hcharh]hchar}(hjpThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjQTubj2)}(h h]h }(hj~ThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQTubj)}(hjh]h*}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQTubj)}(hjh]hconst}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQTubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQTubj)}(hjh]h*}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQTubj)}(harrayh]harray}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMTubj)}(hsize_t nh](h)}(hhh]j)}(hsize_th]hsize_t}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjTmodnameN classnameNj] j` )}jc ]jf )}jY j;Tsbc.match_stringasbuh1hhjTubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hjh]hn}(hj UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMTubj)}(hconst char *stringh](j)}(hjh]hconst}(hj#UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj2)}(h h]h }(hj0UhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj )}(hcharh]hchar}(hj>UhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjLUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj)}(hjh]h*}(hjZUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(hstringh]hstring}(hjgUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMTubeh}(h]h ]h"]h$]h&]jjuh1jhjThhhj&ThMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjThhhj&ThMubah}(h]j Tah ](jjeh"]h$]h&]jj)jhuh1jhj&ThMhj Thhubj)}(hhh]h)}(h matches given string in an arrayh]h matches given string in an array}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjUhhubah}(h]h ]h"]h$]h&]uh1jhj Thhhj&ThMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjUjjUjjjuh1jhhhhhNhNubj)}(hX**Parameters** ``const char * const *array`` array of strings ``size_t n`` number of strings in the array or -1 for NULL terminated arrays ``const char *string`` string to match with **Description** This routine will look for a string in an array of strings up to the n-th element in the array or until the first NULL element. Historically the value of -1 for **n**, was used to search in arrays that are NULL terminated. However, the function does not make a distinction when finishing the search: either **n** elements have been compared OR the first NULL element was found. **Return** index of a **string** in the **array** if matches, or ``-EINVAL`` otherwise.h](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjUubj )}(hhh](j)}(h/``const char * const *array`` array of strings h](j)}(h``const char * const *array``h]j)}(hjUh]hconst char * const *array}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjUubj2)}(hhh]h)}(harray of stringsh]harray of strings}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhMhjUubah}(h]h ]h"]h$]h&]uh1j1hjUubeh}(h]h ]h"]h$]h&]uh1jhjUhMhjUubj)}(hM``size_t n`` number of strings in the array or -1 for NULL terminated arrays h](j)}(h ``size_t n``h]j)}(hj Vh]hsize_t n}(hj VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Vubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjVubj2)}(hhh]h)}(h?number of strings in the array or -1 for NULL terminated arraysh]h?number of strings in the array or -1 for NULL terminated arrays}(hj$VhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj VhMhj!Vubah}(h]h ]h"]h$]h&]uh1j1hjVubeh}(h]h ]h"]h$]h&]uh1jhj VhMhjUubj)}(h,``const char *string`` string to match with h](j)}(h``const char *string``h]j)}(hjDVh]hconst char *string}(hjFVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBVubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj>Vubj2)}(hhh]h)}(hstring to match withh]hstring to match with}(hj]VhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYVhMhjZVubah}(h]h ]h"]h$]h&]uh1j1hj>Vubeh}(h]h ]h"]h$]h&]uh1jhjYVhMhjUubeh}(h]h ]h"]h$]h&]uh1j hjUubh)}(h**Description**h]j)}(hjVh]h Description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}Vubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjUubh)}(hThis routine will look for a string in an array of strings up to the n-th element in the array or until the first NULL element.h]hThis routine will look for a string in an array of strings up to the n-th element in the array or until the first NULL element.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjUubh)}(hHistorically the value of -1 for **n**, was used to search in arrays that are NULL terminated. However, the function does not make a distinction when finishing the search: either **n** elements have been compared OR the first NULL element was found.h](h!Historically the value of -1 for }(hjVhhhNhNubj)}(h**n**h]hn}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh, was used to search in arrays that are NULL terminated. However, the function does not make a distinction when finishing the search: either }(hjVhhhNhNubj)}(h**n**h]hn}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubhA elements have been compared OR the first NULL element was found.}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjUubh)}(h **Return**h]j)}(hjVh]hReturn}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjUubh)}(hLindex of a **string** in the **array** if matches, or ``-EINVAL`` otherwise.h](h index of a }(hjVhhhNhNubj)}(h **string**h]hstring}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh in the }(hjVhhhNhNubj)}(h **array**h]harray}(hj WhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh if matches, or }(hjVhhhNhNubj)}(h ``-EINVAL``h]h-EINVAL}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh otherwise.}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !__sysfs_match_string (C function)c.__sysfs_match_stringhNtauh1hhhhhhNhNubj)}(hhh](j)}(hOint __sysfs_match_string (const char * const *array, size_t n, const char *str)h]j)}(hMint __sysfs_match_string(const char *const *array, size_t n, const char *str)h](j )}(hinth]hint}(hjTWhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjPWhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMubj2)}(h h]h }(hjcWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPWhhhjbWhMubj{)}(h__sysfs_match_stringh]j)}(h__sysfs_match_stringh]h__sysfs_match_string}(hjuWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqWubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjPWhhhjbWhMubj)}(h5(const char *const *array, size_t n, const char *str)h](j)}(hconst char *const *arrayh](j)}(hjh]hconst}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj )}(hcharh]hchar}(hjWhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hjh]hconst}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(harrayh]harray}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjWubj)}(hsize_t nh](h)}(hhh]j)}(hsize_th]hsize_t}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjXmodnameN classnameNj] j` )}jc ]jf )}jY jwWsbc.__sysfs_match_stringasbuh1hhjXubj2)}(h h]h }(hj9XhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubj)}(hjh]hn}(hjGXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjWubj)}(hconst char *strh](j)}(hjh]hconst}(hj_XhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[Xubj2)}(h h]h }(hjlXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[Xubj )}(hcharh]hchar}(hjzXhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[Xubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[Xubj)}(hjh]h*}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[Xubj)}(hstrh]hstr}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[Xubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjWubeh}(h]h ]h"]h$]h&]jjuh1jhjPWhhhjbWhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjLWhhhjbWhMubah}(h]jGWah ](jjeh"]h$]h&]jj)jhuh1jhjbWhMhjIWhhubj)}(hhh]h)}(h matches given string in an arrayh]h matches given string in an array}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjXhhubah}(h]h ]h"]h$]h&]uh1jhjIWhhhjbWhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjXjjXjjjuh1jhhhhhNhNubj)}(hX**Parameters** ``const char * const *array`` array of strings ``size_t n`` number of strings in the array or -1 for NULL terminated arrays ``const char *str`` string to match with **Description** Returns index of **str** in the **array** or -EINVAL, just like match_string(). Uses sysfs_streq instead of strcmp for matching. This routine will look for a string in an array of strings up to the n-th element in the array or until the first NULL element. Historically the value of -1 for **n**, was used to search in arrays that are NULL terminated. However, the function does not make a distinction when finishing the search: either **n** elements have been compared OR the first NULL element was found.h](h)}(h**Parameters**h]j)}(hjXh]h Parameters}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjXubj )}(hhh](j)}(h/``const char * const *array`` array of strings h](j)}(h``const char * const *array``h]j)}(hjYh]hconst char * const *array}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Yubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjYubj2)}(hhh]h)}(harray of stringsh]harray of strings}(hj'YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#YhMhj$Yubah}(h]h ]h"]h$]h&]uh1j1hjYubeh}(h]h ]h"]h$]h&]uh1jhj#YhMhjYubj)}(hM``size_t n`` number of strings in the array or -1 for NULL terminated arrays h](j)}(h ``size_t n``h]j)}(hjGYh]hsize_t n}(hjIYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEYubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjAYubj2)}(hhh]h)}(h?number of strings in the array or -1 for NULL terminated arraysh]h?number of strings in the array or -1 for NULL terminated arrays}(hj`YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\YhMhj]Yubah}(h]h ]h"]h$]h&]uh1j1hjAYubeh}(h]h ]h"]h$]h&]uh1jhj\YhMhjYubj)}(h)``const char *str`` string to match with h](j)}(h``const char *str``h]j)}(hjYh]hconst char *str}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~Yubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjzYubj2)}(hhh]h)}(hstring to match withh]hstring to match with}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMhjYubah}(h]h ]h"]h$]h&]uh1j1hjzYubeh}(h]h ]h"]h$]h&]uh1jhjYhMhjYubeh}(h]h ]h"]h$]h&]uh1j hjXubh)}(h**Description**h]j)}(hjYh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjXubh)}(hReturns index of **str** in the **array** or -EINVAL, just like match_string(). Uses sysfs_streq instead of strcmp for matching.h](hReturns index of }(hjYhhhNhNubj)}(h**str**h]hstr}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh in the }(hjYhhhNhNubj)}(h **array**h]harray}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubhW or -EINVAL, just like match_string(). Uses sysfs_streq instead of strcmp for matching.}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjXubh)}(hThis routine will look for a string in an array of strings up to the n-th element in the array or until the first NULL element.h]hThis routine will look for a string in an array of strings up to the n-th element in the array or until the first NULL element.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjXubh)}(hHistorically the value of -1 for **n**, was used to search in arrays that are NULL terminated. However, the function does not make a distinction when finishing the search: either **n** elements have been compared OR the first NULL element was found.h](h!Historically the value of -1 for }(hjZhhhNhNubj)}(h**n**h]hn}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubh, was used to search in arrays that are NULL terminated. However, the function does not make a distinction when finishing the search: either }(hjZhhhNhNubj)}(h**n**h]hn}(hj-ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubhA elements have been compared OR the first NULL element was found.}(hjZhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strreplace (C function) c.strreplacehNtauh1hhhhhhNhNubj)}(hhh](j)}(h1char * strreplace (char *str, char old, char new)h]j)}(h/char *strreplace(char *str, char old, char new)h](j )}(hcharh]hchar}(hjfZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjbZhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMubj2)}(h h]h }(hjuZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbZhhhjtZhMubj)}(hjh]h*}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbZhhhjtZhMubj{)}(h strreplaceh]j)}(h strreplaceh]h strreplace}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjbZhhhjtZhMubj)}(h(char *str, char old, char new)h](j)}(h char *strh](j )}(hcharh]hchar}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hjh]h*}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hstrh]hstr}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hchar oldh](j )}(hcharh]hchar}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(holdh]hold}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hchar newh](j )}(hcharh]hchar}(hj'[hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#[ubj2)}(h h]h }(hj5[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#[ubj)}(hnewh]hnew}(hjC[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#[ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubeh}(h]h ]h"]h$]h&]jjuh1jhjbZhhhjtZhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj^ZhhhjtZhMubah}(h]jYZah ](jjeh"]h$]h&]jj)jhuh1jhjtZhMhj[Zhhubj)}(hhh]h)}(h/Replace all occurrences of character in string.h]h/Replace all occurrences of character in string.}(hjm[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjj[hhubah}(h]h ]h"]h$]h&]uh1jhj[ZhhhjtZhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[jj[jjjuh1jhhhhhNhNubj)}(hX8**Parameters** ``char *str`` The string to operate on. ``char old`` The character being replaced. ``char new`` The character **old** is replaced with. **Description** Replaces the each **old** character with a **new** one in the given string **str**. **Return** pointer to the string **str** itself.h](h)}(h**Parameters**h]j)}(hj[h]h Parameters}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj[ubj )}(hhh](j)}(h(``char *str`` The string to operate on. h](j)}(h ``char *str``h]j)}(hj[h]h char *str}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj[ubj2)}(hhh]h)}(hThe string to operate on.h]hThe string to operate on.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hMhj[ubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhj[hMhj[ubj)}(h+``char old`` The character being replaced. h](j)}(h ``char old``h]j)}(hj[h]hchar old}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj[ubj2)}(hhh]h)}(hThe character being replaced.h]hThe character being replaced.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hMhj[ubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhj[hMhj[ubj)}(h5``char new`` The character **old** is replaced with. h](j)}(h ``char new``h]j)}(hj \h]hchar new}(hj"\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj\ubj2)}(hhh]h)}(h'The character **old** is replaced with.h](hThe character }(hj9\hhhNhNubj)}(h**old**h]hold}(hjA\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9\ubh is replaced with.}(hj9\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj5\hMhj6\ubah}(h]h ]h"]h$]h&]uh1j1hj\ubeh}(h]h ]h"]h$]h&]uh1jhj5\hMhj[ubeh}(h]h ]h"]h$]h&]uh1j hj[ubh)}(h**Description**h]j)}(hjm\h]h Description}(hjo\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk\ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj[ubh)}(hSReplaces the each **old** character with a **new** one in the given string **str**.h](hReplaces the each }(hj\hhhNhNubj)}(h**old**h]hold}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh character with a }(hj\hhhNhNubj)}(h**new**h]hnew}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh one in the given string }(hj\hhhNhNubj)}(h**str**h]hstr}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh.}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj[ubh)}(h **Return**h]j)}(hj\h]hReturn}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj[ubh)}(h%pointer to the string **str** itself.h](hpointer to the string }(hj\hhhNhNubj)}(h**str**h]hstr}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh itself.}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memcpy_and_pad (C function)c.memcpy_and_padhNtauh1hhhhhhNhNubj)}(hhh](j)}(hYvoid memcpy_and_pad (void *dest, size_t dest_len, const void *src, size_t count, int pad)h]j)}(hXvoid memcpy_and_pad(void *dest, size_t dest_len, const void *src, size_t count, int pad)h](j )}(hvoidh]hvoid}(hj!]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMubj2)}(h h]h }(hj0]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]hhhj/]hMubj{)}(hmemcpy_and_padh]j)}(hmemcpy_and_padh]hmemcpy_and_pad}(hjB]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>]ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj]hhhj/]hMubj)}(hE(void *dest, size_t dest_len, const void *src, size_t count, int pad)h](j)}(h void *desth](j )}(hvoidh]hvoid}(hj^]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZ]ubj2)}(h h]h }(hjl]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZ]ubj)}(hjh]h*}(hjz]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ]ubj)}(hdesth]hdest}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjV]ubj)}(hsize_t dest_lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj]modnameN classnameNj] j` )}jc ]jf )}jY jD]sbc.memcpy_and_padasbuh1hhj]ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hdest_lenh]hdest_len}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjV]ubj)}(hconst void *srch](j)}(hjh]hconst}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj )}(hvoidh]hvoid}(hj^hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hjh]h*}(hj!^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hsrch]hsrc}(hj.^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjV]ubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjJ^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG^ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjL^modnameN classnameNj] j` )}jc ]j]c.memcpy_and_padasbuh1hhjC^ubj2)}(h h]h }(hjh^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjC^ubj)}(hcounth]hcount}(hjv^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjV]ubj)}(hint padh](j )}(hinth]hint}(hj^hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj^ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubj)}(hpadh]hpad}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjV]ubeh}(h]h ]h"]h$]h&]jjuh1jhj]hhhj/]hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]hhhj/]hMubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1jhj/]hMhj]hhubj)}(hhh]h)}(h'Copy one buffer to another with paddingh]h'Copy one buffer to another with padding}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj^hhubah}(h]h ]h"]h$]h&]uh1jhj]hhhj/]hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj^jj^jjjuh1jhhhhhNhNubj)}(hX **Parameters** ``void *dest`` Where to copy to ``size_t dest_len`` The destination buffer size ``const void *src`` Where to copy from ``size_t count`` The number of bytes to copy ``int pad`` Character to use for padding if space is left in destination.h](h)}(h**Parameters**h]j)}(hj^h]h Parameters}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj^ubj )}(hhh](j)}(h ``void *dest`` Where to copy to h](j)}(h``void *dest``h]j)}(hj_h]h void *dest}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj_ubj2)}(hhh]h)}(hWhere to copy toh]hWhere to copy to}(hj/_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+_hMhj,_ubah}(h]h ]h"]h$]h&]uh1j1hj_ubeh}(h]h ]h"]h$]h&]uh1jhj+_hMhj _ubj)}(h0``size_t dest_len`` The destination buffer size h](j)}(h``size_t dest_len``h]j)}(hjO_h]hsize_t dest_len}(hjQ_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhjI_ubj2)}(hhh]h)}(hThe destination buffer sizeh]hThe destination buffer size}(hjh_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjd_hMhje_ubah}(h]h ]h"]h$]h&]uh1j1hjI_ubeh}(h]h ]h"]h$]h&]uh1jhjd_hMhj _ubj)}(h'``const void *src`` Where to copy from h](j)}(h``const void *src``h]j)}(hj_h]hconst void *src}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj_ubj2)}(hhh]h)}(hWhere to copy fromh]hWhere to copy from}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hMhj_ubah}(h]h ]h"]h$]h&]uh1j1hj_ubeh}(h]h ]h"]h$]h&]uh1jhj_hMhj _ubj)}(h-``size_t count`` The number of bytes to copy h](j)}(h``size_t count``h]j)}(hj_h]h size_t count}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj_ubj2)}(hhh]h)}(hThe number of bytes to copyh]hThe number of bytes to copy}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hMhj_ubah}(h]h ]h"]h$]h&]uh1j1hj_ubeh}(h]h ]h"]h$]h&]uh1jhj_hMhj _ubj)}(hI``int pad`` Character to use for padding if space is left in destination.h](j)}(h ``int pad``h]j)}(hj_h]hint pad}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj_ubj2)}(hhh]h)}(h=Character to use for padding if space is left in destination.h]h=Character to use for padding if space is left in destination.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:27: ./lib/string_helpers.chMhj`ubah}(h]h ]h"]h$]h&]uh1j1hj_ubeh}(h]h ]h"]h$]h&]uh1jhj`hMhj _ubeh}(h]h ]h"]h$]h&]uh1j hj^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubeh}(h]string-conversionsah ]h"]string conversionsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hString Manipulationh]hString Manipulation}(hjF`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjC`hhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j unsafe_memcpy (C macro)c.unsafe_memcpyhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h unsafe_memcpyh]j)}(h unsafe_memcpyh]j{)}(h unsafe_memcpyh]j)}(hjg`h]h unsafe_memcpy}(hjq`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjm`ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhji`hhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhK|ubah}(h]h ]h"]h$]h&]jjjuh1jjjhje`hhhj`hK|ubah}(h]j``ah ](jjeh"]h$]h&]jj)jhuh1jhj`hK|hjb`hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjb`hhhj`hK|ubeh}(h]h ](jmacroeh"]h$]h&]jjjj`jj`jjjuh1jhhhjC`hNhNubh)}(h2``unsafe_memcpy (dst, src, bytes, justification)``h]j)}(hj`h]h.unsafe_memcpy (dst, src, bytes, justification)}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhK~hjC`hhubj)}(h6memcpy implementation with no FORTIFY bounds checking h]h)}(h5memcpy implementation with no FORTIFY bounds checkingh]h5memcpy implementation with no FORTIFY bounds checking}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhK|hj`ubah}(h]h ]h"]h$]h&]uh1jhj`hK|hjC`hhubj)}(hX,**Parameters** ``dst`` Destination memory address to write to ``src`` Source memory address to read from ``bytes`` How many bytes to write to **dst** from **src** ``justification`` Free-form text or comment describing why the use is needed **Description** This should be used for corner cases where the compiler cannot do the right thing, or during transitions between APIs, etc. It should be used very rarely, and includes a place for justification detailing where bounds checking has happened, and why existing solutions cannot be employed.h](h)}(h**Parameters**h]j)}(hj`h]h Parameters}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhj`ubj )}(hhh](j)}(h/``dst`` Destination memory address to write to h](j)}(h``dst``h]j)}(hj`h]hdst}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhK~hj`ubj2)}(hhh]h)}(h&Destination memory address to write toh]h&Destination memory address to write to}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ahK~hj aubah}(h]h ]h"]h$]h&]uh1j1hj`ubeh}(h]h ]h"]h$]h&]uh1jhj ahK~hj`ubj)}(h+``src`` Source memory address to read from h](j)}(h``src``h]j)}(hj0ah]hsrc}(hj2ahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.aubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhj*aubj2)}(hhh]h)}(h"Source memory address to read fromh]h"Source memory address to read from}(hjIahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEahKhjFaubah}(h]h ]h"]h$]h&]uh1j1hj*aubeh}(h]h ]h"]h$]h&]uh1jhjEahKhj`ubj)}(h:``bytes`` How many bytes to write to **dst** from **src** h](j)}(h ``bytes``h]j)}(hjiah]hbytes}(hjkahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgaubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjcaubj2)}(hhh]h)}(h/How many bytes to write to **dst** from **src**h](hHow many bytes to write to }(hjahhhNhNubj)}(h**dst**h]hdst}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh from }(hjahhhNhNubj)}(h**src**h]hsrc}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1hhj~ahKhjaubah}(h]h ]h"]h$]h&]uh1j1hjcaubeh}(h]h ]h"]h$]h&]uh1jhj~ahKhj`ubj)}(hM``justification`` Free-form text or comment describing why the use is needed h](j)}(h``justification``h]j)}(hjah]h justification}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjaubj2)}(hhh]h)}(h:Free-form text or comment describing why the use is neededh]h:Free-form text or comment describing why the use is needed}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahKhjaubah}(h]h ]h"]h$]h&]uh1j1hjaubeh}(h]h ]h"]h$]h&]uh1jhjahKhj`ubeh}(h]h ]h"]h$]h&]uh1j hj`ubh)}(h**Description**h]j)}(hjah]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhj`ubh)}(hXThis should be used for corner cases where the compiler cannot do the right thing, or during transitions between APIs, etc. It should be used very rarely, and includes a place for justification detailing where bounds checking has happened, and why existing solutions cannot be employed.h]hXThis should be used for corner cases where the compiler cannot do the right thing, or during transitions between APIs, etc. It should be used very rarely, and includes a place for justification detailing where bounds checking has happened, and why existing solutions cannot be employed.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhj`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strnlen (C function) c.strnlenhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hF__kernel_size_t strnlen (const char * const p, __kernel_size_t maxlen)h]j)}(hD__kernel_size_t strnlen(const char *const p, __kernel_size_t maxlen)h](h)}(hhh]j)}(h__kernel_size_th]h__kernel_size_t}(hjEbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBbubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjGbmodnameN classnameNj] j` )}jc ]jf )}jY strnlensb c.strnlenasbuh1hhj>bhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKubj2)}(h h]h }(hjgbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>bhhhjfbhKubj{)}(hstrnlenh]j)}(hjcbh]hstrnlen}(hjybhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjububah}(h]h ](jjeh"]h$]h&]jjuh1jzhj>bhhhjfbhKubj)}(h-(const char *const p, __kernel_size_t maxlen)h](j)}(hconst char *const ph](j)}(hjh]hconst}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbubj )}(hcharh]hchar}(hjbhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjbubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbubj)}(hjh]h*}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj)}(hjh]hconst}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbubj)}(hjh]hp}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbubj)}(h__kernel_size_t maxlenh](h)}(hhh]j)}(h__kernel_size_th]h__kernel_size_t}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj cubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjcmodnameN classnameNj] j` )}jc ]jab c.strnlenasbuh1hhjcubj2)}(h h]h }(hj,chhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hmaxlenh]hmaxlen}(hj:chhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbubeh}(h]h ]h"]h$]h&]jjuh1jhj>bhhhjfbhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj:bhhhjfbhKubah}(h]j5bah ](jjeh"]h$]h&]jj)jhuh1jhjfbhKhj7bhhubj)}(hhh]h)}(h=Return bounded count of characters in a NUL-terminated stringh]h=Return bounded count of characters in a NUL-terminated string}(hjdchhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjachhubah}(h]h ]h"]h$]h&]uh1jhj7bhhhjfbhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj|cjj|cjjjuh1jhhhjC`hNhNubj)}(hX&**Parameters** ``const char * const p`` pointer to NUL-terminated string to count. ``__kernel_size_t maxlen`` maximum number of characters to count. **Description** Returns number of characters in **p** (NOT including the final NUL), or **maxlen**, if no NUL has been found up to there.h](h)}(h**Parameters**h]j)}(hjch]h Parameters}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjcubj )}(hhh](j)}(hD``const char * const p`` pointer to NUL-terminated string to count. h](j)}(h``const char * const p``h]j)}(hjch]hconst char * const p}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjcubj2)}(hhh]h)}(h*pointer to NUL-terminated string to count.h]h*pointer to NUL-terminated string to count.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchKhjcubah}(h]h ]h"]h$]h&]uh1j1hjcubeh}(h]h ]h"]h$]h&]uh1jhjchKhjcubj)}(hB``__kernel_size_t maxlen`` maximum number of characters to count. h](j)}(h``__kernel_size_t maxlen``h]j)}(hjch]h__kernel_size_t maxlen}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjcubj2)}(hhh]h)}(h&maximum number of characters to count.h]h&maximum number of characters to count.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchKhjcubah}(h]h ]h"]h$]h&]uh1j1hjcubeh}(h]h ]h"]h$]h&]uh1jhjchKhjcubeh}(h]h ]h"]h$]h&]uh1j hjcubh)}(h**Description**h]j)}(hjdh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjcubh)}(hyReturns number of characters in **p** (NOT including the final NUL), or **maxlen**, if no NUL has been found up to there.h](h Returns number of characters in }(hj/dhhhNhNubj)}(h**p**h]hp}(hj7dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/dubh# (NOT including the final NUL), or }(hj/dhhhNhNubj)}(h **maxlen**h]hmaxlen}(hjIdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/dubh', if no NUL has been found up to there.}(hj/dhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjcubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strlen (C macro)c.strlenhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hstrlenh]j)}(hstrlenh]j{)}(hstrlenh]j)}(hj|dh]hstrlen}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj~dhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjzdhhhjdhKubah}(h]judah ](jjeh"]h$]h&]jj)jhuh1jhjdhKhjwdhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjwdhhhjdhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjdjjdjjjuh1jhhhjC`hNhNubh)}(h``strlen (p)``h]j)}(hjdh]h strlen (p)}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjC`hhubj)}(h6Return count of characters in a NUL-terminated string h]h)}(h5Return count of characters in a NUL-terminated stringh]h5Return count of characters in a NUL-terminated string}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjdubah}(h]h ]h"]h$]h&]uh1jhjdhKhjC`hhubj)}(hXu**Parameters** ``p`` pointer to NUL-terminated string to count. **Description** Do not use this function unless the string length is known at compile-time. When **p** is unterminated, this function may crash or return unexpected counts that could lead to memory content exposures. Prefer strnlen(). Returns number of characters in **p** (NOT including the final NUL).h](h)}(h**Parameters**h]j)}(hjdh]h Parameters}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjdubj )}(hhh]j)}(h1``p`` pointer to NUL-terminated string to count. h](j)}(h``p``h]j)}(hj eh]hp}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj eubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjeubj2)}(hhh]h)}(h*pointer to NUL-terminated string to count.h]h*pointer to NUL-terminated string to count.}(hj%ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!ehKhj"eubah}(h]h ]h"]h$]h&]uh1j1hjeubeh}(h]h ]h"]h$]h&]uh1jhj!ehKhjeubah}(h]h ]h"]h$]h&]uh1j hjdubh)}(h**Description**h]j)}(hjGeh]h Description}(hjIehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEeubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjdubh)}(hDo not use this function unless the string length is known at compile-time. When **p** is unterminated, this function may crash or return unexpected counts that could lead to memory content exposures. Prefer strnlen().h](hQDo not use this function unless the string length is known at compile-time. When }(hj]ehhhNhNubj)}(h**p**h]hp}(hjeehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]eubh is unterminated, this function may crash or return unexpected counts that could lead to memory content exposures. Prefer strnlen().}(hj]ehhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjdubh)}(hDReturns number of characters in **p** (NOT including the final NUL).h](h Returns number of characters in }(hj~ehhhNhNubj)}(h**p**h]hp}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~eubh (NOT including the final NUL).}(hj~ehhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhKhjdubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strlcat (C function) c.strlcathNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hCsize_t strlcat (char * const p, const char * const q, size_t avail)h]j)}(h@size_t strlcat(char *const p, const char *const q, size_t avail)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjemodnameN classnameNj] j` )}jc ]jf )}jY strlcatsb c.strlcatasbuh1hhjehhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjehhhjehMubj{)}(hstrlcath]j)}(hjeh]hstrlcat}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjehhhjehMubj)}(h2(char *const p, const char *const q, size_t avail)h](j)}(h char *const ph](j )}(hcharh]hchar}(hjfhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj fubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj fubj)}(hjh]h*}(hj-fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj fubj)}(hjh]hconst}(hj:fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj fubj2)}(h h]h }(hjGfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj fubj)}(hjh]hp}(hjUfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj fubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj fubj)}(hconst char *const qh](j)}(hjh]hconst}(hjmfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjifubj2)}(h h]h }(hjzfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjifubj )}(hcharh]hchar}(hjfhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjifubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjifubj)}(hjh]h*}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjifubj)}(hjh]hconst}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjifubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjifubj)}(hqh]hq}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjifubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj fubj)}(h size_t availh](h)}(hhh]j)}(hsize_th]hsize_t}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjfmodnameN classnameNj] j` )}jc ]je c.strlcatasbuh1hhjfubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfubj)}(havailh]havail}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj fubeh}(h]h ]h"]h$]h&]jjuh1jhjehhhjehMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjehhhjehMubah}(h]jeah ](jjeh"]h$]h&]jj)jhuh1jhjehMhjehhubj)}(hhh]h)}(h%Append a string to an existing stringh]h%Append a string to an existing string}(hj>ghhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMhj;ghhubah}(h]h ]h"]h$]h&]uh1jhjehhhjehMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjVgjjVgjjjuh1jhhhjC`hNhNubj)}(hX **Parameters** ``char * const p`` pointer to ``NUL-terminated`` string to append to ``const char * const q`` pointer to ``NUL-terminated`` string to append from ``size_t avail`` Maximum bytes available in **p** **Description** Appends ``NUL-terminated`` string **q** after the ``NUL-terminated`` string at **p**, but will not write beyond **avail** bytes total, potentially truncating the copy from **q**. **p** will stay ``NUL-terminated`` only if a ``NUL`` already existed within the **avail** bytes of **p**. If so, the resulting number of bytes copied from **q** will be at most "**avail** - strlen(**p**) - 1". Do not use this function. While FORTIFY_SOURCE tries to avoid read and write overflows, this is only possible when the sizes of **p** and **q** are known to the compiler. Prefer building the string with formatting, via scnprintf(), seq_buf, or similar. Returns total bytes that _would_ have been contained by **p** regardless of truncation, similar to snprintf(). If return value is >= **avail**, the string has been truncated.h](h)}(h**Parameters**h]j)}(hj`gh]h Parameters}(hjbghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^gubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhM!hjZgubj )}(hhh](j)}(hE``char * const p`` pointer to ``NUL-terminated`` string to append to h](j)}(h``char * const p``h]j)}(hjgh]hchar * const p}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}gubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMhjygubj2)}(hhh]h)}(h1pointer to ``NUL-terminated`` string to append toh](h pointer to }(hjghhhNhNubj)}(h``NUL-terminated``h]hNUL-terminated}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubh string to append to}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjghMhjgubah}(h]h ]h"]h$]h&]uh1j1hjygubeh}(h]h ]h"]h$]h&]uh1jhjghMhjvgubj)}(hM``const char * const q`` pointer to ``NUL-terminated`` string to append from h](j)}(h``const char * const q``h]j)}(hjgh]hconst char * const q}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhM hjgubj2)}(hhh]h)}(h3pointer to ``NUL-terminated`` string to append fromh](h pointer to }(hjghhhNhNubj)}(h``NUL-terminated``h]hNUL-terminated}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubh string to append from}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjghM hjgubah}(h]h ]h"]h$]h&]uh1j1hjgubeh}(h]h ]h"]h$]h&]uh1jhjghM hjvgubj)}(h2``size_t avail`` Maximum bytes available in **p** h](j)}(h``size_t avail``h]j)}(hjhh]h size_t avail}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhM!hjhubj2)}(hhh]h)}(h Maximum bytes available in **p**h](hMaximum bytes available in }(hj.hhhhNhNubj)}(h**p**h]hp}(hj6hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.hubeh}(h]h ]h"]h$]h&]uh1hhj*hhM!hj+hubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhj*hhM!hjvgubeh}(h]h ]h"]h$]h&]uh1j hjZgubh)}(h**Description**h]j)}(hj^hh]h Description}(hj`hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\hubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhM#hjZgubh)}(hXAppends ``NUL-terminated`` string **q** after the ``NUL-terminated`` string at **p**, but will not write beyond **avail** bytes total, potentially truncating the copy from **q**. **p** will stay ``NUL-terminated`` only if a ``NUL`` already existed within the **avail** bytes of **p**. If so, the resulting number of bytes copied from **q** will be at most "**avail** - strlen(**p**) - 1".h](hAppends }(hjthhhhNhNubj)}(h``NUL-terminated``h]hNUL-terminated}(hj|hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh string }(hjthhhhNhNubj)}(h**q**h]hq}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh after the }(hjthhhhNhNubj)}(h``NUL-terminated``h]hNUL-terminated}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh string at }(hjthhhhNhNubj)}(h**p**h]hp}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh, but will not write beyond }(hjthhhhNhNubj)}(h **avail**h]havail}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh3 bytes total, potentially truncating the copy from }(hjthhhhNhNubj)}(h**q**h]hq}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh. }(hjthhhhNhNubj)}(h**p**h]hp}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh will stay }(hjthhhhNhNubj)}(h``NUL-terminated``h]hNUL-terminated}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh only if a }(hjthhhhNhNubj)}(h``NUL``h]hNUL}(hj ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh already existed within the }(hjthhhhNhNubj)}(h **avail**h]havail}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh bytes of }(hjthhhhNhNubj)}(h**p**h]hp}(hj0ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh3. If so, the resulting number of bytes copied from }(hjthhhhNhNubj)}(h**q**h]hq}(hjBihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh will be at most “}(hjthhhhNhNubj)}(h **avail**h]havail}(hjTihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh - strlen(}(hjthhhhNhNubj)}(h**p**h]hp}(hjfihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthubh ) - 1”.}(hjthhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhM"hjZgubh)}(hDo not use this function. While FORTIFY_SOURCE tries to avoid read and write overflows, this is only possible when the sizes of **p** and **q** are known to the compiler. Prefer building the string with formatting, via scnprintf(), seq_buf, or similar.h](hDo not use this function. While FORTIFY_SOURCE tries to avoid read and write overflows, this is only possible when the sizes of }(hjihhhNhNubj)}(h**p**h]hp}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubh and }(hjihhhNhNubj)}(h**q**h]hq}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubhm are known to the compiler. Prefer building the string with formatting, via scnprintf(), seq_buf, or similar.}(hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhM)hjZgubh)}(hReturns total bytes that _would_ have been contained by **p** regardless of truncation, similar to snprintf(). If return value is >= **avail**, the string has been truncated.h](h8Returns total bytes that _would_ have been contained by }(hjihhhNhNubj)}(h**p**h]hp}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubhH regardless of truncation, similar to snprintf(). If return value is >= }(hjihhhNhNubj)}(h **avail**h]havail}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubh , the string has been truncated.}(hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhM.hjZgubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strcat (C function)c.strcathNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h-char * strcat (char * const p, const char *q)h]j)}(h*char *strcat(char *const p, const char *q)h](j )}(hcharh]hchar}(hjjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjjhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhM\ubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjhhhjjhM\ubj)}(hjh]h*}(hj"jhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjhhhjjhM\ubj{)}(hstrcath]j)}(hstrcath]hstrcat}(hj3jhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/jubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjjhhhjjhM\ubj)}(h(char *const p, const char *q)h](j)}(h char *const ph](j )}(hcharh]hchar}(hjOjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjKjubj2)}(h h]h }(hj]jhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKjubj)}(hjh]h*}(hjkjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKjubj)}(hjh]hconst}(hjxjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKjubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKjubj)}(hjh]hp}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjGjubj)}(h const char *qh](j)}(hjh]hconst}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubj )}(hcharh]hchar}(hjjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjjubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubj)}(hjh]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(hjfh]hq}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjGjubeh}(h]h ]h"]h$]h&]jjuh1jhjjhhhjjhM\ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjihhhjjhM\ubah}(h]jiah ](jjeh"]h$]h&]jj)jhuh1jhjjhM\hjihhubj)}(hhh]h)}(h%Append a string to an existing stringh]h%Append a string to an existing string}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhM\hjkhhubah}(h]h ]h"]h$]h&]uh1jhjihhhjjhM\ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj0kjj0kjjjuh1jhhhjC`hNhNubj)}(hX**Parameters** ``char * const p`` pointer to NUL-terminated string to append to ``const char *q`` pointer to NUL-terminated source string to append from **Description** Do not use this function. While FORTIFY_SOURCE tries to avoid read and write overflows, this is only possible when the destination buffer size is known to the compiler. Prefer building the string with formatting, via scnprintf() or similar. At the very least, use strncat(). Returns **p**.h](h)}(h**Parameters**h]j)}(hj:kh]h Parameters}(hjah"]h$]h&]uh1j1hj/lhhhjAlhMvubj)}(hjh]h*}(hjPlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/lhhhjAlhMvubj{)}(hstrncath]j)}(hstrncath]hstrncat}(hjalhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]lubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj/lhhhjAlhMvubj)}(h;(char *const p, const char *const q, __kernel_size_t count)h](j)}(h char *const ph](j )}(hcharh]hchar}(hj}lhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjylubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjylubj)}(hjh]h*}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjylubj)}(hjh]hconst}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjylubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjylubj)}(hjh]hp}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjylubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjulubj)}(hconst char *const qh](j)}(hjh]hconst}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj )}(hcharh]hchar}(hjlhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjlubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjh]h*}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hjh]hconst}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj2)}(h h]h }(hj*mhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjfh]hq}(hj8mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjulubj)}(h__kernel_size_t counth](h)}(hhh]j)}(h__kernel_size_th]h__kernel_size_t}(hjSmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPmubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjUmmodnameN classnameNj] j` )}jc ]jf )}jY jclsb c.strncatasbuh1hhjLmubj2)}(h h]h }(hjsmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLmubj)}(hcounth]hcount}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLmubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjulubeh}(h]h ]h"]h$]h&]jjuh1jhj/lhhhjAlhMvubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj+lhhhjAlhMvubah}(h]j&lah ](jjeh"]h$]h&]jj)jhuh1jhjAlhMvhj(lhhubj)}(hhh]h)}(h%Append a string to an existing stringh]h%Append a string to an existing string}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMvhjmhhubah}(h]h ]h"]h$]h&]uh1jhj(lhhhjAlhMvubeh}(h]h ](jfunctioneh"]h$]h&]jjjjmjjmjjjuh1jhhhjC`hNhNubj)}(hX~**Parameters** ``char * const p`` pointer to NUL-terminated string to append to ``const char * const q`` pointer to source string to append from ``__kernel_size_t count`` Maximum bytes to read from **q** **Description** Appends at most **count** bytes from **q** (stopping at the first NUL byte) after the NUL-terminated string at **p**. **p** will be NUL-terminated. Do not use this function. While FORTIFY_SOURCE tries to avoid read and write overflows, this is only possible when the sizes of **p** and **q** are known to the compiler. Prefer building the string with formatting, via scnprintf() or similar. Returns **p**.h](h)}(h**Parameters**h]j)}(hjmh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMzhjmubj )}(hhh](j)}(hA``char * const p`` pointer to NUL-terminated string to append to h](j)}(h``char * const p``h]j)}(hjmh]hchar * const p}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMxhjmubj2)}(hhh]h)}(h-pointer to NUL-terminated string to append toh]h-pointer to NUL-terminated string to append to}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhMxhjnubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjnhMxhjmubj)}(hA``const char * const q`` pointer to source string to append from h](j)}(h``const char * const q``h]j)}(hj%nh]hconst char * const q}(hj'nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#nubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMyhjnubj2)}(hhh]h)}(h'pointer to source string to append fromh]h'pointer to source string to append from}(hj>nhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:nhMyhj;nubah}(h]h ]h"]h$]h&]uh1j1hjnubeh}(h]h ]h"]h$]h&]uh1jhj:nhMyhjmubj)}(h;``__kernel_size_t count`` Maximum bytes to read from **q** h](j)}(h``__kernel_size_t count``h]j)}(hj^nh]h__kernel_size_t count}(hj`nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\nubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMzhjXnubj2)}(hhh]h)}(h Maximum bytes to read from **q**h](hMaximum bytes to read from }(hjwnhhhNhNubj)}(h**q**h]hq}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwnubeh}(h]h ]h"]h$]h&]uh1hhjsnhMzhjtnubah}(h]h ]h"]h$]h&]uh1j1hjXnubeh}(h]h ]h"]h$]h&]uh1jhjsnhMzhjmubeh}(h]h ]h"]h$]h&]uh1j hjmubh)}(h**Description**h]j)}(hjnh]h Description}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhM|hjmubh)}(hAppends at most **count** bytes from **q** (stopping at the first NUL byte) after the NUL-terminated string at **p**. **p** will be NUL-terminated.h](hAppends at most }(hjnhhhNhNubj)}(h **count**h]hcount}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh bytes from }(hjnhhhNhNubj)}(h**q**h]hq}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubhE (stopping at the first NUL byte) after the NUL-terminated string at }(hjnhhhNhNubj)}(h**p**h]hp}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh. }(hjnhhhNhNubj)}(h**p**h]hp}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh will be NUL-terminated.}(hjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhM{hjmubh)}(hDo not use this function. While FORTIFY_SOURCE tries to avoid read and write overflows, this is only possible when the sizes of **p** and **q** are known to the compiler. Prefer building the string with formatting, via scnprintf() or similar.h](hDo not use this function. While FORTIFY_SOURCE tries to avoid read and write overflows, this is only possible when the sizes of }(hjohhhNhNubj)}(h**p**h]hp}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh and }(hjohhhNhNubj)}(h**q**h]hq}(hj.ohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubhc are known to the compiler. Prefer building the string with formatting, via scnprintf() or similar.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMhjmubh)}(hReturns **p**.h](hReturns }(hjGohhhNhNubj)}(h**p**h]hp}(hjOohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGoubh.}(hjGohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strcpy (C function)c.strcpyhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h4char * strcpy (char * const p, const char * const q)h]j)}(h0char *strcpy(char *const p, const char *const q)h](j )}(hcharh]hchar}(hjohhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjohhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjohhhjohMubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjohhhjohMubj{)}(hstrcpyh]j)}(hstrcpyh]hstrcpy}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjohhhjohMubj)}(h$(char *const p, const char *const q)h](j)}(h char *const ph](j )}(hcharh]hchar}(hjohhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjoubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjoubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(hjh]hconst}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjoubj)}(hjh]hp}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjoubj)}(hconst char *const qh](j)}(hjh]hconst}(hj.phhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*pubj2)}(h h]h }(hj;phhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*pubj )}(hcharh]hchar}(hjIphhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*pubj2)}(h h]h }(hjWphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*pubj)}(hjh]h*}(hjephhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*pubj)}(hjh]hconst}(hjrphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*pubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*pubj)}(hjfh]hq}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*pubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjoubeh}(h]h ]h"]h$]h&]jjuh1jhjohhhjohMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjohhhjohMubah}(h]j{oah ](jjeh"]h$]h&]jj)jhuh1jhjohMhj}ohhubj)}(hhh]h)}(h(Copy a string into another string bufferh]h(Copy a string into another string buffer}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMhjphhubah}(h]h ]h"]h$]h&]uh1jhj}ohhhjohMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjpjjpjjjuh1jhhhjC`hNhNubj)}(hX**Parameters** ``char * const p`` pointer to destination of copy ``const char * const q`` pointer to NUL-terminated source string to copy **Description** Do not use this function. While FORTIFY_SOURCE tries to avoid overflows, this is only possible when the sizes of **q** and **p** are known to the compiler. Prefer strscpy(), though note its different return values for detecting truncation. Returns **p**.h](h)}(h**Parameters**h]j)}(hjph]h Parameters}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMhjpubj )}(hhh](j)}(h2``char * const p`` pointer to destination of copy h](j)}(h``char * const p``h]j)}(hjph]hchar * const p}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMhjpubj2)}(hhh]h)}(hpointer to destination of copyh]hpointer to destination of copy}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj qhMhj qubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhj qhMhjpubj)}(hI``const char * const q`` pointer to NUL-terminated source string to copy h](j)}(h``const char * const q``h]j)}(hj0qh]hconst char * const q}(hj2qhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.qubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMhj*qubj2)}(hhh]h)}(h/pointer to NUL-terminated source string to copyh]h/pointer to NUL-terminated source string to copy}(hjIqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEqhMhjFqubah}(h]h ]h"]h$]h&]uh1j1hj*qubeh}(h]h ]h"]h$]h&]uh1jhjEqhMhjpubeh}(h]h ]h"]h$]h&]uh1j hjpubh)}(h**Description**h]j)}(hjkqh]h Description}(hjmqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiqubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMhjpubh)}(hDo not use this function. While FORTIFY_SOURCE tries to avoid overflows, this is only possible when the sizes of **q** and **p** are known to the compiler. Prefer strscpy(), though note its different return values for detecting truncation.h](hqDo not use this function. While FORTIFY_SOURCE tries to avoid overflows, this is only possible when the sizes of }(hjqhhhNhNubj)}(h**q**h]hq}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh and }(hjqhhhNhNubj)}(h**p**h]hp}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubho are known to the compiler. Prefer strscpy(), though note its different return values for detecting truncation.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMhjpubh)}(hReturns **p**.h](hReturns }(hjqhhhNhNubj)}(h**p**h]hp}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:33: ./include/linux/fortify-string.hhMhjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strncasecmp (C function) c.strncasecmphNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjqhhhjrhK$ubj{)}(h strncasecmph]j)}(h strncasecmph]h strncasecmp}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjqhhhjrhK$ubj)}(h,(const char *s1, const char *s2, size_t len)h](j)}(hconst char *s1h](j)}(hjh]hconst}(hj2rhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.rubj2)}(h h]h }(hj?rhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.rubj )}(hcharh]hchar}(hjMrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.rubj2)}(h h]h }(hj[rhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.rubj)}(hjh]h*}(hjirhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.rubj)}(hs1h]hs1}(hjvrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.rubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*rubj)}(hconst char *s2h](j)}(hjh]hconst}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj )}(hcharh]hchar}(hjrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hjh]h*}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hs2h]hs2}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*rubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjrmodnameN classnameNj] j` )}jc ]jf )}jY jrsb c.strncasecmpasbuh1hhjrubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hlenh]hlen}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*rubeh}(h]h ]h"]h$]h&]jjuh1jhjqhhhjrhK$ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjqhhhjrhK$ubah}(h]jqah ](jjeh"]h$]h&]jj)jhuh1jhjrhK$hjqhhubj)}(hhh]h)}(h2Case insensitive, length-limited string comparisonh]h2Case insensitive, length-limited string comparison}(hjGshhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chK$hjDshhubah}(h]h ]h"]h$]h&]uh1jhjqhhhjrhK$ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj_sjj_sjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const char *s1`` One string ``const char *s2`` The other string ``size_t len`` the maximum number of characters to compareh](h)}(h**Parameters**h]j)}(hjish]h Parameters}(hjkshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgsubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chK(hjcsubj )}(hhh](j)}(h``const char *s1`` One string h](j)}(h``const char *s1``h]j)}(hjsh]hconst char *s1}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chK%hjsubj2)}(hhh]h)}(h One stringh]h One string}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshK%hjsubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjshK%hjsubj)}(h$``const char *s2`` The other string h](j)}(h``const char *s2``h]j)}(hjsh]hconst char *s2}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chK&hjsubj2)}(hhh]h)}(hThe other stringh]hThe other string}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshK&hjsubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjshK&hjsubj)}(h:``size_t len`` the maximum number of characters to compareh](j)}(h``size_t len``h]j)}(hjsh]h size_t len}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chK(hjsubj2)}(hhh]h)}(h+the maximum number of characters to compareh]h+the maximum number of characters to compare}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chK'hjtubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjthK(hjsubeh}(h]h ]h"]h$]h&]uh1j hjcsubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j stpcpy (C function)c.stpcpyhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hEchar * stpcpy (char *__restrict__ dest, const char *__restrict__ src)h]j)}(hCchar *stpcpy(char *__restrict__ dest, const char *__restrict__ src)h](j )}(hcharh]hchar}(hjTthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjPthhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chKubj2)}(h h]h }(hjcthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPthhhjbthKubj)}(hjh]h*}(hjqthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPthhhjbthKubj{)}(hstpcpyh]j)}(hstpcpyh]hstpcpy}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~tubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjPthhhjbthKubj)}(h7(char *__restrict__ dest, const char *__restrict__ src)h](j)}(hchar *__restrict__ desth](j )}(hcharh]hchar}(hjthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjtubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubh __restrict__}(hjthhhNhNubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubj)}(hdesth]hdest}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubj)}(hconst char *__restrict__ srch](j)}(hjh]hconst}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubj )}(hcharh]hchar}(hj uhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjtubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubj)}(hjh]h*}(hj)uhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubh __restrict__}(hjthhhNhNubj2)}(h h]h }(hj:uhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubj)}(hsrch]hsrc}(hjHuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubeh}(h]h ]h"]h$]h&]jjuh1jhjPthhhjbthKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjLthhhjbthKubah}(h]jGtah ](jjeh"]h$]h&]jj)jhuh1jhjbthKhjIthhubj)}(hhh]h)}(hcopy a string from src to dest returning a pointer to the new end of dest, including src's ``NUL-terminator``. May overrun dest.h](h]copy a string from src to dest returning a pointer to the new end of dest, including src’s }(hjruhhhNhNubj)}(h``NUL-terminator``h]hNUL-terminator}(hjzuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjruubh. May overrun dest.}(hjruhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chKhjouhhubah}(h]h ]h"]h$]h&]uh1jhjIthhhjbthKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjujjujjjuh1jhhhjC`hNhNubj)}(hX**Parameters** ``char *__restrict__ dest`` pointer to end of string being copied into. Must be large enough to receive copy. ``const char *__restrict__ src`` pointer to the beginning of string being copied from. Must not overlap dest. **Description** stpcpy differs from strcpy in a key way: the return value is a pointer to the new ``NUL-terminating`` character in **dest**. (For strcpy, the return value is a pointer to the start of **dest**). This interface is considered unsafe as it doesn't perform bounds checking of the inputs. As such it's not recommended for usage. Instead, its definition is provided in case the compiler lowers other libcalls to stpcpy.h](h)}(h**Parameters**h]j)}(hjuh]h Parameters}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chKhjuubj )}(hhh](j)}(hn``char *__restrict__ dest`` pointer to end of string being copied into. Must be large enough to receive copy. h](j)}(h``char *__restrict__ dest``h]j)}(hjuh]hchar *__restrict__ dest}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chKhjuubj2)}(hhh]h)}(hQpointer to end of string being copied into. Must be large enough to receive copy.h]hQpointer to end of string being copied into. Must be large enough to receive copy.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chKhjuubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjuhKhjuubj)}(hn``const char *__restrict__ src`` pointer to the beginning of string being copied from. Must not overlap dest. h](j)}(h ``const char *__restrict__ src``h]j)}(hjuh]hconst char *__restrict__ src}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chKhjuubj2)}(hhh]h)}(hLpointer to the beginning of string being copied from. Must not overlap dest.h]hLpointer to the beginning of string being copied from. Must not overlap dest.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chKhjvubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjvhKhjuubeh}(h]h ]h"]h$]h&]uh1j hjuubh)}(h**Description**h]j)}(hj;vh]h Description}(hj=vhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9vubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chKhjuubh)}(hXstpcpy differs from strcpy in a key way: the return value is a pointer to the new ``NUL-terminating`` character in **dest**. (For strcpy, the return value is a pointer to the start of **dest**). This interface is considered unsafe as it doesn't perform bounds checking of the inputs. As such it's not recommended for usage. Instead, its definition is provided in case the compiler lowers other libcalls to stpcpy.h](hRstpcpy differs from strcpy in a key way: the return value is a pointer to the new }(hjQvhhhNhNubj)}(h``NUL-terminating``h]hNUL-terminating}(hjYvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQvubh character in }(hjQvhhhNhNubj)}(h**dest**h]hdest}(hjkvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQvubh=. (For strcpy, the return value is a pointer to the start of }(hjQvhhhNhNubj)}(h**dest**h]hdest}(hj}vhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQvubh). This interface is considered unsafe as it doesn’t perform bounds checking of the inputs. As such it’s not recommended for usage. Instead, its definition is provided in case the compiler lowers other libcalls to stpcpy.}(hjQvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chKhjuubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strcmp (C function)c.strcmphNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h+int strcmp (const char *cs, const char *ct)h]j)}(h*int strcmp(const char *cs, const char *ct)h](j )}(hinth]hint}(hjvhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjvhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvhhhjvhMubj{)}(hstrcmph]j)}(hstrcmph]hstrcmp}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjvhhhjvhMubj)}(h (const char *cs, const char *ct)h](j)}(hconst char *csh](j)}(hjh]hconst}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubj )}(hcharh]hchar}(hjwhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjvubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubj)}(hjh]h*}(hj*whhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj)}(hcsh]hcs}(hj7whhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubj)}(hconst char *cth](j)}(hjh]hconst}(hjPwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLwubj2)}(h h]h }(hj]whhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLwubj )}(hcharh]hchar}(hjkwhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLwubj2)}(h h]h }(hjywhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLwubj)}(hjh]h*}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLwubj)}(hcth]hct}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubeh}(h]h ]h"]h$]h&]jjuh1jhjvhhhjvhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjvhhhjvhMubah}(h]jvah ](jjeh"]h$]h&]jj)jhuh1jhjvhMhjvhhubj)}(hhh]h)}(hCompare two stringsh]hCompare two strings}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjwhhubah}(h]h ]h"]h$]h&]uh1jhjvhhhjvhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjwjjwjjjuh1jhhhjC`hNhNubj)}(hT**Parameters** ``const char *cs`` One string ``const char *ct`` Another stringh](h)}(h**Parameters**h]j)}(hjwh]h Parameters}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjwubj )}(hhh](j)}(h``const char *cs`` One string h](j)}(h``const char *cs``h]j)}(hjwh]hconst char *cs}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjwubj2)}(hhh]h)}(h One stringh]h One string}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhMhjxubah}(h]h ]h"]h$]h&]uh1j1hjwubeh}(h]h ]h"]h$]h&]uh1jhjxhMhjwubj)}(h!``const char *ct`` Another stringh](j)}(h``const char *ct``h]j)}(hj8xh]hconst char *ct}(hj:xhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6xubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj2xubj2)}(hhh]h)}(hAnother stringh]hAnother string}(hjQxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjNxubah}(h]h ]h"]h$]h&]uh1j1hj2xubeh}(h]h ]h"]h$]h&]uh1jhjMxhMhjwubeh}(h]h ]h"]h$]h&]uh1j hjwubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strncmp (C function) c.strncmphNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h:int strncmp (const char *cs, const char *ct, size_t count)h]j)}(h9int strncmp(const char *cs, const char *ct, size_t count)h](j )}(hinth]hint}(hjxhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjxhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hjxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxhhhjxhMubj{)}(hstrncmph]j)}(hstrncmph]hstrncmp}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjxhhhjxhMubj)}(h.(const char *cs, const char *ct, size_t count)h](j)}(hconst char *csh](j)}(hjh]hconst}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj2)}(h h]h }(hjxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubj )}(hcharh]hchar}(hjxhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjxubj2)}(h h]h }(hjxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(hcsh]hcs}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjxubj)}(hconst char *cth](j)}(hjh]hconst}(hj,yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(yubj2)}(h h]h }(hj9yhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(yubj )}(hcharh]hchar}(hjGyhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj(yubj2)}(h h]h }(hjUyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(yubj)}(hjh]h*}(hjcyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(yubj)}(hcth]hct}(hjpyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(yubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjxubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjymodnameN classnameNj] j` )}jc ]jf )}jY jxsb c.strncmpasbuh1hhjyubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyubj)}(hcounth]hcount}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjxubeh}(h]h ]h"]h$]h&]jjuh1jhjxhhhjxhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjxhhhjxhMubah}(h]jxah ](jjeh"]h$]h&]jj)jhuh1jhjxhMhjxhhubj)}(hhh]h)}(h"Compare two length-limited stringsh]h"Compare two length-limited strings}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjyhhubah}(h]h ]h"]h$]h&]uh1jhjxhhhjxhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjyjjyjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const char *cs`` One string ``const char *ct`` Another string ``size_t count`` The maximum number of bytes to compareh](h)}(h**Parameters**h]j)}(hjzh]h Parameters}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjzubj )}(hhh](j)}(h``const char *cs`` One string h](j)}(h``const char *cs``h]j)}(hj%zh]hconst char *cs}(hj'zhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#zubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjzubj2)}(hhh]h)}(h One stringh]h One string}(hj>zhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:zhMhj;zubah}(h]h ]h"]h$]h&]uh1j1hjzubeh}(h]h ]h"]h$]h&]uh1jhj:zhMhjzubj)}(h"``const char *ct`` Another string h](j)}(h``const char *ct``h]j)}(hj^zh]hconst char *ct}(hj`zhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\zubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjXzubj2)}(hhh]h)}(hAnother stringh]hAnother string}(hjwzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjszhMhjtzubah}(h]h ]h"]h$]h&]uh1j1hjXzubeh}(h]h ]h"]h$]h&]uh1jhjszhMhjzubj)}(h7``size_t count`` The maximum number of bytes to compareh](j)}(h``size_t count``h]j)}(hjzh]h size_t count}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjzubj2)}(hhh]h)}(h&The maximum number of bytes to compareh]h&The maximum number of bytes to compare}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjzubah}(h]h ]h"]h$]h&]uh1j1hjzubeh}(h]h ]h"]h$]h&]uh1jhjzhMhjzubeh}(h]h ]h"]h$]h&]uh1j hjzubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strchr (C function)c.strchrhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h$char * strchr (const char *s, int c)h]j)}(h"char *strchr(const char *s, int c)h](j )}(hcharh]hchar}(hjzhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjzhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM0ubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjzhhhjzhM0ubj)}(hjh]h*}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzhhhjzhM0ubj{)}(hstrchrh]j)}(hstrchrh]hstrchr}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjzhhhjzhM0ubj)}(h(const char *s, int c)h](j)}(h const char *sh](j)}(hjh]hconst}(hj;{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7{ubj2)}(h h]h }(hjH{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7{ubj )}(hcharh]hchar}(hjV{hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj7{ubj2)}(h h]h }(hjd{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7{ubj)}(hjh]h*}(hjr{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7{ubj)}(hjY)h]hs}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3{ubj)}(hint ch](j )}(hinth]hint}(hj{hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj{ubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubj)}(hjh]hc}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3{ubeh}(h]h ]h"]h$]h&]jjuh1jhjzhhhjzhM0ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjzhhhjzhM0ubah}(h]jzah ](jjeh"]h$]h&]jj)jhuh1jhjzhM0hjzhhubj)}(hhh]h)}(h4Find the first occurrence of a character in a stringh]h4Find the first occurrence of a character in a string}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM0hj{hhubah}(h]h ]h"]h$]h&]uh1jhjzhhhjzhM0ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj{jj{jjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const char *s`` The string to be searched ``int c`` The character to search for **Description** Note that the ``NUL-terminator`` is considered part of the string, and can be searched for.h](h)}(h**Parameters**h]j)}(hj{h]h Parameters}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM4hj{ubj )}(hhh](j)}(h,``const char *s`` The string to be searched h](j)}(h``const char *s``h]j)}(hj|h]h const char *s}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM1hj|ubj2)}(hhh]h)}(hThe string to be searchedh]hThe string to be searched}(hj6|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2|hM1hj3|ubah}(h]h ]h"]h$]h&]uh1j1hj|ubeh}(h]h ]h"]h$]h&]uh1jhj2|hM1hj|ubj)}(h&``int c`` The character to search for h](j)}(h ``int c``h]j)}(hjV|h]hint c}(hjX|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT|ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM2hjP|ubj2)}(hhh]h)}(hThe character to search forh]hThe character to search for}(hjo|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjk|hM2hjl|ubah}(h]h ]h"]h$]h&]uh1j1hjP|ubeh}(h]h ]h"]h$]h&]uh1jhjk|hM2hj|ubeh}(h]h ]h"]h$]h&]uh1j hj{ubh)}(h**Description**h]j)}(hj|h]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM4hj{ubh)}(h[Note that the ``NUL-terminator`` is considered part of the string, and can be searched for.h](hNote that the }(hj|hhhNhNubj)}(h``NUL-terminator``h]hNUL-terminator}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubh; is considered part of the string, and can be searched for.}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM3hj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strchrnul (C function) c.strchrnulhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h'char * strchrnul (const char *s, int c)h]j)}(h%char *strchrnul(const char *s, int c)h](j )}(hcharh]hchar}(hj|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj|hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMCubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|hhhj|hMCubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|hhhj|hMCubj{)}(h strchrnulh]j)}(h strchrnulh]h strchrnul}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj|hhhj|hMCubj)}(h(const char *s, int c)h](j)}(h const char *sh](j)}(hjh]hconst}(hj2}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.}ubj2)}(h h]h }(hj?}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.}ubj )}(hcharh]hchar}(hjM}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.}ubj2)}(h h]h }(hj[}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.}ubj)}(hjh]h*}(hji}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.}ubj)}(hjY)h]hs}(hjv}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*}ubj)}(hint ch](j )}(hinth]hint}(hj}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj)}(hjh]hc}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*}ubeh}(h]h ]h"]h$]h&]jjuh1jhj|hhhj|hMCubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj|hhhj|hMCubah}(h]j|ah ](jjeh"]h$]h&]jj)jhuh1jhj|hMChj|hhubj)}(hhh]h)}(h9Find and return a character in a string, or end of stringh]h9Find and return a character in a string, or end of string}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMChj}hhubah}(h]h ]h"]h$]h&]uh1jhj|hhhj|hMCubeh}(h]h ](jfunctioneh"]h$]h&]jjjj}jj}jjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const char *s`` The string to be searched ``int c`` The character to search for **Description** Returns pointer to first occurrence of 'c' in s. If c is not found, then return a pointer to the null byte at the end of s.h](h)}(h**Parameters**h]j)}(hj}h]h Parameters}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMGhj}ubj )}(hhh](j)}(h,``const char *s`` The string to be searched h](j)}(h``const char *s``h]j)}(hj~h]h const char *s}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMDhj~ubj2)}(hhh]h)}(hThe string to be searchedh]hThe string to be searched}(hj-~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)~hMDhj*~ubah}(h]h ]h"]h$]h&]uh1j1hj~ubeh}(h]h ]h"]h$]h&]uh1jhj)~hMDhj ~ubj)}(h&``int c`` The character to search for h](j)}(h ``int c``h]j)}(hjM~h]hint c}(hjO~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK~ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMEhjG~ubj2)}(hhh]h)}(hThe character to search forh]hThe character to search for}(hjf~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb~hMEhjc~ubah}(h]h ]h"]h$]h&]uh1j1hjG~ubeh}(h]h ]h"]h$]h&]uh1jhjb~hMEhj ~ubeh}(h]h ]h"]h$]h&]uh1j hj}ubh)}(h**Description**h]j)}(hj~h]h Description}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMGhj}ubh)}(h{Returns pointer to first occurrence of 'c' in s. If c is not found, then return a pointer to the null byte at the end of s.h]hReturns pointer to first occurrence of ‘c’ in s. If c is not found, then return a pointer to the null byte at the end of s.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMFhj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strrchr (C function) c.strrchrhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h%char * strrchr (const char *s, int c)h]j)}(h#char *strrchr(const char *s, int c)h](j )}(hcharh]hchar}(hj~hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMfubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~hhhj~hMfubj)}(hjh]h*}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~hhhj~hMfubj{)}(hstrrchrh]j)}(hstrrchrh]hstrrchr}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj~hhhj~hMfubj)}(h(const char *s, int c)h](j)}(h const char *sh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjY)h]hs}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint ch](j )}(hinth]hint}(hjshhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjoubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjoubj)}(hjh]hc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj~hhhj~hMfubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj~hhhj~hMfubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhj~hMfhj~hhubj)}(hhh]h)}(h3Find the last occurrence of a character in a string8h]h3Find the last occurrence of a character in a string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMfhjhhubah}(h]h ]h"]h$]h&]uh1jhj~hhhj~hMfubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(hf**Parameters** ``const char *s`` The string to be searched ``int c`` The character to search forh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMjhjubj )}(hhh](j)}(h,``const char *s`` The string to be searched h](j)}(h``const char *s``h]j)}(hjh]h const char *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMghjubj2)}(hhh]h)}(hThe string to be searchedh]hThe string to be searched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMghjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMghjubj)}(h%``int c`` The character to search forh](j)}(h ``int c``h]j)}(hj2h]hint c}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMihj,ubj2)}(hhh]h)}(hThe character to search forh]hThe character to search for}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhhjHubah}(h]h ]h"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]uh1jhjGhMihjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strnchr (C function) c.strnchrhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h3char * strnchr (const char *s, size_t count, int c)h]j)}(h1char *strnchr(const char *s, size_t count, int c)h](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMxubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMxubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMxubj{)}(hstrnchrh]j)}(hstrnchrh]hstrnchr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMxubj)}(h$(const char *s, size_t count, int c)h](j)}(h const char *sh](j)}(hjh]hconst}(hjրhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjҀubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjҀubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjҀubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjҀubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjҀubj)}(hjY)h]hs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjҀubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj΀ubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7modnameN classnameNj] j` )}jc ]jf )}jY jsb c.strnchrasbuh1hhj.ubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hcounth]hcount}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj΀ubj)}(hint ch](j )}(hinth]hint}(hj|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjxubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubj)}(hjh]hc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj΀ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMxubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMxubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMxhjhhubj)}(hhh]h)}(h+Find a character in a length limited stringh]h+Find a character in a length limited string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMxhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMxubeh}(h]h ](jfunctioneh"]h$]h&]jjjjفjjفjjjuh1jhhhjC`hNhNubj)}(hX**Parameters** ``const char *s`` The string to be searched ``size_t count`` The number of characters to be searched ``int c`` The character to search for **Description** Note that the ``NUL-terminator`` is considered part of the string, and can be searched for.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM|hj݁ubj )}(hhh](j)}(h,``const char *s`` The string to be searched h](j)}(h``const char *s``h]j)}(hjh]h const char *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMyhjubj2)}(hhh]h)}(hThe string to be searchedh]hThe string to be searched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMyhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMyhjubj)}(h9``size_t count`` The number of characters to be searched h](j)}(h``size_t count``h]j)}(hj;h]h size_t count}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMzhj5ubj2)}(hhh]h)}(h'The number of characters to be searchedh]h'The number of characters to be searched}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhMzhjQubah}(h]h ]h"]h$]h&]uh1j1hj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhMzhjubj)}(h&``int c`` The character to search for h](j)}(h ``int c``h]j)}(hjth]hint c}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM{hjnubj2)}(hhh]h)}(hThe character to search forh]hThe character to search for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM{hjubah}(h]h ]h"]h$]h&]uh1j1hjnubeh}(h]h ]h"]h$]h&]uh1jhjhM{hjubeh}(h]h ]h"]h$]h&]uh1j hj݁ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM}hj݁ubh)}(h[Note that the ``NUL-terminator`` is considered part of the string, and can be searched for.h](hNote that the }(hjłhhhNhNubj)}(h``NUL-terminator``h]hNUL-terminator}(hj͂hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjłubh; is considered part of the string, and can be searched for.}(hjłhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM|hj݁ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strspn (C function)c.strspnhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h1size_t strspn (const char *s, const char *accept)h]j)}(h0size_t strspn(const char *s, const char *accept)h](h)}(hhh]j)}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY strspnsbc.strspnasbuh1hhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj*hMubj{)}(hstrspnh]j)}(hj'h]hstrspn}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj*hMubj)}(h#(const char *s, const char *accept)h](j)}(h const char *sh](j)}(hjh]hconst}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj )}(hcharh]hchar}(hjshhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjTubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hjY)h]hs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(hconst char *accepth](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjσhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj݃hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haccepth]haccept}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj*hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj*hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj*hMhjhhubj)}(hhh]h)}(h_Calculate the length of the initial substring of **s** which only contain letters in **accept**h](h1Calculate the length of the initial substring of }(hj"hhhNhNubj)}(h**s**h]hs}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh which only contain letters in }(hj"hhhNhNubj)}(h **accept**h]haccept}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj*hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjZjjZjjjuh1jhhhjC`hNhNubj)}(hp**Parameters** ``const char *s`` The string to be searched ``const char *accept`` The string to search forh](h)}(h**Parameters**h]j)}(hjdh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj^ubj )}(hhh](j)}(h,``const char *s`` The string to be searched h](j)}(h``const char *s``h]j)}(hjh]h const char *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj}ubj2)}(hhh]h)}(hThe string to be searchedh]hThe string to be searched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjzubj)}(h/``const char *accept`` The string to search forh](j)}(h``const char *accept``h]j)}(hjh]hconst char *accept}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hThe string to search forh]hThe string to search for}(hjՄhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj҄ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjфhMhjzubeh}(h]h ]h"]h$]h&]uh1j hj^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strcspn (C function) c.strcspnhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h2size_t strcspn (const char *s, const char *reject)h]j)}(h1size_t strcspn(const char *s, const char *reject)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY strcspnsb c.strcspnasbuh1hhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj:hMubj{)}(hstrcspnh]j)}(hj7h]hstrcspn}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj:hMubj)}(h#(const char *s, const char *reject)h](j)}(h const char *sh](j)}(hjh]hconst}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hjY)h]hs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj`ubj)}(hconst char *rejecth](j)}(hjh]hconst}(hjąhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjхhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj߅hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrejecth]hreject}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj`ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj:hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj:hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj:hMhj hhubj)}(hhh]h)}(hcCalculate the length of the initial substring of **s** which does not contain letters in **reject**h](h1Calculate the length of the initial substring of }(hj2hhhNhNubj)}(h**s**h]hs}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh# which does not contain letters in }(hj2hhhNhNubj)}(h **reject**h]hreject}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj/hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj:hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjjjuh1jhhhjC`hNhNubj)}(hk**Parameters** ``const char *s`` The string to be searched ``const char *reject`` The string to avoidh](h)}(h**Parameters**h]j)}(hjth]h Parameters}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjnubj )}(hhh](j)}(h,``const char *s`` The string to be searched h](j)}(h``const char *s``h]j)}(hjh]h const char *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hThe string to be searchedh]hThe string to be searched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h*``const char *reject`` The string to avoidh](j)}(h``const char *reject``h]j)}(hj̆h]hconst char *reject}(hjΆhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjʆubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjƆubj2)}(hhh]h)}(hThe string to avoidh]hThe string to avoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubah}(h]h ]h"]h$]h&]uh1j1hjƆubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjnubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strpbrk (C function) c.strpbrkhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h/char * strpbrk (const char *cs, const char *ct)h]j)}(h-char *strpbrk(const char *cs, const char *ct)h](j )}(hcharh]hchar}(hj&hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj"hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"hhhj4hMubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhj4hMubj{)}(hstrpbrkh]j)}(hstrpbrkh]hstrpbrk}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj"hhhj4hMubj)}(h (const char *cs, const char *ct)h](j)}(hconst char *csh](j)}(hjh]hconst}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjlubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hcsh]hcs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubj)}(hconst char *cth](j)}(hjh]hconst}(hj͇hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɇubj2)}(h h]h }(hjڇhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjɇubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjɇubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjɇubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɇubj)}(hcth]hct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɇubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubeh}(h]h ]h"]h$]h&]jjuh1jhj"hhhj4hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj4hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj4hMhjhhubj)}(hhh]h)}(h0Find the first occurrence of a set of charactersh]h0Find the first occurrence of a set of characters}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj8hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj4hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjSjjSjjjuh1jhhhjC`hNhNubj)}(hq**Parameters** ``const char *cs`` The string to be searched ``const char *ct`` The characters to search forh](h)}(h**Parameters**h]j)}(hj]h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjWubj )}(hhh](j)}(h-``const char *cs`` The string to be searched h](j)}(h``const char *cs``h]j)}(hj|h]hconst char *cs}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjvubj2)}(hhh]h)}(hThe string to be searchedh]hThe string to be searched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhMhjsubj)}(h/``const char *ct`` The characters to search forh](j)}(h``const char *ct``h]j)}(hjh]hconst char *ct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hThe characters to search forh]hThe characters to search for}(hjΈhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjˈubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjʈhMhjsubeh}(h]h ]h"]h$]h&]uh1j hjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strsep (C function)c.strsephNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h(char * strsep (char **s, const char *ct)h]j)}(h&char *strsep(char **s, const char *ct)h](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhMubj)}(hjh]h*}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMubj{)}(hstrseph]j)}(hstrseph]hstrsep}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhMubj)}(h(char **s, const char *ct)h](j)}(hchar **sh](j )}(hcharh]hchar}(hjYhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj)}(hjh]h*}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(hjY)h]hs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubj)}(hconst char *cth](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj‰hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjЉhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjމhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcth]hct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hSplit a string into tokensh]hSplit a string into tokens}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj-jj-jjjuh1jhhhjC`hNhNubj)}(hXt**Parameters** ``char **s`` The string to be searched ``const char *ct`` The characters to search for **Description** strsep() updates **s** to point after the token, ready for the next call. It returns empty tokens, too, behaving exactly like the libc function of that name. In fact, it was stolen from glibc2 and de-fancy-fied. Same semantics, slimmer shape. ;)h](h)}(h**Parameters**h]j)}(hj7h]h Parameters}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj1ubj )}(hhh](j)}(h'``char **s`` The string to be searched h](j)}(h ``char **s``h]j)}(hjVh]hchar **s}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjPubj2)}(hhh]h)}(hThe string to be searchedh]hThe string to be searched}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMhjlubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhjkhMhjMubj)}(h0``const char *ct`` The characters to search for h](j)}(h``const char *ct``h]j)}(hjh]hconst char *ct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hThe characters to search forh]hThe characters to search for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjMubeh}(h]h ]h"]h$]h&]uh1j hj1ubh)}(h**Description**h]j)}(hjʊh]h Description}(hj̊hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȊubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj1ubh)}(hIstrsep() updates **s** to point after the token, ready for the next call.h](hstrsep() updates }(hjhhhNhNubj)}(h**s**h]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh3 to point after the token, ready for the next call.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj1ubh)}(hIt returns empty tokens, too, behaving exactly like the libc function of that name. In fact, it was stolen from glibc2 and de-fancy-fied. Same semantics, slimmer shape. ;)h]hIt returns empty tokens, too, behaving exactly like the libc function of that name. In fact, it was stolen from glibc2 and de-fancy-fied. Same semantics, slimmer shape. ;)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memset (C function)c.memsethNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h,void * memset (void *s, int c, size_t count)h]j)}(h*void *memset(void *s, int c, size_t count)h](j )}(hvoidh]hvoid}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj,hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,hhhj>hMubj)}(hjh]h*}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhhj>hMubj{)}(hmemseth]j)}(hmemseth]hmemset}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj,hhhj>hMubj)}(h(void *s, int c, size_t count)h](j)}(hvoid *sh](j )}(hvoidh]hvoid}(hjzhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjvubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj)}(hjY)h]hs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjrubj)}(hint ch](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjɋhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]hc}(hj׋hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjrubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j`sbc.memsetasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcounth]hcount}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjrubeh}(h]h ]h"]h$]h&]jjuh1jhj,hhhj>hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj(hhhj>hMubah}(h]j#ah ](jjeh"]h$]h&]jj)jhuh1jhj>hMhj%hhubj)}(hhh]h)}(h,Fill a region of memory with the given valueh]h,Fill a region of memory with the given value}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjGhhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj>hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbjjbjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``void *s`` Pointer to the start of the area. ``int c`` The byte to fill the area with ``size_t count`` The size of the area. **Description** Do not use memset() to access IO space, use memset_io() instead.h](h)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjfubj )}(hhh](j)}(h.``void *s`` Pointer to the start of the area. h](j)}(h ``void *s``h]j)}(hjh]hvoid *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(h!Pointer to the start of the area.h]h!Pointer to the start of the area.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h)``int c`` The byte to fill the area with h](j)}(h ``int c``h]j)}(hjČh]hint c}(hjƌhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjŒubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hThe byte to fill the area withh]hThe byte to fill the area with}(hj݌hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjٌhMhjڌubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjٌhMhjubj)}(h'``size_t count`` The size of the area. h](j)}(h``size_t count``h]j)}(hjh]h size_t count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hThe size of the area.h]hThe size of the area.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjfubh)}(h**Description**h]j)}(hj8h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjfubh)}(h@Do not use memset() to access IO space, use memset_io() instead.h]h@Do not use memset() to access IO space, use memset_io() instead.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memset16 (C function) c.memset16hNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h7void * memset16 (uint16_t *s, uint16_t v, size_t count)h]j)}(h5void *memset16(uint16_t *s, uint16_t v, size_t count)h](j )}(hvoidh]hvoid}(hj}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjyhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyhhhjhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhjhMubj{)}(hmemset16h]j)}(hmemset16h]hmemset16}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjyhhhjhMubj)}(h'(uint16_t *s, uint16_t v, size_t count)h](j)}(h uint16_t *sh](h)}(hhh]j)}(huint16_th]huint16_t}(hjʍhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǍubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj̍modnameN classnameNj] j` )}jc ]jf )}jY jsb c.memset16asbuh1hhjÍubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjÍubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjÍubj)}(hjY)h]hs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjÍubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h uint16_t vh](h)}(hhh]j)}(huint16_th]huint16_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj"modnameN classnameNj] j` )}jc ]j c.memset16asbuh1hhjubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hvh]hv}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjjmodnameN classnameNj] j` )}jc ]j c.memset16asbuh1hhjaubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjyhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjuhhhjhMubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjrhhubj)}(hhh]h)}(h"Fill a memory area with a uint16_th]h"Fill a memory area with a uint16_t}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjrhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj֎jj֎jjjuh1jhhhjC`hNhNubj)}(hXZ**Parameters** ``uint16_t *s`` Pointer to the start of the area. ``uint16_t v`` The value to fill the area with ``size_t count`` The number of values to store **Description** Differs from memset() in that it fills with a uint16_t instead of a byte. Remember that **count** is the number of uint16_ts to store, not the number of bytes.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjގubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjڎubj )}(hhh](j)}(h2``uint16_t *s`` Pointer to the start of the area. h](j)}(h``uint16_t *s``h]j)}(hjh]h uint16_t *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(h!Pointer to the start of the area.h]h!Pointer to the start of the area.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h/``uint16_t v`` The value to fill the area with h](j)}(h``uint16_t v``h]j)}(hj8h]h uint16_t v}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj2ubj2)}(hhh]h)}(hThe value to fill the area withh]hThe value to fill the area with}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMhjNubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhMhjubj)}(h/``size_t count`` The number of values to store h](j)}(h``size_t count``h]j)}(hjqh]h size_t count}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjkubj2)}(hhh]h)}(hThe number of values to storeh]hThe number of values to store}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjkubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjڎubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjڎubh)}(hDiffers from memset() in that it fills with a uint16_t instead of a byte. Remember that **count** is the number of uint16_ts to store, not the number of bytes.h](hYDiffers from memset() in that it fills with a uint16_t instead of a byte. Remember that }(hjhhhNhNubj)}(h **count**h]hcount}(hjʏhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh> is the number of uint16_ts to store, not the number of bytes.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjڎubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memset32 (C function) c.memset32hNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h7void * memset32 (uint32_t *s, uint32_t v, size_t count)h]j)}(h5void *memset32(uint32_t *s, uint32_t v, size_t count)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM'ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM'ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM'ubj{)}(hmemset32h]j)}(hmemset32h]hmemset32}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM'ubj)}(h'(uint32_t *s, uint32_t v, size_t count)h](j)}(h uint32_t *sh](h)}(hhh]j)}(huint32_th]huint32_t}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjRmodnameN classnameNj] j` )}jc ]jf )}jY j3sb c.memset32asbuh1hhjIubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjh]h*}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hjY)h]hs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubj)}(h uint32_t vh](h)}(hhh]j)}(huint32_th]huint32_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jl c.memset32asbuh1hhjubj2)}(h h]h }(hjĐhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjNh]hv}(hjҐhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jl c.memset32asbuh1hhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM'ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM'ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM'hjhhubj)}(hhh]h)}(h"Fill a memory area with a uint32_th]h"Fill a memory area with a uint32_t}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM'hj@hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM'ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[jj[jjjuh1jhhhjC`hNhNubj)}(hXZ**Parameters** ``uint32_t *s`` Pointer to the start of the area. ``uint32_t v`` The value to fill the area with ``size_t count`` The number of values to store **Description** Differs from memset() in that it fills with a uint32_t instead of a byte. Remember that **count** is the number of uint32_ts to store, not the number of bytes.h](h)}(h**Parameters**h]j)}(hjeh]h Parameters}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM+hj_ubj )}(hhh](j)}(h2``uint32_t *s`` Pointer to the start of the area. h](j)}(h``uint32_t *s``h]j)}(hjh]h uint32_t *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM(hj~ubj2)}(hhh]h)}(h!Pointer to the start of the area.h]h!Pointer to the start of the area.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM(hjubah}(h]h ]h"]h$]h&]uh1j1hj~ubeh}(h]h ]h"]h$]h&]uh1jhjhM(hj{ubj)}(h/``uint32_t v`` The value to fill the area with h](j)}(h``uint32_t v``h]j)}(hjh]h uint32_t v}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM)hjubj2)}(hhh]h)}(hThe value to fill the area withh]hThe value to fill the area with}(hj֑hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjґhM)hjӑubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjґhM)hj{ubj)}(h/``size_t count`` The number of values to store h](j)}(h``size_t count``h]j)}(hjh]h size_t count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM*hjubj2)}(hhh]h)}(hThe number of values to storeh]hThe number of values to store}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM*hj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hM*hj{ubeh}(h]h ]h"]h$]h&]uh1j hj_ubh)}(h**Description**h]j)}(hj1h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM,hj_ubh)}(hDiffers from memset() in that it fills with a uint32_t instead of a byte. Remember that **count** is the number of uint32_ts to store, not the number of bytes.h](hYDiffers from memset() in that it fills with a uint32_t instead of a byte. Remember that }(hjGhhhNhNubj)}(h **count**h]hcount}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubh> is the number of uint32_ts to store, not the number of bytes.}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM+hj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memset64 (C function) c.memset64hNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h7void * memset64 (uint64_t *s, uint64_t v, size_t count)h]j)}(h5void *memset64(uint64_t *s, uint64_t v, size_t count)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM=ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM=ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM=ubj{)}(hmemset64h]j)}(hmemset64h]hmemset64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM=ubj)}(h'(uint64_t *s, uint64_t v, size_t count)h](j)}(h uint64_t *sh](h)}(hhh]j)}(huint64_th]huint64_t}(hjՒhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjҒubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjגmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.memset64asbuh1hhjΒubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjΒubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjΒubj)}(hjY)h]hs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjΒubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjʒubj)}(h uint64_t vh](h)}(hhh]j)}(huint64_th]huint64_t}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj-modnameN classnameNj] j` )}jc ]j c.memset64asbuh1hhj$ubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(hjNh]hv}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjʒubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]j c.memset64asbuh1hhjkubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubj)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjʒubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM=ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM=ubah}(h]j{ah ](jjeh"]h$]h&]jj)jhuh1jhjhM=hj}hhubj)}(hhh]h)}(h"Fill a memory area with a uint64_th]h"Fill a memory area with a uint64_t}(hjȓhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM=hjœhhubah}(h]h ]h"]h$]h&]uh1jhj}hhhjhM=ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(hXZ**Parameters** ``uint64_t *s`` Pointer to the start of the area. ``uint64_t v`` The value to fill the area with ``size_t count`` The number of values to store **Description** Differs from memset() in that it fills with a uint64_t instead of a byte. Remember that **count** is the number of uint64_ts to store, not the number of bytes.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMAhjubj )}(hhh](j)}(h2``uint64_t *s`` Pointer to the start of the area. h](j)}(h``uint64_t *s``h]j)}(hj h]h uint64_t *s}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM>hjubj2)}(hhh]h)}(h!Pointer to the start of the area.h]h!Pointer to the start of the area.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM>hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM>hjubj)}(h/``uint64_t v`` The value to fill the area with h](j)}(h``uint64_t v``h]j)}(hjBh]h uint64_t v}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM?hj<ubj2)}(hhh]h)}(hThe value to fill the area withh]hThe value to fill the area with}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhM?hjXubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhjWhM?hjubj)}(h/``size_t count`` The number of values to store h](j)}(h``size_t count``h]j)}(hj{h]h size_t count}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM@hjuubj2)}(hhh]h)}(hThe number of values to storeh]hThe number of values to store}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM@hjubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjhM@hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMBhjubh)}(hDiffers from memset() in that it fills with a uint64_t instead of a byte. Remember that **count** is the number of uint64_ts to store, not the number of bytes.h](hYDiffers from memset() in that it fills with a uint64_t instead of a byte. Remember that }(hj̔hhhNhNubj)}(h **count**h]hcount}(hjԔhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̔ubh> is the number of uint64_ts to store, not the number of bytes.}(hj̔hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMAhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memcpy (C function)c.memcpyhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h9void * memcpy (void *dest, const void *src, size_t count)h]j)}(h7void *memcpy(void *dest, const void *src, size_t count)h](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMSubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhMSubj)}(hjh]h*}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMSubj{)}(hmemcpyh]j)}(hmemcpyh]hmemcpy}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhMSubj)}(h+(void *dest, const void *src, size_t count)h](j)}(h void *desth](j )}(hvoidh]hvoid}(hjWhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjSubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hjh]h*}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj)}(hdesth]hdest}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubj)}(hconst void *srch](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj•hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjЕhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsrch]hsrc}(hjݕhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j=sbc.memcpyasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcounth]hcount}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhjhMSubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMSubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMShjhhubj)}(hhh]h)}(h"Copy one area of memory to anotherh]h"Copy one area of memory to another}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMShjNhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMSubeh}(h]h ](jfunctioneh"]h$]h&]jjjjijjijjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``void *dest`` Where to copy to ``const void *src`` Where to copy from ``size_t count`` The size of the area. **Description** You should not use this function to access IO space, use memcpy_toio() or memcpy_fromio() instead.h](h)}(h**Parameters**h]j)}(hjsh]h Parameters}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMWhjmubj )}(hhh](j)}(h ``void *dest`` Where to copy to h](j)}(h``void *dest``h]j)}(hjh]h void *dest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMThjubj2)}(hhh]h)}(hWhere to copy toh]hWhere to copy to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMThjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMThjubj)}(h'``const void *src`` Where to copy from h](j)}(h``const void *src``h]j)}(hj˖h]hconst void *src}(hj͖hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɖubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMUhjŖubj2)}(hhh]h)}(hWhere to copy fromh]hWhere to copy from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMUhjubah}(h]h ]h"]h$]h&]uh1j1hjŖubeh}(h]h ]h"]h$]h&]uh1jhjhMUhjubj)}(h'``size_t count`` The size of the area. h](j)}(h``size_t count``h]j)}(hjh]h size_t count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMVhjubj2)}(hhh]h)}(hThe size of the area.h]hThe size of the area.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMVhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMVhjubeh}(h]h ]h"]h$]h&]uh1j hjmubh)}(h**Description**h]j)}(hj?h]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMXhjmubh)}(hbYou should not use this function to access IO space, use memcpy_toio() or memcpy_fromio() instead.h]hbYou should not use this function to access IO space, use memcpy_toio() or memcpy_fromio() instead.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMWhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memmove (C function) c.memmovehNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h:void * memmove (void *dest, const void *src, size_t count)h]j)}(h8void *memmove(void *dest, const void *src, size_t count)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMiubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMiubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMiubj{)}(hmemmoveh]j)}(hmemmoveh]hmemmove}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMiubj)}(h+(void *dest, const void *src, size_t count)h](j)}(h void *desth](j )}(hvoidh]hvoid}(hjΗhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjʗubj2)}(h h]h }(hjܗhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjʗubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjʗubj)}(hdesth]hdest}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjʗubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjƗubj)}(hconst void *srch](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hvoidh]hvoid}(hj+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hsrch]hsrc}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjƗubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjrmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.memmoveasbuh1hhjiubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiubj)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjƗubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMiubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj|hhhjhMiubah}(h]jwah ](jjeh"]h$]h&]jj)jhuh1jhjhMihjyhhubj)}(hhh]h)}(h"Copy one area of memory to anotherh]h"Copy one area of memory to another}(hjȘhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMihjŘhhubah}(h]h ]h"]h$]h&]uh1jhjyhhhjhMiubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``void *dest`` Where to copy to ``const void *src`` Where to copy from ``size_t count`` The size of the area. **Description** Unlike memcpy(), memmove() copes with overlapping areas.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMmhjubj )}(hhh](j)}(h ``void *dest`` Where to copy to h](j)}(h``void *dest``h]j)}(hj h]h void *dest}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMjhjubj2)}(hhh]h)}(hWhere to copy toh]hWhere to copy to}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMjhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMjhjubj)}(h'``const void *src`` Where to copy from h](j)}(h``const void *src``h]j)}(hjBh]hconst void *src}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMkhj<ubj2)}(hhh]h)}(hWhere to copy fromh]hWhere to copy from}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMkhjXubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhjWhMkhjubj)}(h'``size_t count`` The size of the area. h](j)}(h``size_t count``h]j)}(hj{h]h size_t count}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMlhjuubj2)}(hhh]h)}(hThe size of the area.h]hThe size of the area.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMlhjubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjhMlhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMnhjubh)}(h8Unlike memcpy(), memmove() copes with overlapping areas.h]h8Unlike memcpy(), memmove() copes with overlapping areas.}(hj̙hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMmhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memcmp (C function)c.memcmphNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hC__visible int memcmp (const void *cs, const void *ct, size_t count)h]j)}(hB__visible int memcmp(const void *cs, const void *ct, size_t count)h](h __visible}(hjhhhNhNubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhj hMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj hMubj{)}(hmemcmph]j)}(hmemcmph]hmemcmp}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj hMubj)}(h.(const void *cs, const void *ct, size_t count)h](j)}(hconst void *csh](j)}(hjh]hconst}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj )}(hvoidh]hvoid}(hjehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjFubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hcsh]hcs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubj)}(hconst void *cth](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hjšhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjКhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjޚhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcth]hct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY j0sbc.memcmpasbuh1hhjubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcounth]hcount}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hMhjhhubj)}(hhh]h)}(hCompare two areas of memoryh]hCompare two areas of memory}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj\hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjwjjwjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const void *cs`` One area of memory ``const void *ct`` Another area of memory ``size_t count`` The size of the area.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj{ubj )}(hhh](j)}(h&``const void *cs`` One area of memory h](j)}(h``const void *cs``h]j)}(hjh]hconst void *cs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hOne area of memoryh]hOne area of memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h*``const void *ct`` Another area of memory h](j)}(h``const void *ct``h]j)}(hjٛh]hconst void *ct}(hjۛhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjכubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjӛubj2)}(hhh]h)}(hAnother area of memoryh]hAnother area of memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjӛubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h&``size_t count`` The size of the area.h](j)}(h``size_t count``h]j)}(hjh]h size_t count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj ubj2)}(hhh]h)}(hThe size of the area.h]hThe size of the area.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj(ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj'hMhjubeh}(h]h ]h"]h$]h&]uh1j hj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bcmp (C function)c.bcmphNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h3int bcmp (const void *a, const void *b, size_t len)h]j)}(h2int bcmp(const void *a, const void *b, size_t len)h](j )}(hinth]hint}(hjlhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhhjzhMubj{)}(hbcmph]j)}(hbcmph]hbcmp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhhjzhMubj)}(h*(const void *a, const void *b, size_t len)h](j)}(h const void *ah](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hjĜhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjҜhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hah]ha}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h const void *bh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hj!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbh]hb}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjhmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.bcmpasbuh1hhj_ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhhjzhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjdhhhjzhMubah}(h]j_ah ](jjeh"]h$]h&]jj)jhuh1jhjzhMhjahhubj)}(hhh]h)}(h=returns 0 if and only if the buffers have identical contents.h]h=returns 0 if and only if the buffers have identical contents.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjahhhjzhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj֝jj֝jjjuh1jhhhjC`hNhNubj)}(hX**Parameters** ``const void *a`` pointer to first buffer. ``const void *b`` pointer to second buffer. ``size_t len`` size of buffers. **Description** The sign or magnitude of a non-zero return value has no particular meaning, and architectures may implement their own more efficient bcmp(). So while this particular implementation is a simple (tail) call to memcmp, do not rely on anything but whether the return value is zero or non-zero.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjޝubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjڝubj )}(hhh](j)}(h+``const void *a`` pointer to first buffer. h](j)}(h``const void *a``h]j)}(hjh]h const void *a}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hpointer to first buffer.h]hpointer to first buffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h,``const void *b`` pointer to second buffer. h](j)}(h``const void *b``h]j)}(hj8h]h const void *b}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj2ubj2)}(hhh]h)}(hpointer to second buffer.h]hpointer to second buffer.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMhjNubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhMhjubj)}(h ``size_t len`` size of buffers. h](j)}(h``size_t len``h]j)}(hjqh]h size_t len}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjkubj2)}(hhh]h)}(hsize of buffers.h]hsize of buffers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjkubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjڝubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjڝubh)}(hX!The sign or magnitude of a non-zero return value has no particular meaning, and architectures may implement their own more efficient bcmp(). So while this particular implementation is a simple (tail) call to memcmp, do not rely on anything but whether the return value is zero or non-zero.h]hX!The sign or magnitude of a non-zero return value has no particular meaning, and architectures may implement their own more efficient bcmp(). So while this particular implementation is a simple (tail) call to memcmp, do not rely on anything but whether the return value is zero or non-zero.}(hjžhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjڝubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memscan (C function) c.memscanhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h/void * memscan (void *addr, int c, size_t size)h]j)}(h-void *memscan(void *addr, int c, size_t size)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj{)}(hmemscanh]j)}(hmemscanh]hmemscan}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h (void *addr, int c, size_t size)h](j)}(h void *addrh](j )}(hvoidh]hvoid}(hj;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj7ubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7ubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(haddrh]haddr}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubj)}(hint ch](j )}(hinth]hint}(hj}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjyubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyubj)}(hjh]hc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j!sb c.memscanasbuh1hhjubj2)}(h h]h }(hjԟhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h&Find a character in an area of memory.h]h&Find a character in an area of memory.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj$jj$jjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``void *addr`` The memory area ``int c`` The byte to search for ``size_t size`` The size of the area. **Description** returns the address of the first occurrence of **c**, or 1 byte past the area if **c** is not foundh](h)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj(ubj )}(hhh](j)}(h``void *addr`` The memory area h](j)}(h``void *addr``h]j)}(hjMh]h void *addr}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjGubj2)}(hhh]h)}(hThe memory areah]hThe memory area}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMhjcubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhjbhMhjDubj)}(h!``int c`` The byte to search for h](j)}(h ``int c``h]j)}(hjh]hint c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hThe byte to search forh]hThe byte to search for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjDubj)}(h&``size_t size`` The size of the area. h](j)}(h``size_t size``h]j)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hThe size of the area.h]hThe size of the area.}(hjؠhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjԠhMhjՠubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjԠhMhjDubeh}(h]h ]h"]h$]h&]uh1j hj(ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj(ubh)}(hcreturns the address of the first occurrence of **c**, or 1 byte past the area if **c** is not foundh](h/returns the address of the first occurrence of }(hjhhhNhNubj)}(h**c**h]hc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, or 1 byte past the area if }(hjhhhNhNubj)}(h**c**h]hc}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is not found}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strstr (C function)c.strstrhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h.char * strstr (const char *s1, const char *s2)h]j)}(h,char *strstr(const char *s1, const char *s2)h](j )}(hcharh]hchar}(hjchhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj_hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_hhhjqhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhjqhMubj{)}(hstrstrh]j)}(hstrstrh]hstrstr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj_hhhjqhMubj)}(h (const char *s1, const char *s2)h](j)}(hconst char *s1h](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjȡhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj֡hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hs1h]hs1}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *s2h](j)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj%hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hs2h]hs2}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj_hhhjqhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj[hhhjqhMubah}(h]jVah ](jjeh"]h$]h&]jj)jhuh1jhjqhMhjXhhubj)}(hhh]h)}(h7Find the first substring in a ``NUL`` terminated stringh](hFind the first substring in a }(hjxhhhNhNubj)}(h``NUL``h]hNUL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubh terminated string}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjuhhubah}(h]h ]h"]h$]h&]uh1jhjXhhhjqhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(hm**Parameters** ``const char *s1`` The string to be searched ``const char *s2`` The string to search forh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj )}(hhh](j)}(h-``const char *s1`` The string to be searched h](j)}(h``const char *s1``h]j)}(hjˢh]hconst char *s1}(hj͢hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɢubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjŢubj2)}(hhh]h)}(hThe string to be searchedh]hThe string to be searched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjŢubeh}(h]h ]h"]h$]h&]uh1jhjhMhj¢ubj)}(h+``const char *s2`` The string to search forh](j)}(h``const char *s2``h]j)}(hjh]hconst char *s2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hThe string to search forh]hThe string to search for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj¢ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strnstr (C function) c.strnstrhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h;char * strnstr (const char *s1, const char *s2, size_t len)h]j)}(h9char *strnstr(const char *s1, const char *s2, size_t len)h](j )}(hcharh]hchar}(hj^hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZhhhjlhMubj)}(hjh]h*}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhjlhMubj{)}(hstrnstrh]j)}(hstrnstrh]hstrnstr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjZhhhjlhMubj)}(h,(const char *s1, const char *s2, size_t len)h](j)}(hconst char *s1h](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjãhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjѣhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjߣhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hs1h]hs1}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *s2h](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hs2h]hs2}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjgmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.strnstrasbuh1hhj^ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjZhhhjlhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjVhhhjlhMubah}(h]jQah ](jjeh"]h$]h&]jj)jhuh1jhjlhMhjShhubj)}(hhh]h)}(h3Find the first substring in a length-limited stringh]h3Find the first substring in a length-limited string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjShhhjlhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjդjjդjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const char *s1`` The string to be searched ``const char *s2`` The string to search for ``size_t len`` the maximum number of characters to searchh](h)}(h**Parameters**h]j)}(hjߤh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݤubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj٤ubj )}(hhh](j)}(h-``const char *s1`` The string to be searched h](j)}(h``const char *s1``h]j)}(hjh]hconst char *s1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hThe string to be searchedh]hThe string to be searched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h,``const char *s2`` The string to search for h](j)}(h``const char *s2``h]j)}(hj7h]hconst char *s2}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhj1ubj2)}(hhh]h)}(hThe string to search forh]hThe string to search for}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjMubah}(h]h ]h"]h$]h&]uh1j1hj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjubj)}(h9``size_t len`` the maximum number of characters to searchh](j)}(h``size_t len``h]j)}(hjph]h size_t len}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjjubj2)}(hhh]h)}(h*the maximum number of characters to searchh]h*the maximum number of characters to search}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubah}(h]h ]h"]h$]h&]uh1j1hjjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hj٤ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memchr (C function)c.memchrhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h.void * memchr (const void *s, int c, size_t n)h]j)}(h,void *memchr(const void *s, int c, size_t n)h](j )}(hvoidh]hvoid}(hjʥhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjƥhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM ubj2)}(h h]h }(hj٥hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjƥhhhjإhM ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƥhhhjإhM ubj{)}(hmemchrh]j)}(hmemchrh]hmemchr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjƥhhhjإhM ubj)}(h (const void *s, int c, size_t n)h](j)}(h const void *sh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hj/hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjY)h]hs}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hint ch](j )}(hinth]hint}(hjphhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjlubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjh]hc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hsize_t nh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.memchrasbuh1hhjubj2)}(h h]h }(hjǦhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]hn}(hjզhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjƥhhhjإhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj¥hhhjإhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjإhM hjhhubj)}(hhh]h)}(h&Find a character in an area of memory.h]h&Find a character in an area of memory.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjإhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const void *s`` The memory area ``int c`` The byte to search for ``size_t n`` The size of the area. **Description** returns the address of the first occurrence of **c**, or ``NULL`` if **c** is not foundh](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj )}(hhh](j)}(h"``const void *s`` The memory area h](j)}(h``const void *s``h]j)}(hj?h]h const void *s}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM hj9ubj2)}(hhh]h)}(hThe memory areah]hThe memory area}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThM hjUubah}(h]h ]h"]h$]h&]uh1j1hj9ubeh}(h]h ]h"]h$]h&]uh1jhjThM hj6ubj)}(h!``int c`` The byte to search for h](j)}(h ``int c``h]j)}(hjxh]hint c}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM hjrubj2)}(hhh]h)}(hThe byte to search forh]hThe byte to search for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjrubeh}(h]h ]h"]h$]h&]uh1jhjhM hj6ubj)}(h#``size_t n`` The size of the area. h](j)}(h ``size_t n``h]j)}(hjh]hsize_t n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubj2)}(hhh]h)}(hThe size of the area.h]hThe size of the area.}(hjʧhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjƧhMhjǧubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjƧhMhj6ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubh)}(hWreturns the address of the first occurrence of **c**, or ``NULL`` if **c** is not foundh](h/returns the address of the first occurrence of }(hjhhhNhNubj)}(h**c**h]hc}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, or }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if }(hjhhhNhNubj)}(h**c**h]hc}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is not found}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memchr_inv (C function) c.memchr_invhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h:void * memchr_inv (const void *start, int c, size_t bytes)h]j)}(h8void *memchr_inv(const void *start, int c, size_t bytes)h](j )}(hvoidh]hvoid}(hjghhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjchhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM,ubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjchhhjuhM,ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhjuhM,ubj{)}(h memchr_invh]j)}(h memchr_invh]h memchr_inv}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjchhhjuhM,ubj)}(h((const void *start, int c, size_t bytes)h](j)}(hconst void *starth](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hj̨hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjڨhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint ch](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]hc}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t bytesh](h)}(hhh]j)}(hsize_th]hsize_t}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjGmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.memchr_invasbuh1hhj>ubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hbytesh]hbytes}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjchhhjuhM,ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj_hhhjuhM,ubah}(h]jZah ](jjeh"]h$]h&]jj)jhuh1jhjuhM,hj\hhubj)}(hhh]h)}(h2Find an unmatching character in an area of memory.h]h2Find an unmatching character in an area of memory.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM,hjhhubah}(h]h ]h"]h$]h&]uh1jhj\hhhjuhM,ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(hX**Parameters** ``const void *start`` The memory area ``int c`` Find a character other than c ``size_t bytes`` The size of the area. **Description** returns the address of the first character other than **c**, or ``NULL`` if the whole buffer contains just **c**.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM0hjubj )}(hhh](j)}(h&``const void *start`` The memory area h](j)}(h``const void *start``h]j)}(hjީh]hconst void *start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjܩubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM-hjةubj2)}(hhh]h)}(hThe memory areah]hThe memory area}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM-hjubah}(h]h ]h"]h$]h&]uh1j1hjةubeh}(h]h ]h"]h$]h&]uh1jhjhM-hjթubj)}(h(``int c`` Find a character other than c h](j)}(h ``int c``h]j)}(hjh]hint c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM.hjubj2)}(hhh]h)}(hFind a character other than ch]hFind a character other than c}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hM.hj-ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj,hM.hjթubj)}(h'``size_t bytes`` The size of the area. h](j)}(h``size_t bytes``h]j)}(hjPh]h size_t bytes}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM/hjJubj2)}(hhh]h)}(hThe size of the area.h]hThe size of the area.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehM/hjfubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjehM/hjթubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM1hjubh)}(hqreturns the address of the first character other than **c**, or ``NULL`` if the whole buffer contains just **c**.h](h6returns the address of the first character other than }(hjhhhNhNubj)}(h**c**h]hc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, or }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh# if the whole buffer contains just }(hjhhhNhNubj)}(h**c**h]hc}(hjͪhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:36: ./lib/string.chM0hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memdup_array_user (C function)c.memdup_array_userhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hHvoid * memdup_array_user (const void __user *src, size_t n, size_t size)h]j)}(hFvoid *memdup_array_user(const void __user *src, size_t n, size_t size)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj{)}(hmemdup_array_userh]j)}(hmemdup_array_userh]hmemdup_array_user}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h/(const void __user *src, size_t n, size_t size)h](j)}(hconst void __user *srch](j)}(hjh]hconst}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj )}(hvoidh]hvoid}(hjkhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubh__user}(hjLhhhNhNubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hsrch]hsrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubj)}(hsize_t nh](h)}(hhh]j)}(hsize_th]hsize_t}(hj«hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjīmodnameN classnameNj] j` )}jc ]jf )}jY j6sbc.memdup_array_userasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jޫc.memdup_array_userasbuh1hhjubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(hduplicate array from user spaceh]hduplicate array from user space}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhj^hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjyjjyjjjuh1jhhhjC`hNhNubj)}(hX**Parameters** ``const void __user *src`` source address in user space ``size_t n`` number of array members to copy ``size_t size`` size of one array member **Return** an ERR_PTR() on failure. Result is physically contiguous, to be freed by kfree().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhj}ubj )}(hhh](j)}(h8``const void __user *src`` source address in user space h](j)}(h``const void __user *src``h]j)}(hjh]hconst void __user *src}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjubj2)}(hhh]h)}(hsource address in user spaceh]hsource address in user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h-``size_t n`` number of array members to copy h](j)}(h ``size_t n``h]j)}(hj۬h]hsize_t n}(hjݬhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj٬ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjլubj2)}(hhh]h)}(hnumber of array members to copyh]hnumber of array members to copy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjլubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h)``size_t size`` size of one array member h](j)}(h``size_t size``h]j)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjubj2)}(hhh]h)}(hsize of one array memberh]hsize of one array member}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hKhj*ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj)hKhjubeh}(h]h ]h"]h$]h&]uh1j hj}ubh)}(h **Return**h]j)}(hjOh]hReturn}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhj}ubh)}(hQan ERR_PTR() on failure. Result is physically contiguous, to be freed by kfree().h]hQan ERR_PTR() on failure. Result is physically contiguous, to be freed by kfree().}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j vmemdup_array_user (C function)c.vmemdup_array_userhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hIvoid * vmemdup_array_user (const void __user *src, size_t n, size_t size)h]j)}(hGvoid *vmemdup_array_user(const void __user *src, size_t n, size_t size)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK+ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhK+ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK+ubj{)}(hvmemdup_array_userh]j)}(hvmemdup_array_userh]hvmemdup_array_user}(hj­hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhK+ubj)}(h/(const void __user *src, size_t n, size_t size)h](j)}(hconst void __user *srch](j)}(hjh]hconst}(hjޭhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڭubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjڭubj )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjڭubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjڭubh__user}(hjڭhhhNhNubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjڭubj)}(hjh]h*}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڭubj)}(hsrch]hsrc}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڭubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj֭ubj)}(hsize_t nh](h)}(hhh]j)}(hsize_th]hsize_t}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjRmodnameN classnameNj] j` )}jc ]jf )}jY jĭsbc.vmemdup_array_userasbuh1hhjIubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjh]hn}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj֭ubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jlc.vmemdup_array_userasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hjŮhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj֭ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhK+ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK+ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK+hjhhubj)}(hhh]h)}(hduplicate array from user spaceh]hduplicate array from user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK+hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK+ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(hX **Parameters** ``const void __user *src`` source address in user space ``size_t n`` number of array members to copy ``size_t size`` size of one array member **Return** an ERR_PTR() on failure. Result may be not physically contiguous. Use kvfree() to free.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK/hj ubj )}(hhh](j)}(h8``const void __user *src`` source address in user space h](j)}(h``const void __user *src``h]j)}(hj0h]hconst void __user *src}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK,hj*ubj2)}(hhh]h)}(hsource address in user spaceh]hsource address in user space}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhK,hjFubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhjEhK,hj'ubj)}(h-``size_t n`` number of array members to copy h](j)}(h ``size_t n``h]j)}(hjih]hsize_t n}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK-hjcubj2)}(hhh]h)}(hnumber of array members to copyh]hnumber of array members to copy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hK-hjubah}(h]h ]h"]h$]h&]uh1j1hjcubeh}(h]h ]h"]h$]h&]uh1jhj~hK-hj'ubj)}(h)``size_t size`` size of one array member h](j)}(h``size_t size``h]j)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK.hjubj2)}(hhh]h)}(hsize of one array memberh]hsize of one array member}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK.hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK.hj'ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h **Return**h]j)}(hjݯh]hReturn}(hj߯hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjۯubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK0hj ubh)}(hWan ERR_PTR() on failure. Result may be not physically contiguous. Use kvfree() to free.h]hWan ERR_PTR() on failure. Result may be not physically contiguous. Use kvfree() to free.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK0hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strscpy (C macro) c.strscpyhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hstrscpyh]j)}(hstrscpyh]j{)}(hstrscpyh]j)}(hjh]hstrscpy}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKYubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj9hKYubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj9hKYhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj9hKYubeh}(h]h ](jmacroeh"]h$]h&]jjjjRjjRjjjuh1jhhhjC`hNhNubh)}(h``strscpy (dst, src, ...)``h]j)}(hjXh]hstrscpy (dst, src, ...)}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK[hjC`hhubj)}(h$Copy a C-string into a sized buffer h]h)}(h#Copy a C-string into a sized bufferh]h#Copy a C-string into a sized buffer}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKYhjnubah}(h]h ]h"]h$]h&]uh1jhjhKYhjC`hhubj)}(hXq**Parameters** ``dst`` Where to copy the string to ``src`` Where to copy the string from ``...`` Size of destination buffer (optional) **Description** Copy the source string **src**, or as much of it as fits, into the destination **dst** buffer. The behavior is undefined if the string buffers overlap. The destination **dst** buffer is always NUL terminated, unless it's zero-sized. The size argument **...** is only required when **dst** is not an array, or when the copy needs to be smaller than sizeof(**dst**). Preferred to strncpy() since it always returns a valid string, and doesn't unnecessarily force the tail of the destination buffer to be zero padded. If padding is desired please use strscpy_pad(). Returns the number of characters copied in **dst** (not including the trailing ``NUL``) or -E2BIG if **size** is 0 or the copy from **src** was truncated.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK]hjubj )}(hhh](j)}(h$``dst`` Where to copy the string to h](j)}(h``dst``h]j)}(hjh]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKZhjubj2)}(hhh]h)}(hWhere to copy the string toh]hWhere to copy the string to}(hjŰhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKZhj°ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKZhjubj)}(h&``src`` Where to copy the string from h](j)}(h``src``h]j)}(hjh]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK[hj߰ubj2)}(hhh]h)}(hWhere to copy the string fromh]hWhere to copy the string from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK[hjubah}(h]h ]h"]h$]h&]uh1j1hj߰ubeh}(h]h ]h"]h$]h&]uh1jhjhK[hjubj)}(h.``...`` Size of destination buffer (optional) h](j)}(h``...``h]j)}(hjh]h...}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK\hjubj2)}(hhh]h)}(h%Size of destination buffer (optional)h]h%Size of destination buffer (optional)}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hK\hj4ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj3hK\hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjYh]h Description}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK^hjubh)}(hCopy the source string **src**, or as much of it as fits, into the destination **dst** buffer. The behavior is undefined if the string buffers overlap. The destination **dst** buffer is always NUL terminated, unless it's zero-sized.h](hCopy the source string }(hjohhhNhNubj)}(h**src**h]hsrc}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh1, or as much of it as fits, into the destination }(hjohhhNhNubj)}(h**dst**h]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubhR buffer. The behavior is undefined if the string buffers overlap. The destination }(hjohhhNhNubj)}(h**dst**h]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh; buffer is always NUL terminated, unless it’s zero-sized.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK]hjubh)}(hThe size argument **...** is only required when **dst** is not an array, or when the copy needs to be smaller than sizeof(**dst**).h](hThe size argument }(hjhhhNhNubj)}(h**...**h]h...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is only required when }(hjhhhNhNubj)}(h**dst**h]hdst}(hjαhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhC is not an array, or when the copy needs to be smaller than sizeof(}(hjhhhNhNubj)}(h**dst**h]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKbhjubh)}(hPreferred to strncpy() since it always returns a valid string, and doesn't unnecessarily force the tail of the destination buffer to be zero padded. If padding is desired please use strscpy_pad().h]hPreferred to strncpy() since it always returns a valid string, and doesn’t unnecessarily force the tail of the destination buffer to be zero padded. If padding is desired please use strscpy_pad().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKehjubh)}(hReturns the number of characters copied in **dst** (not including the trailing ``NUL``) or -E2BIG if **size** is 0 or the copy from **src** was truncated.h](h+Returns the number of characters copied in }(hjhhhNhNubj)}(h**dst**h]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh (not including the trailing }(hjhhhNhNubj)}(h``NUL``h]hNUL}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) or -E2BIG if }(hjhhhNhNubj)}(h**size**h]hsize}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is 0 or the copy from }(hjhhhNhNubj)}(h**src**h]hsrc}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh was truncated.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKihjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strscpy_pad (C macro) c.strscpy_padhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h strscpy_padh]j)}(h strscpy_padh]j{)}(h strscpy_padh]j)}(hjyh]h strscpy_pad}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj{hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK~ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjwhhhjhK~ubah}(h]jrah ](jjeh"]h$]h&]jj)jhuh1jhjhK~hjthhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjthhhjhK~ubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubh)}(h``strscpy_pad (dst, src, ...)``h]j)}(hjh]hstrscpy_pad (dst, src, ...)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjC`hhubj)}(h$Copy a C-string into a sized buffer h]h)}(h#Copy a C-string into a sized bufferh]h#Copy a C-string into a sized buffer}(hjϲhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhK~hj˲ubah}(h]h ]h"]h$]h&]uh1jhjݲhK~hjC`hhubj)}(hX**Parameters** ``dst`` Where to copy the string to ``src`` Where to copy the string from ``...`` Size of destination buffer **Description** Copy the string, or as much of it as fits, into the dest buffer. The behavior is undefined if the string buffers overlap. The destination buffer is always ``NUL`` terminated, unless it's zero-sized. If the source string is shorter than the destination buffer, the remaining bytes in the buffer will be filled with ``NUL`` bytes. For full explanation of why you may want to consider using the 'strscpy' functions please see the function docstring for strscpy(). **Return** * The number of characters copied (not including the trailing ``NULs``) * -E2BIG if count is 0 or **src** was truncated.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjubj )}(hhh](j)}(h$``dst`` Where to copy the string to h](j)}(h``dst``h]j)}(hj h]hdst}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjubj2)}(hhh]h)}(hWhere to copy the string toh]hWhere to copy the string to}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h&``src`` Where to copy the string from h](j)}(h``src``h]j)}(hjBh]hsrc}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhj<ubj2)}(hhh]h)}(hWhere to copy the string fromh]hWhere to copy the string from}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhKhjXubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhjWhKhjubj)}(h#``...`` Size of destination buffer h](j)}(h``...``h]j)}(hj{h]h...}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjuubj2)}(hhh]h)}(hSize of destination bufferh]hSize of destination buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjubh)}(hCopy the string, or as much of it as fits, into the dest buffer. The behavior is undefined if the string buffers overlap. The destination buffer is always ``NUL`` terminated, unless it's zero-sized.h](hCopy the string, or as much of it as fits, into the dest buffer. The behavior is undefined if the string buffers overlap. The destination buffer is always }(hj̳hhhNhNubj)}(h``NUL``h]hNUL}(hjԳhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̳ubh& terminated, unless it’s zero-sized.}(hj̳hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjubh)}(hIf the source string is shorter than the destination buffer, the remaining bytes in the buffer will be filled with ``NUL`` bytes.h](hsIf the source string is shorter than the destination buffer, the remaining bytes in the buffer will be filled with }(hjhhhNhNubj)}(h``NUL``h]hNUL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh bytes.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjubh)}(hFor full explanation of why you may want to consider using the 'strscpy' functions please see the function docstring for strscpy().h]hFor full explanation of why you may want to consider using the ‘strscpy’ functions please see the function docstring for strscpy().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjubh)}(h **Return**h]j)}(hjh]hReturn}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhKhjubj)}(hhh](j)}(hEThe number of characters copied (not including the trailing ``NULs``)h]h)}(hj:h](hah"]h$]h&]uh1j1hjhhhjhMubj{)}(h mem_is_zeroh]j)}(h mem_is_zeroh]h mem_is_zero}(hjҴhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjδubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(const void *s, size_t n)h](j)}(h const void *sh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjY)h]hs}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsize_t nh](h)}(hhh]j)}(hsize_th]hsize_t}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjOmodnameN classnameNj] j` )}jc ]jf )}jY jԴsb c.mem_is_zeroasbuh1hhjFubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj)}(hjh]hn}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h&Check if an area of memory is all 0's.h]h(Check if an area of memory is all 0’s.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const void *s`` The memory area ``size_t n`` The size of the area **Return** True if the area of memory is all 0's.h](h)}(h**Parameters**h]j)}(hjƵh]h Parameters}(hjȵhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjĵubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM!hjubj )}(hhh](j)}(h"``const void *s`` The memory area h](j)}(h``const void *s``h]j)}(hjh]h const void *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjߵubj2)}(hhh]h)}(hThe memory areah]hThe memory area}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjߵubeh}(h]h ]h"]h$]h&]uh1jhjhMhjܵubj)}(h"``size_t n`` The size of the area h](j)}(h ``size_t n``h]j)}(hjh]hsize_t n}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj2)}(hhh]h)}(hThe size of the areah]hThe size of the area}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj4ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj3hMhjܵubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjYh]hReturn}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM!hjubh)}(h&True if the area of memory is all 0's.h]h(True if the area of memory is all 0’s.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM!hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j sysfs_match_string (C macro)c.sysfs_match_stringhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hsysfs_match_stringh]j)}(hsysfs_match_stringh]j{)}(hsysfs_match_stringh]j)}(hjh]hsysfs_match_string}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMGubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMGubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMGhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMGubeh}(h]h ](jmacroeh"]h$]h&]jjjjζjjζjjjuh1jhhhjC`hNhNubh)}(h``sysfs_match_string (_a, _s)``h]j)}(hjԶh]hsysfs_match_string (_a, _s)}(hjֶhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjҶubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMIhjC`hhubj)}(h!matches given string in an array h]h)}(h matches given string in an arrayh]h matches given string in an array}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMGhjubah}(h]h ]h"]h$]h&]uh1jhjhMGhjC`hhubj)}(h**Parameters** ``_a`` array of strings ``_s`` string to match with **Description** Helper for __sysfs_match_string(). Calculates the size of **a** automatically.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMKhjubj )}(hhh](j)}(h``_a`` array of strings h](j)}(h``_a``h]j)}(hj(h]h_a}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMHhj"ubj2)}(hhh]h)}(harray of stringsh]harray of strings}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMHhj>ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hMHhjubj)}(h``_s`` string to match with h](j)}(h``_s``h]j)}(hjah]h_s}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMIhj[ubj2)}(hhh]h)}(hstring to match withh]hstring to match with}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhMIhjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMIhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMKhjubh)}(hNHelper for __sysfs_match_string(). Calculates the size of **a** automatically.h](h:Helper for __sysfs_match_string(). Calculates the size of }(hjhhhNhNubj)}(h**a**h]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh automatically.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMJhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memzero_explicit (C function)c.memzero_explicithNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h-void memzero_explicit (void *s, size_t count)h]j)}(h,void memzero_explicit(void *s, size_t count)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM\ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM\ubj{)}(hmemzero_explicith]j)}(hmemzero_explicith]hmemzero_explicit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM\ubj)}(h(void *s, size_t count)h](j)}(hvoid *sh](j )}(hvoidh]hvoid}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj,ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubj)}(hjh]h*}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(hjY)h]hs}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjvmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.memzero_explicitasbuh1hhjmubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjmubj)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM\ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM\ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM\hjhhubj)}(hhh]h)}(h=Fill a region of memory (e.g. sensitive keying data) with 0s.h]h=Fill a region of memory (e.g. sensitive keying data) with 0s.}(hj̸hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM\hjɸhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM\ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(hX**Parameters** ``void *s`` Pointer to the start of the area. ``size_t count`` The size of the area. **Note** usually using memset() is just fine (!), but in cases where clearing out _local_ data at the end of a scope is necessary, memzero_explicit() should be used instead in order to prevent the compiler from optimising away zeroing. memzero_explicit() doesn't need an arch-specific version as it just invokes the one of memset() implicitly.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM`hjubj )}(hhh](j)}(h.``void *s`` Pointer to the start of the area. h](j)}(h ``void *s``h]j)}(hj h]hvoid *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM^hjubj2)}(hhh]h)}(h!Pointer to the start of the area.h]h!Pointer to the start of the area.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hM^hj#ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj"hM^hjubj)}(h'``size_t count`` The size of the area. h](j)}(h``size_t count``h]j)}(hjFh]h size_t count}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM_hj@ubj2)}(hhh]h)}(hThe size of the area.h]hThe size of the area.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hM_hj\ubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhj[hM_hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMahjubh)}(husually using memset() is just fine (!), but in cases where clearing out _local_ data at the end of a scope is necessary, memzero_explicit() should be used instead in order to prevent the compiler from optimising away zeroing.h]husually using memset() is just fine (!), but in cases where clearing out _local_ data at the end of a scope is necessary, memzero_explicit() should be used instead in order to prevent the compiler from optimising away zeroing.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMahjubh)}(hkmemzero_explicit() doesn't need an arch-specific version as it just invokes the one of memset() implicitly.h]hmmemzero_explicit() doesn’t need an arch-specific version as it just invokes the one of memset() implicitly.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMfhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kbasename (C function) c.kbasenamehNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h)const char * kbasename (const char *path)h]j)}(h'const char *kbasename(const char *path)h](j)}(hjh]hconst}(hjչhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjѹhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjѹhhhjhMpubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjѹhhhjhMpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjѹhhhjhMpubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjѹhhhjhMpubj{)}(h kbasenameh]j)}(h kbasenameh]h kbasename}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjѹhhhjhMpubj)}(h(const char *path)h]j)}(hconst char *pathh](j)}(hjh]hconst}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj )}(hcharh]hchar}(hjUhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj)}(hjh]h*}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hpathh]hpath}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj2ubah}(h]h ]h"]h$]h&]jjuh1jhjѹhhhjhMpubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj͹hhhjhMpubah}(h]jȹah ](jjeh"]h$]h&]jj)jhuh1jhjhMphjʹhhubj)}(hhh]h)}(h#return the last part of a pathname.h]h#return the last part of a pathname.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMphjhhubah}(h]h ]h"]h$]h&]uh1jhjʹhhhjhMpubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const char *path`` path to extract the filename from. **Return** Pointer to the filename portion inside **path**. If no '/' exists, returns **path** unchanged.h](h)}(h**Parameters**h]j)}(hjʺh]h Parameters}(hj̺hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȺubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMthjĺubj )}(hhh]j)}(h8``const char *path`` path to extract the filename from. h](j)}(h``const char *path``h]j)}(hjh]hconst char *path}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMrhjubj2)}(hhh]h)}(h"path to extract the filename from.h]h"path to extract the filename from.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMrhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMrhjubah}(h]h ]h"]h$]h&]uh1j hjĺubh)}(h **Return**h]j)}(hj$h]hReturn}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMthjĺubh)}(h^Pointer to the filename portion inside **path**. If no '/' exists, returns **path** unchanged.h](h'Pointer to the filename portion inside }(hj:hhhNhNubj)}(h**path**h]hpath}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh . If no ‘/’ exists, returns }(hj:hhhNhNubj)}(h**path**h]hpath}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh unchanged.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMthjĺubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strtomem_pad (C macro)c.strtomem_padhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h strtomem_padh]j)}(h strtomem_padh]j{)}(h strtomem_padh]j)}(hjh]h strtomem_pad}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubh)}(h!``strtomem_pad (dest, src, pad)``h]j)}(hjûh]hstrtomem_pad (dest, src, pad)}(hjŻhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjC`hhubj)}(h8Copy NUL-terminated string to non-NUL-terminated buffer h]h)}(h7Copy NUL-terminated string to non-NUL-terminated bufferh]h7Copy NUL-terminated string to non-NUL-terminated buffer}(hjݻhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjٻubah}(h]h ]h"]h$]h&]uh1jhjhMhjC`hhubj)}(hX6**Parameters** ``dest`` Pointer of destination character array (marked as __nonstring) ``src`` Pointer to NUL-terminated string ``pad`` Padding character to fill any remaining bytes of **dest** after copy **Description** This is a replacement for strncpy() uses where the destination is not a NUL-terminated string, but with bounds checking on the source size, and an explicit padding character. If padding is not required, use strtomem(). Note that the size of **dest** is not an argument, as the length of **dest** must be discoverable by the compiler.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj )}(hhh](j)}(hH``dest`` Pointer of destination character array (marked as __nonstring) h](j)}(h``dest``h]j)}(hjh]hdest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj2)}(hhh]h)}(h>Pointer of destination character array (marked as __nonstring)h]h>Pointer of destination character array (marked as __nonstring)}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj-ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj,hMhjubj)}(h)``src`` Pointer to NUL-terminated string h](j)}(h``src``h]j)}(hjPh]hsrc}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjJubj2)}(hhh]h)}(h Pointer to NUL-terminated stringh]h Pointer to NUL-terminated string}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMhjfubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjehMhjubj)}(hM``pad`` Padding character to fill any remaining bytes of **dest** after copy h](j)}(h``pad``h]j)}(hjh]hpad}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj2)}(hhh]h)}(hDPadding character to fill any remaining bytes of **dest** after copyh](h1Padding character to fill any remaining bytes of }(hjhhhNhNubj)}(h**dest**h]hdest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh after copy}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjּh]h Description}(hjؼhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԼubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubh)}(hThis is a replacement for strncpy() uses where the destination is not a NUL-terminated string, but with bounds checking on the source size, and an explicit padding character. If padding is not required, use strtomem().h]hThis is a replacement for strncpy() uses where the destination is not a NUL-terminated string, but with bounds checking on the source size, and an explicit padding character. If padding is not required, use strtomem().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubh)}(hrNote that the size of **dest** is not an argument, as the length of **dest** must be discoverable by the compiler.h](hNote that the size of }(hjhhhNhNubj)}(h**dest**h]hdest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh& is not an argument, as the length of }(hjhhhNhNubj)}(h**dest**h]hdest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh& must be discoverable by the compiler.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strtomem (C macro) c.strtomemhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hstrtomemh]j)}(hstrtomemh]j{)}(hstrtomemh]j)}(hjHh]hstrtomem}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjJhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjFhhhjehMubah}(h]jAah ](jjeh"]h$]h&]jj)jhuh1jhjehMhjChhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjChhhjehMubeh}(h]h ](jmacroeh"]h$]h&]jjjj~jj~jjjuh1jhhhjC`hNhNubh)}(h``strtomem (dest, src)``h]j)}(hjh]hstrtomem (dest, src)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjC`hhubj)}(h8Copy NUL-terminated string to non-NUL-terminated buffer h]h)}(h7Copy NUL-terminated string to non-NUL-terminated bufferh]h7Copy NUL-terminated string to non-NUL-terminated buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjC`hhubj)}(hX**Parameters** ``dest`` Pointer of destination character array (marked as __nonstring) ``src`` Pointer to NUL-terminated string **Description** This is a replacement for strncpy() uses where the destination is not a NUL-terminated string, but with bounds checking on the source size, and without trailing padding. If padding is required, use strtomem_pad(). Note that the size of **dest** is not an argument, as the length of **dest** must be discoverable by the compiler.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj )}(hhh](j)}(hH``dest`` Pointer of destination character array (marked as __nonstring) h](j)}(h``dest``h]j)}(hjؽh]hdest}(hjڽhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjֽubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjҽubj2)}(hhh]h)}(h>Pointer of destination character array (marked as __nonstring)h]h>Pointer of destination character array (marked as __nonstring)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjҽubeh}(h]h ]h"]h$]h&]uh1jhjhMhjϽubj)}(h)``src`` Pointer to NUL-terminated string h](j)}(h``src``h]j)}(hjh]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhj ubj2)}(hhh]h)}(h Pointer to NUL-terminated stringh]h Pointer to NUL-terminated string}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMhj'ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhjϽubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjLh]h Description}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubh)}(hThis is a replacement for strncpy() uses where the destination is not a NUL-terminated string, but with bounds checking on the source size, and without trailing padding. If padding is required, use strtomem_pad().h]hThis is a replacement for strncpy() uses where the destination is not a NUL-terminated string, but with bounds checking on the source size, and without trailing padding. If padding is required, use strtomem_pad().}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubh)}(hrNote that the size of **dest** is not an argument, as the length of **dest** must be discoverable by the compiler.h](hNote that the size of }(hjqhhhNhNubj)}(h**dest**h]hdest}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh& is not an argument, as the length of }(hjqhhhNhNubj)}(h**dest**h]hdest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh& must be discoverable by the compiler.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memtostr (C macro) c.memtostrhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hmemtostrh]j)}(hmemtostrh]j{)}(hmemtostrh]j)}(hjh]hmemtostr}(hjȾhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjľubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj۾hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj۾hMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj۾hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubh)}(h``memtostr (dest, src)``h]j)}(hjh]hmemtostr (dest, src)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjC`hhubj)}(h9Copy a possibly non-NUL-term string to a NUL-term string h]h)}(h8Copy a possibly non-NUL-term string to a NUL-term stringh]h8Copy a possibly non-NUL-term string to a NUL-term string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubah}(h]h ]h"]h$]h&]uh1jhj"hMhjC`hhubj)}(hX@**Parameters** ``dest`` Pointer to destination NUL-terminates string ``src`` Pointer to character array (likely marked as __nonstring) **Description** This is a replacement for strncpy() uses where the source is not a NUL-terminated string. Note that sizes of **dest** and **src** must be known at compile-time.h](h)}(h**Parameters**h]j)}(hj/h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhj)ubj )}(hhh](j)}(h6``dest`` Pointer to destination NUL-terminates string h](j)}(h``dest``h]j)}(hjNh]hdest}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjHubj2)}(hhh]h)}(h,Pointer to destination NUL-terminates stringh]h,Pointer to destination NUL-terminates string}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMhjdubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjchMhjEubj)}(hB``src`` Pointer to character array (likely marked as __nonstring) h](j)}(h``src``h]j)}(hjh]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj2)}(hhh]h)}(h9Pointer to character array (likely marked as __nonstring)h]h9Pointer to character array (likely marked as __nonstring)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjEubeh}(h]h ]h"]h$]h&]uh1j hj)ubh)}(h**Description**h]j)}(hj¿h]h Description}(hjĿhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhj)ubh)}(hYThis is a replacement for strncpy() uses where the source is not a NUL-terminated string.h]hYThis is a replacement for strncpy() uses where the source is not a NUL-terminated string.}(hjؿhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhj)ubh)}(hFNote that sizes of **dest** and **src** must be known at compile-time.h](hNote that sizes of }(hjhhhNhNubj)}(h**dest**h]hdest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**src**h]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh must be known at compile-time.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memtostr_pad (C macro)c.memtostr_padhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h memtostr_padh]j)}(h memtostr_padh]j{)}(h memtostr_padh]j)}(hj4h]h memtostr_pad}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj6hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj2hhhjQhMubah}(h]j-ah ](jjeh"]h$]h&]jj)jhuh1jhjQhMhj/hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj/hhhjQhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjjjuh1jhhhjC`hNhNubh)}(h``memtostr_pad (dest, src)``h]j)}(hjph]hmemtostr_pad (dest, src)}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjC`hhubj)}(h]Copy a possibly non-NUL-term string to a NUL-term string with NUL padding in the destination h]h)}(h\Copy a possibly non-NUL-term string to a NUL-term string with NUL padding in the destinationh]h\Copy a possibly non-NUL-term string to a NUL-term string with NUL padding in the destination}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjC`hhubj)}(hX@**Parameters** ``dest`` Pointer to destination NUL-terminates string ``src`` Pointer to character array (likely marked as __nonstring) **Description** This is a replacement for strncpy() uses where the source is not a NUL-terminated string. Note that sizes of **dest** and **src** must be known at compile-time.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj )}(hhh](j)}(h6``dest`` Pointer to destination NUL-terminates string h](j)}(h``dest``h]j)}(hjh]hdest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj2)}(hhh]h)}(h,Pointer to destination NUL-terminates stringh]h,Pointer to destination NUL-terminates string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hB``src`` Pointer to character array (likely marked as __nonstring) h](j)}(h``src``h]j)}(hjh]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj2)}(hhh]h)}(h9Pointer to character array (likely marked as __nonstring)h]h9Pointer to character array (likely marked as __nonstring)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj8h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubh)}(hYThis is a replacement for strncpy() uses where the source is not a NUL-terminated string.h]hYThis is a replacement for strncpy() uses where the source is not a NUL-terminated string.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubh)}(hFNote that sizes of **dest** and **src** must be known at compile-time.h](hNote that sizes of }(hj]hhhNhNubj)}(h**dest**h]hdest}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubh and }(hj]hhhNhNubj)}(h**src**h]hsrc}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubh must be known at compile-time.}(hj]hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memset_after (C macro)c.memset_afterhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h memset_afterh]j)}(h memset_afterh]j{)}(h memset_afterh]j)}(hjh]h memset_after}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubh)}(h!``memset_after (obj, v, member)``h]j)}(hjh]hmemset_after (obj, v, member)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjC`hhubj)}(h9Set a value after a struct member to the end of a struct h]h)}(h8Set a value after a struct member to the end of a structh]h8Set a value after a struct member to the end of a struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjC`hhubj)}(h**Parameters** ``obj`` Address of target struct instance ``v`` Byte value to repeatedly write ``member`` after which struct member to start writing bytes **Description** This is good for clearing padding following the given member.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj )}(hhh](j)}(h*``obj`` Address of target struct instance h](j)}(h``obj``h]j)}(hj:h]hobj}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhj4ubj2)}(hhh]h)}(h!Address of target struct instanceh]h!Address of target struct instance}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjPubah}(h]h ]h"]h$]h&]uh1j1hj4ubeh}(h]h ]h"]h$]h&]uh1jhjOhMhj1ubj)}(h%``v`` Byte value to repeatedly write h](j)}(h``v``h]j)}(hjsh]hv}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjmubj2)}(hhh]h)}(hByte value to repeatedly writeh]hByte value to repeatedly write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjhMhj1ubj)}(h<``member`` after which struct member to start writing bytes h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj2)}(hhh]h)}(h0after which struct member to start writing bytesh]h0after which struct member to start writing bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj1ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubh)}(h=This is good for clearing padding following the given member.h]h=This is good for clearing padding following the given member.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memset_startat (C macro)c.memset_startathNtauh1hhjC`hhhNhNubj)}(hhh](j)}(hmemset_startath]j)}(hmemset_startath]j{)}(hmemset_startath]j)}(hj&h]hmemset_startat}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj(hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj$hhhjChMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjChMhj!hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj!hhhjChMubeh}(h]h ](jmacroeh"]h$]h&]jjjj\jj\jjjuh1jhhhjC`hNhNubh)}(h#``memset_startat (obj, v, member)``h]j)}(hjbh]hmemset_startat (obj, v, member)}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjC`hhubj)}(h8Set a value starting at a member to the end of a struct h]h)}(h7Set a value starting at a member to the end of a structh]h7Set a value starting at a member to the end of a struct}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjxubah}(h]h ]h"]h$]h&]uh1jhjhMhjC`hhubj)}(hX-**Parameters** ``obj`` Address of target struct instance ``v`` Byte value to repeatedly write ``member`` struct member to start writing at **Description** Note that if there is padding between the prior member and the target member, memset_after() should be used to clear the prior padding.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM hjubj )}(hhh](j)}(h*``obj`` Address of target struct instance h](j)}(h``obj``h]j)}(hjh]hobj}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj2)}(hhh]h)}(h!Address of target struct instanceh]h!Address of target struct instance}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h%``v`` Byte value to repeatedly write h](j)}(h``v``h]j)}(hjh]hv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM hjubj2)}(hhh]h)}(hByte value to repeatedly writeh]hByte value to repeatedly write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h-``member`` struct member to start writing at h](j)}(h ``member``h]j)}(hj(h]hmember}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM hj"ubj2)}(hhh]h)}(h!struct member to start writing ath]h!struct member to start writing at}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM hj>ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hM hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjch]h Description}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM hjubh)}(hNote that if there is padding between the prior member and the target member, memset_after() should be used to clear the prior padding.h]hNote that if there is padding between the prior member and the target member, memset_after() should be used to clear the prior padding.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j str_has_prefix (C function)c.str_has_prefixhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h;size_t str_has_prefix (const char *str, const char *prefix)h]j)}(h:size_t str_has_prefix(const char *str, const char *prefix)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY str_has_prefixsbc.str_has_prefixasbuh1hhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hstr_has_prefixh]j)}(hjh]hstr_has_prefix}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h%(const char *str, const char *prefix)h](j)}(hconst char *strh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hstrh]hstr}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *prefixh](j)}(hjh]hconst}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj )}(hcharh]hchar}(hjrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjSubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj)}(hprefixh]hprefix}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h#Test if a string has a given prefixh]h#Test if a string has a given prefix}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(hX**Parameters** ``const char *str`` The string to test ``const char *prefix`` The string to see if **str** starts with **Description** A common way to test a prefix of a string is to do: strncmp(str, prefix, sizeof(prefix) - 1) But this can lead to bugs due to typos, or if prefix is a pointer and not a constant. Instead use str_has_prefix(). **Return** * strlen(**prefix**) if **str** starts with **prefix** * 0 if **str** does not start with **prefix**h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj )}(hhh](j)}(h'``const char *str`` The string to test h](j)}(h``const char *str``h]j)}(hjh]hconst char *str}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj2)}(hhh]h)}(hThe string to testh]hThe string to test}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h@``const char *prefix`` The string to see if **str** starts with h](j)}(h``const char *prefix``h]j)}(hj?h]hconst char *prefix}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhj9ubj2)}(hhh]h)}(h(The string to see if **str** starts withh](hThe string to see if }(hjXhhhNhNubj)}(h**str**h]hstr}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh starts with}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjThMhjUubah}(h]h ]h"]h$]h&]uh1j1hj9ubeh}(h]h ]h"]h$]h&]uh1jhjThMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj )}(hhh]j)}(h]A common way to test a prefix of a string is to do: strncmp(str, prefix, sizeof(prefix) - 1) h](j)}(h3A common way to test a prefix of a string is to do:h]h3A common way to test a prefix of a string is to do:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubj2)}(hhh]h)}(h(strncmp(str, prefix, sizeof(prefix) - 1)h]h(strncmp(str, prefix, sizeof(prefix) - 1)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(hsBut this can lead to bugs due to typos, or if prefix is a pointer and not a constant. Instead use str_has_prefix().h]hsBut this can lead to bugs due to typos, or if prefix is a pointer and not a constant. Instead use str_has_prefix().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM!hjubj)}(hhh](j)}(h4strlen(**prefix**) if **str** starts with **prefix**h]h)}(hjh](hstrlen(}(hj hhhNhNubj)}(h **prefix**h]hprefix}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh) if }(hj hhhNhNubj)}(h**str**h]hstr}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh starts with }(hj hhhNhNubj)}(h **prefix**h]hprefix}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM"hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h+0 if **str** does not start with **prefix**h]h)}(hjQh](h0 if }(hjShhhNhNubj)}(h**str**h]hstr}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubh does not start with }(hjShhhNhNubj)}(h **prefix**h]hprefix}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM#hjOubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjHhM"hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strstarts (C function) c.strstartshNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h4bool strstarts (const char *str, const char *prefix)h]j)}(h3bool strstarts(const char *str, const char *prefix)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM-ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM-ubj{)}(h strstartsh]j)}(h strstartsh]h strstarts}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM-ubj)}(h%(const char *str, const char *prefix)h](j)}(hconst char *strh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hstrh]hstr}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *prefixh](j)}(hjh]hconst}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj )}(hcharh]hchar}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(hprefixh]hprefix}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM-ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM-ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM-hjhhubj)}(hhh]h)}(h#does **str** start with **prefix**?h](hdoes }(hjhhhNhNubj)}(h**str**h]hstr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh start with }(hjhhhNhNubj)}(h **prefix**h]hprefix}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh?}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM-hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM-ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const char *str`` string to examine ``const char *prefix`` prefix to look for. **Return** True if **str** begins with **prefix**. False in all other cases.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM1hjubj )}(hhh](j)}(h&``const char *str`` string to examine h](j)}(h``const char *str``h]j)}(hjh]hconst char *str}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM.hjubj2)}(hhh]h)}(hstring to examineh]hstring to examine}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hM.hj/ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj.hM.hjubj)}(h+``const char *prefix`` prefix to look for. h](j)}(h``const char *prefix``h]j)}(hjRh]hconst char *prefix}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM/hjLubj2)}(hhh]h)}(hprefix to look for.h]hprefix to look for.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghM/hjhubah}(h]h ]h"]h$]h&]uh1j1hjLubeh}(h]h ]h"]h$]h&]uh1jhjghM/hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM1hjubh)}(hATrue if **str** begins with **prefix**. False in all other cases.h](hTrue if }(hjhhhNhNubj)}(h**str**h]hstr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh begins with }(hjhhhNhNubj)}(h **prefix**h]hprefix}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. False in all other cases.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM1hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strends (C function) c.strendshNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h3bool strends (const char *str, const char *suffix)h]j)}(h1bool strends(const char *str, const char *suffix)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM:ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM:ubj{)}(hstrendsh]j)}(hstrendsh]hstrends}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM:ubj)}(h%(const char *str, const char *suffix)h](j)}(hconst char *strh](j)}(hjh]hconst}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj )}(hcharh]hchar}(hjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hjh]h*}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hstrh]hstr}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*ubj)}(hconst char *suffixh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsuffixh]hsuffix}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM:ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM:ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM:hjhhubj)}(hhh]h)}(h+Check if a string ends with another string.h]h+Check if a string ends with another string.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM:hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM:ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(hX**Parameters** ``const char *str`` NULL-terminated string to check against **suffix** ``const char *suffix`` NULL-terminated string defining the suffix to look for in **str** **Return** True if **str** ends with **suffix**. False in all other cases.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM>hjubj )}(hhh](j)}(hG``const char *str`` NULL-terminated string to check against **suffix** h](j)}(h``const char *str``h]j)}(hj>h]hconst char *str}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM;hj8ubj2)}(hhh]h)}(h2NULL-terminated string to check against **suffix**h](h(NULL-terminated string to check against }(hjWhhhNhNubj)}(h **suffix**h]hsuffix}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1hhjShM;hjTubah}(h]h ]h"]h$]h&]uh1j1hj8ubeh}(h]h ]h"]h$]h&]uh1jhjShM;hj5ubj)}(hY``const char *suffix`` NULL-terminated string defining the suffix to look for in **str** h](j)}(h``const char *suffix``h]j)}(hjh]hconst char *suffix}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM<hjubj2)}(hhh]h)}(hANULL-terminated string defining the suffix to look for in **str**h](h:NULL-terminated string defining the suffix to look for in }(hjhhhNhNubj)}(h**str**h]hstr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhjhM<hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM<hj5ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM>hjubh)}(h?True if **str** ends with **suffix**. False in all other cases.h](hTrue if }(hjhhhNhNubj)}(h**str**h]hstr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ends with }(hjhhhNhNubj)}(h **suffix**h]hsuffix}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. False in all other cases.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:39: ./include/linux/string.hhM>hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kstrdup (C function) c.kstrduphNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h)char * kstrdup (const char *s, gfp_t gfp)h]j)}(h'char *kstrdup(const char *s, gfp_t gfp)h](j )}(hcharh]hchar}(hj7hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj3hhhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKKubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3hhhjEhKKubj)}(hjh]h*}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3hhhjEhKKubj{)}(hkstrduph]j)}(hkstrduph]hkstrdup}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj3hhhjEhKKubj)}(h(const char *s, gfp_t gfp)h](j)}(h const char *sh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj)}(hjY)h]hs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jgsb c.kstrdupasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubeh}(h]h ]h"]h$]h&]jjuh1jhj3hhhjEhKKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj/hhhjEhKKubah}(h]j*ah ](jjeh"]h$]h&]jj)jhuh1jhjEhKKhj,hhubj)}(hhh]h)}(h.allocate space for and copy an existing stringh]h.allocate space for and copy an existing string}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKKhj5hhubah}(h]h ]h"]h$]h&]uh1jhj,hhhjEhKKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjPjjPjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const char *s`` the string to duplicate ``gfp_t gfp`` the GFP mask used in the kmalloc() call when allocating memory **Return** newly allocated copy of **s** or ``NULL`` in case of errorh](h)}(h**Parameters**h]j)}(hjZh]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKOhjTubj )}(hhh](j)}(h*``const char *s`` the string to duplicate h](j)}(h``const char *s``h]j)}(hjyh]h const char *s}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKLhjsubj2)}(hhh]h)}(hthe string to duplicateh]hthe string to duplicate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKLhjubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjhKLhjpubj)}(hM``gfp_t gfp`` the GFP mask used in the kmalloc() call when allocating memory h](j)}(h ``gfp_t gfp``h]j)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKMhjubj2)}(hhh]h)}(h>the GFP mask used in the kmalloc() call when allocating memoryh]h>the GFP mask used in the kmalloc() call when allocating memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKMhjpubeh}(h]h ]h"]h$]h&]uh1j hjTubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKOhjTubh)}(h:newly allocated copy of **s** or ``NULL`` in case of errorh](hnewly allocated copy of }(hjhhhNhNubj)}(h**s**h]hs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh or }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh in case of error}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKOhjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kstrdup_const (C function)c.kstrdup_consthNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h5const char * kstrdup_const (const char *s, gfp_t gfp)h]j)}(h3const char *kstrdup_const(const char *s, gfp_t gfp)h](j)}(hjh]hconst}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKYubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRhhhjchKYubj )}(hcharh]hchar}(hjrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjRhhhjchKYubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRhhhjchKYubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhhjchKYubj{)}(h kstrdup_consth]j)}(h kstrdup_consth]h kstrdup_const}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjRhhhjchKYubj)}(h(const char *s, gfp_t gfp)h](j)}(h const char *sh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjY)h]hs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.kstrdup_constasbuh1hhjubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hgfph]hgfp}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjRhhhjchKYubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjNhhhjchKYubah}(h]jIah ](jjeh"]h$]h&]jj)jhuh1jhjchKYhjKhhubj)}(hhh]h)}(h0conditionally duplicate an existing const stringh]h0conditionally duplicate an existing const string}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKYhjohhubah}(h]h ]h"]h$]h&]uh1jhjKhhhjchKYubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(hXT**Parameters** ``const char *s`` the string to duplicate ``gfp_t gfp`` the GFP mask used in the kmalloc() call when allocating memory **Note** Strings allocated by kstrdup_const should be freed by kfree_const and must not be passed to krealloc(). **Return** source string if it is in .rodata section otherwise fallback to kstrdup.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chK]hjubj )}(hhh](j)}(h*``const char *s`` the string to duplicate h](j)}(h``const char *s``h]j)}(hjh]h const char *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKZhjubj2)}(hhh]h)}(hthe string to duplicateh]hthe string to duplicate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKZhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKZhjubj)}(hM``gfp_t gfp`` the GFP mask used in the kmalloc() call when allocating memory h](j)}(h ``gfp_t gfp``h]j)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chK[hjubj2)}(hhh]h)}(h>the GFP mask used in the kmalloc() call when allocating memoryh]h>the GFP mask used in the kmalloc() call when allocating memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK[hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK[hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Note**h]j)}(hj'h]hNote}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chK]hjubh)}(hgStrings allocated by kstrdup_const should be freed by kfree_const and must not be passed to krealloc().h]hgStrings allocated by kstrdup_const should be freed by kfree_const and must not be passed to krealloc().}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chK]hjubh)}(h **Return**h]j)}(hjNh]hReturn}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chK`hjubh)}(hHsource string if it is in .rodata section otherwise fallback to kstrdup.h]hHsource string if it is in .rodata section otherwise fallback to kstrdup.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chK`hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kstrndup (C function) c.kstrnduphNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h6char * kstrndup (const char *s, size_t max, gfp_t gfp)h]j)}(h4char *kstrndup(const char *s, size_t max, gfp_t gfp)h](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKmubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKmubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKmubj{)}(hkstrnduph]j)}(hkstrnduph]hkstrndup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKmubj)}(h&(const char *s, size_t max, gfp_t gfp)h](j)}(h const char *sh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjY)h]hs}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t maxh](h)}(hhh]j)}(hsize_th]hsize_t}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj>modnameN classnameNj] j` )}jc ]jf )}jY jsb c.kstrndupasbuh1hhj5ubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hmaxh]hmax}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jX c.kstrndupasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKmubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKmubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKmhjhhubj)}(hhh]h)}(h.allocate space for and copy an existing stringh]h.allocate space for and copy an existing string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKmhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKmubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(hXN**Parameters** ``const char *s`` the string to duplicate ``size_t max`` read at most **max** chars from **s** ``gfp_t gfp`` the GFP mask used in the kmalloc() call when allocating memory **Note** Use kmemdup_nul() instead if the size is known exactly. **Return** newly allocated copy of **s** or ``NULL`` in case of errorh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKqhjubj )}(hhh](j)}(h*``const char *s`` the string to duplicate h](j)}(h``const char *s``h]j)}(hjh]h const char *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKnhjubj2)}(hhh]h)}(hthe string to duplicateh]hthe string to duplicate}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hKnhj3ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj2hKnhjubj)}(h5``size_t max`` read at most **max** chars from **s** h](j)}(h``size_t max``h]j)}(hjVh]h size_t max}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKohjPubj2)}(hhh]h)}(h%read at most **max** chars from **s**h](h read at most }(hjohhhNhNubj)}(h**max**h]hmax}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh chars from }(hjohhhNhNubj)}(h**s**h]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1hhjkhKohjlubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhjkhKohjubj)}(hM``gfp_t gfp`` the GFP mask used in the kmalloc() call when allocating memory h](j)}(h ``gfp_t gfp``h]j)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKphjubj2)}(hhh]h)}(h>the GFP mask used in the kmalloc() call when allocating memoryh]h>the GFP mask used in the kmalloc() call when allocating memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKphjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKphjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKrhjubh)}(h7Use kmemdup_nul() instead if the size is known exactly.h]h7Use kmemdup_nul() instead if the size is known exactly.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKrhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKthjubh)}(h:newly allocated copy of **s** or ``NULL`` in case of errorh](hnewly allocated copy of }(hj'hhhNhNubj)}(h**s**h]hs}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh or }(hj'hhhNhNubj)}(h``NULL``h]hNULL}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh in case of error}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKthjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kmemdup (C function) c.kmemduphNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h7void * kmemdup (const void *src, size_t len, gfp_t gfp)h]j)}(h5void *kmemdup(const void *src, size_t len, gfp_t gfp)h](j )}(hvoidh]hvoid}(hjzhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjvhhhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chK}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvhhhjhK}ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvhhhjhK}ubj{)}(hkmemduph]j)}(hkmemduph]hkmemdup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjvhhhjhK}ubj)}(h((const void *src, size_t len, gfp_t gfp)h](j)}(hconst void *srch](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsrch]hsrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(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&] refdomainjreftypejY reftargetj&modnameN classnameNj] j` )}jc ]jf )}jY jsb c.kmemdupasbuh1hhjubj2)}(h h]h }(hjDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjpmodnameN classnameNj] j` )}jc ]j@ c.kmemdupasbuh1hhjgubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjvhhhjhK}ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjrhhhjhK}ubah}(h]jmah ](jjeh"]h$]h&]jj)jhuh1jhjhK}hjohhubj)}(hhh]h)}(hduplicate region of memoryh]hduplicate region of memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chK}hjhhubah}(h]h ]h"]h$]h&]uh1jhjohhhjhK}ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(hX **Parameters** ``const void *src`` memory region to duplicate ``size_t len`` memory region length ``gfp_t gfp`` GFP mask to use **Return** newly allocated copy of **src** or ``NULL`` in case of error, result is physically contiguous. Use kfree() to free.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubj )}(hhh](j)}(h/``const void *src`` memory region to duplicate h](j)}(h``const void *src``h]j)}(hjh]hconst void *src}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubj2)}(hhh]h)}(hmemory region to duplicateh]hmemory region to duplicate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h$``size_t len`` memory region length h](j)}(h``size_t len``h]j)}(hj>h]h size_t len}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhj8ubj2)}(hhh]h)}(hmemory region lengthh]hmemory region length}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShKhjTubah}(h]h ]h"]h$]h&]uh1j1hj8ubeh}(h]h ]h"]h$]h&]uh1jhjShKhjubj)}(h``gfp_t gfp`` GFP mask to use h](j)}(h ``gfp_t gfp``h]j)}(hjwh]h gfp_t gfp}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjqubj2)}(hhh]h)}(hGFP mask to useh]hGFP mask to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjqubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubh)}(hsnewly allocated copy of **src** or ``NULL`` in case of error, result is physically contiguous. Use kfree() to free.h](hnewly allocated copy of }(hjhhhNhNubj)}(h**src**h]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh or }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhH in case of error, result is physically contiguous. Use kfree() to free.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kmemdup_nul (C function) c.kmemdup_nulhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h9char * kmemdup_nul (const char *s, size_t len, gfp_t gfp)h]j)}(h7char *kmemdup_nul(const char *s, size_t len, gfp_t gfp)h](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj)hKubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj)hKubj{)}(h kmemdup_nulh]j)}(h kmemdup_nulh]h kmemdup_nul}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj)hKubj)}(h&(const char *s, size_t len, gfp_t gfp)h](j)}(h const char *sh](j)}(hjh]hconst}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj)}(hjY)h]hs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jKsb c.kmemdup_nulasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.kmemdup_nulasbuh1hhjubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hgfph]hgfp}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj)hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj)hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj)hKhjhhubj)}(hhh]h)}(h5Create a NUL-terminated string from unterminated datah]h5Create a NUL-terminated string from unterminated data}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjahhubah}(h]h ]h"]h$]h&]uh1jhjhhhj)hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj|jj|jjjuh1jhhhjC`hNhNubj)}(hX **Parameters** ``const char *s`` The data to stringify ``size_t len`` The size of the data ``gfp_t gfp`` the GFP mask used in the kmalloc() call when allocating memory **Return** newly allocated copy of **s** with NUL-termination or ``NULL`` in case of errorh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubj )}(hhh](j)}(h(``const char *s`` The data to stringify h](j)}(h``const char *s``h]j)}(hjh]h const char *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubj2)}(hhh]h)}(hThe data to stringifyh]hThe data to stringify}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h$``size_t len`` The size of the data h](j)}(h``size_t len``h]j)}(hjh]h size_t len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubj2)}(hhh]h)}(hThe size of the datah]hThe size of the data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hM``gfp_t gfp`` the GFP mask used in the kmalloc() call when allocating memory h](j)}(h ``gfp_t gfp``h]j)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubj2)}(hhh]h)}(h>the GFP mask used in the kmalloc() call when allocating memoryh]h>the GFP mask used in the kmalloc() call when allocating memory}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj-ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj,hKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjRh]hReturn}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubh)}(hOnewly allocated copy of **s** with NUL-termination or ``NULL`` in case of errorh](hnewly allocated copy of }(hjhhhhNhNubj)}(h**s**h]hs}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh with NUL-termination or }(hjhhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh in case of error}(hjhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memdup_user (C function) c.memdup_userhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h7void * memdup_user (const void __user *src, size_t len)h]j)}(h5void *memdup_user(const void __user *src, size_t len)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj{)}(h memdup_userh]j)}(h memdup_userh]h memdup_user}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h$(const void __user *src, size_t len)h](j)}(hconst void __user *srch](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh__user}(hjhhhNhNubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsrch]hsrc}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjymodnameN classnameNj] j` )}jc ]jf )}jY jsb c.memdup_userasbuh1hhjpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h'duplicate memory region from user spaceh]h'duplicate memory region from user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const void __user *src`` source address in user space ``size_t len`` number of bytes to copy **Return** an ERR_PTR() on failure. Result is physically contiguous, to be freed by kfree().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubj )}(hhh](j)}(h8``const void __user *src`` source address in user space h](j)}(h``const void __user *src``h]j)}(hjh]hconst void __user *src}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhj ubj2)}(hhh]h)}(hsource address in user spaceh]hsource address in user space}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hKhj&ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj%hKhjubj)}(h'``size_t len`` number of bytes to copy h](j)}(h``size_t len``h]j)}(hjIh]h size_t len}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjCubj2)}(hhh]h)}(hnumber of bytes to copyh]hnumber of bytes to copy}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hKhj_ubah}(h]h ]h"]h$]h&]uh1j1hjCubeh}(h]h ]h"]h$]h&]uh1jhj^hKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubh)}(hRan ERR_PTR() on failure. Result is physically contiguous, to be freed by kfree().h]hRan ERR_PTR() on failure. Result is physically contiguous, to be freed by kfree().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j vmemdup_user (C function)c.vmemdup_userhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h8void * vmemdup_user (const void __user *src, size_t len)h]j)}(h6void *vmemdup_user(const void __user *src, size_t len)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj{)}(h vmemdup_userh]j)}(h vmemdup_userh]h vmemdup_user}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h$(const void __user *src, size_t len)h](j)}(hconst void __user *srch](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hj.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh__user}(hjhhhNhNubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsrch]hsrc}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.vmemdup_userasbuh1hhj~ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h'duplicate memory region from user spaceh]h'duplicate memory region from user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const void __user *src`` source address in user space ``size_t len`` number of bytes to copy **Return** an ERR_PTR() on failure. Result may be not physically contiguous. Use kvfree() to free.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubj )}(hhh](j)}(h8``const void __user *src`` source address in user space h](j)}(h``const void __user *src``h]j)}(hjh]hconst void __user *src}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubj2)}(hhh]h)}(hsource address in user spaceh]hsource address in user space}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hKhj4ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj3hKhjubj)}(h'``size_t len`` number of bytes to copy h](j)}(h``size_t len``h]j)}(hjWh]h size_t len}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjQubj2)}(hhh]h)}(hnumber of bytes to copyh]hnumber of bytes to copy}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhKhjmubah}(h]h ]h"]h$]h&]uh1j1hjQubeh}(h]h ]h"]h$]h&]uh1jhjlhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubh)}(hYan ERR_PTR() on failure. Result may be not physically contiguous. Use kvfree() to free.h]hYan ERR_PTR() on failure. Result may be not physically contiguous. Use kvfree() to free.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j strndup_user (C function)c.strndup_userhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h2char * strndup_user (const char __user *s, long n)h]j)}(h0char *strndup_user(const char __user *s, long n)h](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj{)}(h strndup_userh]j)}(h strndup_userh]h strndup_user}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(const char __user *s, long n)h](j)}(hconst char __user *sh](j)}(hjh]hconst}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj<hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh__user}(hjhhhNhNubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjY)h]hs}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hlong nh](j )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h,duplicate an existing string from user spaceh]h,duplicate an existing string from user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const char __user *s`` The string to duplicate ``long n`` Maximum number of bytes to copy, including the trailing NUL. **Return** newly allocated copy of **s** or an ERR_PTR() in case of errorh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chM hjubj )}(hhh](j)}(h1``const char __user *s`` The string to duplicate h](j)}(h``const char __user *s``h]j)}(hjh]hconst char __user *s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chMhjubj2)}(hhh]h)}(hThe string to duplicateh]hThe string to duplicate}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj+ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj ubj)}(hH``long n`` Maximum number of bytes to copy, including the trailing NUL. h](j)}(h ``long n``h]j)}(hjNh]hlong n}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chMhjHubj2)}(hhh]h)}(hnewly allocated copy of **s** or an ERR_PTR() in case of errorh](hnewly allocated copy of }(hjhhhNhNubj)}(h**s**h]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh! or an ERR_PTR() in case of error}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memdup_user_nul (C function)c.memdup_user_nulhNtauh1hhjC`hhhNhNubj)}(hhh](j)}(h;void * memdup_user_nul (const void __user *src, size_t len)h]j)}(h9void *memdup_user_nul(const void __user *src, size_t len)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chM$ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM$ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM$ubj{)}(hmemdup_user_nulh]j)}(hmemdup_user_nulh]hmemdup_user_nul}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM$ubj)}(h$(const void __user *src, size_t len)h](j)}(hconst void __user *srch](j)}(hjh]hconst}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj )}(hvoidh]hvoid}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&ubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubh__user}(hj&hhhNhNubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj)}(hjh]h*}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hsrch]hsrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.memdup_user_nulasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM$ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM$ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM$hjhhubj)}(hhh]h)}(h9duplicate memory region from user space and NUL-terminateh]h9duplicate memory region from user space and NUL-terminate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chM$hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM$ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjC`hNhNubj)}(h**Parameters** ``const void __user *src`` source address in user space ``size_t len`` number of bytes to copy **Return** an ERR_PTR() on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chM(hjubj )}(hhh](j)}(h8``const void __user *src`` source address in user space h](j)}(h``const void __user *src``h]j)}(hj5h]hconst void __user *src}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chM&hj/ubj2)}(hhh]h)}(hsource address in user spaceh]hsource address in user space}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhM&hjKubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhjJhM&hj,ubj)}(h'``size_t len`` number of bytes to copy h](j)}(h``size_t len``h]j)}(hjnh]h size_t len}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chM'hjhubj2)}(hhh]h)}(hnumber of bytes to copyh]hnumber of bytes to copy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM'hjubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhjhM'hj,ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chM)hjubh)}(han ERR_PTR() on failure.h]han ERR_PTR() on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:42: ./mm/util.chM)hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjC`hhhNhNubeh}(h]string-manipulationah ]h"]string manipulationah$]h&]uh1hhhhhhhhKubeh}(h]basic-c-library-functionsah ]h"]basic c library functionsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hBasic Kernel Library Functionsh]hBasic Kernel Library Functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK/ubh)}(h7The Linux kernel provides more basic utility functions.h]h7The Linux kernel provides more basic utility functions.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjhhubh)}(hhh](h)}(hBit Operationsh]hBit Operations}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK4ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j set_bit (C function) c.set_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(h4void set_bit (long nr, volatile unsigned long *addr)h]j)}(h3void set_bit(long nr, volatile unsigned long *addr)h](j )}(hvoidh]hvoid}(hj.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*hhht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*hhhj<hKubj{)}(hset_bith]j)}(hset_bith]hset_bit}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj*hhhj<hKubj)}(h'(long nr, volatile unsigned long *addr)h](j)}(hlong nrh](j )}(hlongh]hlong}(hjkhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjgubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubj)}(hvolatile unsigned long *addrh](j)}(hvolatileh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubeh}(h]h ]h"]h$]h&]jjuh1jhj*hhhj<hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj&hhhj<hKubah}(h]j!ah ](jjeh"]h$]h&]jj)jhuh1jhj<hKhj#hhubj)}(hhh]h)}(hAtomically set a bit in memoryh]hAtomically set a bit in memory}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKhj(hhubah}(h]h ]h"]h$]h&]uh1jhj#hhhj<hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjCjjCjjjuh1jhhhjhNhNubj)}(hX>**Parameters** ``long nr`` the bit to set ``volatile unsigned long *addr`` the address to start counting from **Description** This is a relaxed atomic operation (no implied memory barriers). Note that **nr** may be almost arbitrarily large; this function is not restricted to acting on a single-word quantity.h](h)}(h**Parameters**h]j)}(hjMh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKhjGubj )}(hhh](j)}(h``long nr`` the bit to set h](j)}(h ``long nr``h]j)}(hjlh]hlong nr}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKhjfubj2)}(hhh]h)}(hthe bit to seth]hthe bit to set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjfubeh}(h]h ]h"]h$]h&]uh1jhjhKhjcubj)}(hD``volatile unsigned long *addr`` the address to start counting from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKhjubj2)}(hhh]h)}(h"the address to start counting fromh]h"the address to start counting from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjcubeh}(h]h ]h"]h$]h&]uh1j hjGubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKhjGubh)}(h@This is a relaxed atomic operation (no implied memory barriers).h]h@This is a relaxed atomic operation (no implied memory barriers).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKhjGubh)}(hvNote that **nr** may be almost arbitrarily large; this function is not restricted to acting on a single-word quantity.h](h Note that }(hjhhhNhNubj)}(h**nr**h]hnr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhf may be almost arbitrarily large; this function is not restricted to acting on a single-word quantity.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKhjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clear_bit (C function) c.clear_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(h6void clear_bit (long nr, volatile unsigned long *addr)h]j)}(h5void clear_bit(long nr, volatile unsigned long *addr)h](j )}(hvoidh]hvoid}(hjFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBhhht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK!ubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBhhhjThK!ubj{)}(h clear_bith]j)}(h clear_bith]h clear_bit}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjBhhhjThK!ubj)}(h'(long nr, volatile unsigned long *addr)h](j)}(hlong nrh](j )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubeh}(h]h ]h"]h$]h&]jjuh1jhjBhhhjThK!ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj>hhhjThK!ubah}(h]j9ah ](jjeh"]h$]h&]jj)jhuh1jhjThK!hj;hhubj)}(hhh]h)}(hClears a bit in memoryh]hClears a bit in memory}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK!hj?hhubah}(h]h ]h"]h$]h&]uh1jhj;hhhjThK!ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjZjjZjjjuh1jhhhjhNhNubj)}(h**Parameters** ``long nr`` Bit to clear ``volatile unsigned long *addr`` Address to start counting from **Description** This is a relaxed atomic operation (no implied memory barriers).h](h)}(h**Parameters**h]j)}(hjdh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK%hj^ubj )}(hhh](j)}(h``long nr`` Bit to clear h](j)}(h ``long nr``h]j)}(hjh]hlong nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK"hj}ubj2)}(hhh]h)}(h Bit to clearh]h Bit to clear}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK"hjubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhjhK"hjzubj)}(h@``volatile unsigned long *addr`` Address to start counting from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK#hjubj2)}(hhh]h)}(hAddress to start counting fromh]hAddress to start counting from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK#hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK#hjzubeh}(h]h ]h"]h$]h&]uh1j hj^ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK%hj^ubh)}(h@This is a relaxed atomic operation (no implied memory barriers).h]h@This is a relaxed atomic operation (no implied memory barriers).}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK$hj^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j change_bit (C function) c.change_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(h7void change_bit (long nr, volatile unsigned long *addr)h]j)}(h6void change_bit(long nr, volatile unsigned long *addr)h](j )}(hvoidh]hvoid}(hj<hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj8hhht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK.ubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8hhhjJhK.ubj{)}(h change_bith]j)}(h change_bith]h change_bit}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj8hhhjJhK.ubj)}(h'(long nr, volatile unsigned long *addr)h](j)}(hlong nrh](j )}(hlongh]hlong}(hjyhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjuubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjuubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjqubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjqubeh}(h]h ]h"]h$]h&]jjuh1jhj8hhhjJhK.ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj4hhhjJhK.ubah}(h]j/ah ](jjeh"]h$]h&]jj)jhuh1jhjJhK.hj1hhubj)}(hhh]h)}(hToggle a bit in memoryh]hToggle a bit in memory}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK.hj5hhubah}(h]h ]h"]h$]h&]uh1jhj1hhhjJhK.ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjPjjPjjjuh1jhhhjhNhNubj)}(hX9**Parameters** ``long nr`` Bit to change ``volatile unsigned long *addr`` Address to start counting from **Description** This is a relaxed atomic operation (no implied memory barriers). Note that **nr** may be almost arbitrarily large; this function is not restricted to acting on a single-word quantity.h](h)}(h**Parameters**h]j)}(hjZh]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK2hjTubj )}(hhh](j)}(h``long nr`` Bit to change h](j)}(h ``long nr``h]j)}(hjyh]hlong nr}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK/hjsubj2)}(hhh]h)}(h Bit to changeh]h Bit to change}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK/hjubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjhK/hjpubj)}(h@``volatile unsigned long *addr`` Address to start counting from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK0hjubj2)}(hhh]h)}(hAddress to start counting fromh]hAddress to start counting from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK0hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK0hjpubeh}(h]h ]h"]h$]h&]uh1j hjTubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK2hjTubh)}(h@This is a relaxed atomic operation (no implied memory barriers).h]h@This is a relaxed atomic operation (no implied memory barriers).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK1hjTubh)}(hvNote that **nr** may be almost arbitrarily large; this function is not restricted to acting on a single-word quantity.h](h Note that }(hjhhhNhNubj)}(h**nr**h]hnr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhf may be almost arbitrarily large; this function is not restricted to acting on a single-word quantity.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK3hjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j test_and_set_bit (C function)c.test_and_set_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(h=bool test_and_set_bit (long nr, volatile unsigned long *addr)h]j)}(hubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOhhhj`hK>ubj{)}(htest_and_set_bith]j)}(htest_and_set_bith]htest_and_set_bit}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjOhhhj`hK>ubj)}(h'(long nr, volatile unsigned long *addr)h](j)}(hlong nrh](j )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjOhhhj`hK>ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjKhhhj`hK>ubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhj`hK>hjHhhubj)}(hhh]h)}(h"Set a bit and return its old valueh]h"Set a bit and return its old value}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK>hjKhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhj`hK>ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjfjjfjjjuh1jhhhjhNhNubj)}(h**Parameters** ``long nr`` Bit to set ``volatile unsigned long *addr`` Address to count from **Description** This is an atomic fully-ordered operation (implied full memory barrier).h](h)}(h**Parameters**h]j)}(hjph]h Parameters}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKBhjjubj )}(hhh](j)}(h``long nr`` Bit to set h](j)}(h ``long nr``h]j)}(hjh]hlong nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK?hjubj2)}(hhh]h)}(h Bit to seth]h Bit to set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK?hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK?hjubj)}(h7``volatile unsigned long *addr`` Address to count from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK@hjubj2)}(hhh]h)}(hAddress to count fromh]hAddress to count from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK@hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK@hjubeh}(h]h ]h"]h$]h&]uh1j hjjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKBhjjubh)}(hHThis is an atomic fully-ordered operation (implied full memory barrier).h]hHThis is an atomic fully-ordered operation (implied full memory barrier).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKAhjjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j test_and_clear_bit (C function)c.test_and_clear_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(h?bool test_and_clear_bit (long nr, volatile unsigned long *addr)h]j)}(h>bool test_and_clear_bit(long nr, volatile unsigned long *addr)h](j )}(hj8h]hbool}(hjHhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjDhhht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKLubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDhhhjUhKLubj{)}(htest_and_clear_bith]j)}(htest_and_clear_bith]htest_and_clear_bit}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjDhhhjUhKLubj)}(h'(long nr, volatile unsigned long *addr)h](j)}(hlong nrh](j )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|ubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|ubeh}(h]h ]h"]h$]h&]jjuh1jhjDhhhjUhKLubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj@hhhjUhKLubah}(h]j;ah ](jjeh"]h$]h&]jj)jhuh1jhjUhKLhj=hhubj)}(hhh]h)}(h$Clear a bit and return its old valueh]h$Clear a bit and return its old value}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKLhj@hhubah}(h]h ]h"]h$]h&]uh1jhj=hhhjUhKLubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[jj[jjjuh1jhhhjhNhNubj)}(h**Parameters** ``long nr`` Bit to clear ``volatile unsigned long *addr`` Address to count from **Description** This is an atomic fully-ordered operation (implied full memory barrier).h](h)}(h**Parameters**h]j)}(hjeh]h Parameters}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKPhj_ubj )}(hhh](j)}(h``long nr`` Bit to clear h](j)}(h ``long nr``h]j)}(hjh]hlong nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKMhj~ubj2)}(hhh]h)}(h Bit to clearh]h Bit to clear}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKMhjubah}(h]h ]h"]h$]h&]uh1j1hj~ubeh}(h]h ]h"]h$]h&]uh1jhjhKMhj{ubj)}(h7``volatile unsigned long *addr`` Address to count from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKNhjubj2)}(hhh]h)}(hAddress to count fromh]hAddress to count from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKNhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKNhj{ubeh}(h]h ]h"]h$]h&]uh1j hj_ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKPhj_ubh)}(hHThis is an atomic fully-ordered operation (implied full memory barrier).h]hHThis is an atomic fully-ordered operation (implied full memory barrier).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKOhj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  test_and_change_bit (C function)c.test_and_change_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(h@bool test_and_change_bit (long nr, volatile unsigned long *addr)h]j)}(h?bool test_and_change_bit(long nr, volatile unsigned long *addr)h](j )}(hj8h]hbool}(hj=hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj9hhht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKZubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9hhhjJhKZubj{)}(htest_and_change_bith]j)}(htest_and_change_bith]htest_and_change_bit}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj9hhhjJhKZubj)}(h'(long nr, volatile unsigned long *addr)h](j)}(hlong nrh](j )}(hlongh]hlong}(hjyhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjuubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjuubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjqubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjqubeh}(h]h ]h"]h$]h&]jjuh1jhj9hhhjJhKZubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj5hhhjJhKZubah}(h]j0ah ](jjeh"]h$]h&]jj)jhuh1jhjJhKZhj2hhubj)}(hhh]h)}(h%Change a bit and return its old valueh]h%Change a bit and return its old value}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhKZhj5hhubah}(h]h ]h"]h$]h&]uh1jhj2hhhjJhKZubeh}(h]h ](jfunctioneh"]h$]h&]jjjjPjjPjjjuh1jhhhjhNhNubj)}(h**Parameters** ``long nr`` Bit to change ``volatile unsigned long *addr`` Address to count from **Description** This is an atomic fully-ordered operation (implied full memory barrier).h](h)}(h**Parameters**h]j)}(hjZh]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK^hjTubj )}(hhh](j)}(h``long nr`` Bit to change h](j)}(h ``long nr``h]j)}(hjyh]hlong nr}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK[hjsubj2)}(hhh]h)}(h Bit to changeh]h Bit to change}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK[hjubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjhK[hjpubj)}(h7``volatile unsigned long *addr`` Address to count from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK\hjubj2)}(hhh]h)}(hAddress to count fromh]hAddress to count from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK\hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK\hjpubeh}(h]h ]h"]h$]h&]uh1j hjTubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK^hjTubh)}(hHThis is an atomic fully-ordered operation (implied full memory barrier).h]hHThis is an atomic fully-ordered operation (implied full memory barrier).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hht/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:54: ./include/asm-generic/bitops/instrumented-atomic.hhK]hjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ___set_bit (C function) c.___set_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(h@void ___set_bit (unsigned long nr, volatile unsigned long *addr)h]j)}(h?void ___set_bit(unsigned long nr, volatile unsigned long *addr)h](j )}(hvoidh]hvoid}(hj2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.hhhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.hhhj@hKubj{)}(h ___set_bith]j)}(h ___set_bith]h ___set_bit}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj.hhhj@hKubj)}(h0(unsigned long nr, volatile unsigned long *addr)h](j)}(hunsigned long nrh](j )}(hunsignedh]hunsigned}(hjohhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjkubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjkubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubeh}(h]h ]h"]h$]h&]jjuh1jhj.hhhj@hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj*hhhj@hKubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj@hKhj'hhubj)}(hhh]h)}(hSet a bit in memoryh]hSet a bit in memory}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjGhhubah}(h]h ]h"]h$]h&]uh1jhj'hhhj@hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbjjbjjjuh1jhhhjhNhNubj)}(hX,**Parameters** ``unsigned long nr`` the bit to set ``volatile unsigned long *addr`` the address to start counting from **Description** Unlike set_bit(), this function is non-atomic. If it is called on the same region of memory concurrently, the effect may be that only one operation succeeds.h](h)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjfubj )}(hhh](j)}(h$``unsigned long nr`` the bit to set h](j)}(h``unsigned long nr``h]j)}(hjh]hunsigned long nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjubj2)}(hhh]h)}(hthe bit to seth]hthe bit to set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hD``volatile unsigned long *addr`` the address to start counting from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjubj2)}(hhh]h)}(h"the address to start counting fromh]h"the address to start counting from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1j hjfubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjfubh)}(hUnlike set_bit(), this function is non-atomic. If it is called on the same region of memory concurrently, the effect may be that only one operation succeeds.h]hUnlike set_bit(), this function is non-atomic. If it is called on the same region of memory concurrently, the effect may be that only one operation succeeds.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ___clear_bit (C function)c.___clear_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(hBvoid ___clear_bit (unsigned long nr, volatile unsigned long *addr)h]j)}(hAvoid ___clear_bit(unsigned long nr, volatile unsigned long *addr)h](j )}(hvoidh]hvoid}(hjDhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj@hhhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK!ubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@hhhjRhK!ubj{)}(h ___clear_bith]j)}(h ___clear_bith]h ___clear_bit}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj@hhhjRhK!ubj)}(h0(unsigned long nr, volatile unsigned long *addr)h](j)}(hunsigned long nrh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubeh}(h]h ]h"]h$]h&]jjuh1jhj@hhhjRhK!ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj<hhhjRhK!ubah}(h]j7ah ](jjeh"]h$]h&]jj)jhuh1jhjRhK!hj9hhubj)}(hhh]h)}(hClears a bit in memoryh]hClears a bit in memory}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK!hjYhhubah}(h]h ]h"]h$]h&]uh1jhj9hhhjRhK!ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjtjjtjjjuh1jhhhjhNhNubj)}(hX0**Parameters** ``unsigned long nr`` the bit to clear ``volatile unsigned long *addr`` the address to start counting from **Description** Unlike clear_bit(), this function is non-atomic. If it is called on the same region of memory concurrently, the effect may be that only one operation succeeds.h](h)}(h**Parameters**h]j)}(hj~h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK%hjxubj )}(hhh](j)}(h&``unsigned long nr`` the bit to clear h](j)}(h``unsigned long nr``h]j)}(hjh]hunsigned long nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK"hjubj2)}(hhh]h)}(hthe bit to clearh]hthe bit to clear}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK"hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK"hjubj)}(hD``volatile unsigned long *addr`` the address to start counting from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK#hjubj2)}(hhh]h)}(h"the address to start counting fromh]h"the address to start counting from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK#hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK#hjubeh}(h]h ]h"]h$]h&]uh1j hjxubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK%hjxubh)}(hUnlike clear_bit(), this function is non-atomic. If it is called on the same region of memory concurrently, the effect may be that only one operation succeeds.h]hUnlike clear_bit(), this function is non-atomic. If it is called on the same region of memory concurrently, the effect may be that only one operation succeeds.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK$hjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ___change_bit (C function)c.___change_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(hCvoid ___change_bit (unsigned long nr, volatile unsigned long *addr)h]j)}(hBvoid ___change_bit(unsigned long nr, volatile unsigned long *addr)h](j )}(hvoidh]hvoid}(hjVhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjRhhhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK1ubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRhhhjdhK1ubj{)}(h ___change_bith]j)}(h ___change_bith]h ___change_bit}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjRhhhjdhK1ubj)}(h0(unsigned long nr, volatile unsigned long *addr)h](j)}(hunsigned long nrh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjRhhhjdhK1ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjNhhhjdhK1ubah}(h]jIah ](jjeh"]h$]h&]jj)jhuh1jhjdhK1hjKhhubj)}(hhh]h)}(hToggle a bit in memoryh]hToggle a bit in memory}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK1hjkhhubah}(h]h ]h"]h$]h&]uh1jhjKhhhjdhK1ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX2**Parameters** ``unsigned long nr`` the bit to change ``volatile unsigned long *addr`` the address to start counting from **Description** Unlike change_bit(), this function is non-atomic. If it is called on the same region of memory concurrently, the effect may be that only one operation succeeds.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK5hjubj )}(hhh](j)}(h'``unsigned long nr`` the bit to change h](j)}(h``unsigned long nr``h]j)}(hjh]hunsigned long nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK2hjubj2)}(hhh]h)}(hthe bit to changeh]hthe bit to change}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK2hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK2hjubj)}(hD``volatile unsigned long *addr`` the address to start counting from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK3hjubj2)}(hhh]h)}(h"the address to start counting fromh]h"the address to start counting from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK3hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK3hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj#h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK5hjubh)}(hUnlike change_bit(), this function is non-atomic. If it is called on the same region of memory concurrently, the effect may be that only one operation succeeds.h]hUnlike change_bit(), this function is non-atomic. If it is called on the same region of memory concurrently, the effect may be that only one operation succeeds.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK4hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  ___test_and_set_bit (C function)c.___test_and_set_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(hIbool ___test_and_set_bit (unsigned long nr, volatile unsigned long *addr)h]j)}(hHbool ___test_and_set_bit(unsigned long nr, volatile unsigned long *addr)h](j )}(hj8h]hbool}(hjhhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdhhhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKYubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdhhhjuhKYubj{)}(h___test_and_set_bith]j)}(h___test_and_set_bith]h___test_and_set_bit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjdhhhjuhKYubj)}(h0(unsigned long nr, volatile unsigned long *addr)h](j)}(hunsigned long nrh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hj,hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjdhhhjuhKYubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj`hhhjuhKYubah}(h]j[ah ](jjeh"]h$]h&]jj)jhuh1jhjuhKYhj]hhubj)}(hhh]h)}(h"Set a bit and return its old valueh]h"Set a bit and return its old value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKYhj|hhubah}(h]h ]h"]h$]h&]uh1jhj]hhhjuhKYubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``unsigned long nr`` Bit to set ``volatile unsigned long *addr`` Address to count from **Description** This operation is non-atomic. If two instances of this operation race, one can appear to succeed but actually fail.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK]hjubj )}(hhh](j)}(h ``unsigned long nr`` Bit to set h](j)}(h``unsigned long nr``h]j)}(hjh]hunsigned long nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKZhjubj2)}(hhh]h)}(h Bit to seth]h Bit to set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKZhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKZhjubj)}(h7``volatile unsigned long *addr`` Address to count from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK[hjubj2)}(hhh]h)}(hAddress to count fromh]hAddress to count from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK[hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK[hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj4h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK]hjubh)}(hsThis operation is non-atomic. If two instances of this operation race, one can appear to succeed but actually fail.h]hsThis operation is non-atomic. If two instances of this operation race, one can appear to succeed but actually fail.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK\hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "___test_and_clear_bit (C function)c.___test_and_clear_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(hKbool ___test_and_clear_bit (unsigned long nr, volatile unsigned long *addr)h]j)}(hJbool ___test_and_clear_bit(unsigned long nr, volatile unsigned long *addr)h](j )}(hj8h]hbool}(hjyhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjuhhhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjuhhhjhKhubj{)}(h___test_and_clear_bith]j)}(h___test_and_clear_bith]h___test_and_clear_bit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjuhhhjhKhubj)}(h0(unsigned long nr, volatile unsigned long *addr)h](j)}(hunsigned long nrh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hj!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hj=hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjuhhhjhKhubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjqhhhjhKhubah}(h]jlah ](jjeh"]h$]h&]jj)jhuh1jhjhKhhjnhhubj)}(hhh]h)}(h$Clear a bit and return its old valueh]h$Clear a bit and return its old value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhhjhhubah}(h]h ]h"]h$]h&]uh1jhjnhhhjhKhubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``unsigned long nr`` Bit to clear ``volatile unsigned long *addr`` Address to count from **Description** This operation is non-atomic. If two instances of this operation race, one can appear to succeed but actually fail.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKlhjubj )}(hhh](j)}(h"``unsigned long nr`` Bit to clear h](j)}(h``unsigned long nr``h]j)}(hjh]hunsigned long nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKihjubj2)}(hhh]h)}(h Bit to clearh]h Bit to clear}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKihjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKihjubj)}(h7``volatile unsigned long *addr`` Address to count from h](j)}(h ``volatile unsigned long *addr``h]j)}(hj h]hvolatile unsigned long *addr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKjhjubj2)}(hhh]h)}(hAddress to count fromh]hAddress to count from}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKjhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKjhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjEh]h Description}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKlhjubh)}(hsThis operation is non-atomic. If two instances of this operation race, one can appear to succeed but actually fail.h]hsThis operation is non-atomic. If two instances of this operation race, one can appear to succeed but actually fail.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKkhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #___test_and_change_bit (C function)c.___test_and_change_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(hLbool ___test_and_change_bit (unsigned long nr, volatile unsigned long *addr)h]j)}(hKbool ___test_and_change_bit(unsigned long nr, volatile unsigned long *addr)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKwubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKwubj{)}(h___test_and_change_bith]j)}(h___test_and_change_bith]h___test_and_change_bit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKwubj)}(h0(unsigned long nr, volatile unsigned long *addr)h](j)}(hunsigned long nrh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hj2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjNhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKwubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKwubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1jhjhKwhjhhubj)}(hhh]h)}(h%Change a bit and return its old valueh]h%Change a bit and return its old value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKwhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKwubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``unsigned long nr`` Bit to change ``volatile unsigned long *addr`` Address to count from **Description** This operation is non-atomic. If two instances of this operation race, one can appear to succeed but actually fail.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK{hjubj )}(hhh](j)}(h#``unsigned long nr`` Bit to change h](j)}(h``unsigned long nr``h]j)}(hjh]hunsigned long nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKxhjubj2)}(hhh]h)}(h Bit to changeh]h Bit to change}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKxhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKxhjubj)}(h7``volatile unsigned long *addr`` Address to count from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKyhjubj2)}(hhh]h)}(hAddress to count fromh]hAddress to count from}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hKyhj1ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj0hKyhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjVh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhK{hjubh)}(hsThis operation is non-atomic. If two instances of this operation race, one can appear to succeed but actually fail.h]hsThis operation is non-atomic. If two instances of this operation race, one can appear to succeed but actually fail.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKzhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j _test_bit (C function) c._test_bithNtauh1hhjhhhNhNubj)}(hhh](j)}(hEbool _test_bit (unsigned long nr, const volatile unsigned long *addr)h]j)}(hDbool _test_bit(unsigned long nr, volatile const unsigned long *addr)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(h _test_bith]j)}(h _test_bith]h _test_bit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h6(unsigned long nr, volatile const unsigned long *addr)h](j)}(hunsigned long nrh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h"volatile const unsigned long *addrh](j)}(hjh]hvolatile}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(hjh]hconst}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj )}(hunsignedh]hunsigned}(hj^hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj )}(hlongh]hlong}(hjzhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(hDetermine whether a bit is seth]hDetermine whether a bit is set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``unsigned long nr`` bit number to test ``const volatile unsigned long *addr`` Address to start counting fromh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjubj )}(hhh](j)}(h(``unsigned long nr`` bit number to test h](j)}(h``unsigned long nr``h]j)}(hjh]hunsigned long nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjubj2)}(hhh]h)}(hbit number to testh]hbit number to test}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hKhj$ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj#hKhjubj)}(hE``const volatile unsigned long *addr`` Address to start counting fromh](j)}(h&``const volatile unsigned long *addr``h]j)}(hjGh]h"const volatile unsigned long *addr}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjAubj2)}(hhh]h)}(hAddress to start counting fromh]hAddress to start counting from}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhj]ubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj\hKhjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j _test_bit_acquire (C function)c._test_bit_acquirehNtauh1hhjhhhNhNubj)}(hhh](j)}(hMbool _test_bit_acquire (unsigned long nr, const volatile unsigned long *addr)h]j)}(hLbool _test_bit_acquire(unsigned long nr, volatile const unsigned long *addr)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(h_test_bit_acquireh]j)}(h_test_bit_acquireh]h_test_bit_acquire}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h6(unsigned long nr, volatile const unsigned long *addr)h](j)}(hunsigned long nrh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h"volatile const unsigned long *addrh](j)}(hjh]hvolatile}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj)}(hjh]hconst}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj )}(hunsignedh]hunsigned}(hjdhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h7Determine, with acquire semantics, whether a bit is seth]h7Determine, with acquire semantics, whether a bit is set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``unsigned long nr`` bit number to test ``const volatile unsigned long *addr`` Address to start counting fromh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjubj )}(hhh](j)}(h(``unsigned long nr`` bit number to test h](j)}(h``unsigned long nr``h]j)}(hjh]hunsigned long nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjubj2)}(hhh]h)}(hbit number to testh]hbit number to test}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hKhj*ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj)hKhj ubj)}(hE``const volatile unsigned long *addr`` Address to start counting fromh](j)}(h&``const volatile unsigned long *addr``h]j)}(hjMh]h"const volatile unsigned long *addr}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjGubj2)}(hhh]h)}(hAddress to start counting fromh]hAddress to start counting from}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:57: ./include/asm-generic/bitops/instrumented-non-atomic.hhKhjcubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhjbhKhj ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clear_bit_unlock (C function)c.clear_bit_unlockhNtauh1hhjhhhNhNubj)}(hhh](j)}(h=void clear_bit_unlock (long nr, volatile unsigned long *addr)h]j)}(hah"]h$]h&]uh1j1hjhhhjhKubj{)}(hclear_bit_unlockh]j)}(hclear_bit_unlockh]hclear_bit_unlock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h'(long nr, volatile unsigned long *addr)h](j)}(hlong nrh](j )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hj4hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjPhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h!Clear a bit in memory, for unlockh]h!Clear a bit in memory, for unlock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``long nr`` the bit to set ``volatile unsigned long *addr`` the address to start counting from **Description** This operation is atomic and provides release barrier semantics.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKhjubj )}(hhh](j)}(h``long nr`` the bit to set h](j)}(h ``long nr``h]j)}(hjh]hlong nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKhjubj2)}(hhh]h)}(hthe bit to seth]hthe bit to set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hD``volatile unsigned long *addr`` the address to start counting from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKhjubj2)}(hhh]h)}(h"the address to start counting fromh]h"the address to start counting from}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hKhj3ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj2hKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjXh]h Description}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKhjubh)}(h@This operation is atomic and provides release barrier semantics.h]h@This operation is atomic and provides release barrier semantics.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __clear_bit_unlock (C function)c.__clear_bit_unlockhNtauh1hhjhhhNhNubj)}(hhh](j)}(h?void __clear_bit_unlock (long nr, volatile unsigned long *addr)h]j)}(h>void __clear_bit_unlock(long nr, volatile unsigned long *addr)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(h__clear_bit_unlockh]j)}(h__clear_bit_unlockh]h__clear_bit_unlock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h'(long nr, volatile unsigned long *addr)h](j)}(hlong nrh](j )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hunsignedh]hunsigned}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hlongh]hlong}(hjFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(haddrh]haddr}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(hClears a bit in memoryh]hClears a bit in memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX7**Parameters** ``long nr`` Bit to clear ``volatile unsigned long *addr`` Address to start counting from **Description** This is a non-atomic operation but implies a release barrier before the memory operation. It can be used for an unlock if no other CPUs can concurrently modify other bits in the word.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK#hjubj )}(hhh](j)}(h``long nr`` Bit to clear h](j)}(h ``long nr``h]j)}(hjh]hlong nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK hjubj2)}(hhh]h)}(h Bit to clearh]h Bit to clear}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK hjubj)}(h@``volatile unsigned long *addr`` Address to start counting from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK!hj ubj2)}(hhh]h)}(hAddress to start counting fromh]hAddress to start counting from}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hK!hj)ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj(hK!hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjNh]h Description}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK#hjubh)}(hThis is a non-atomic operation but implies a release barrier before the memory operation. It can be used for an unlock if no other CPUs can concurrently modify other bits in the word.h]hThis is a non-atomic operation but implies a release barrier before the memory operation. It can be used for an unlock if no other CPUs can concurrently modify other bits in the word.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK"hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "test_and_set_bit_lock (C function)c.test_and_set_bit_lockhNtauh1hhjhhhNhNubj)}(hhh](j)}(hBbool test_and_set_bit_lock (long nr, volatile unsigned long *addr)h]j)}(hAbool test_and_set_bit_lock(long nr, volatile unsigned long *addr)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK/ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhK/ubj{)}(htest_and_set_bit_lockh]j)}(htest_and_set_bit_lockh]htest_and_set_bit_lock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhK/ubj)}(h'(long nr, volatile unsigned long *addr)h](j)}(hlong nrh](j )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hj;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhK/ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK/ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK/hjhhubj)}(hhh]h)}(h,Set a bit and return its old value, for lockh]h,Set a bit and return its old value, for lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK/hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK/ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``long nr`` Bit to set ``volatile unsigned long *addr`` Address to count from **Description** This operation is atomic and provides acquire barrier semantics if the returned value is 0. It can be used to implement bit locks.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK3hjubj )}(hhh](j)}(h``long nr`` Bit to set h](j)}(h ``long nr``h]j)}(hjh]hlong nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK0hjubj2)}(hhh]h)}(h Bit to seth]h Bit to set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK0hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK0hjubj)}(h7``volatile unsigned long *addr`` Address to count from h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK1hjubj2)}(hhh]h)}(hAddress to count fromh]hAddress to count from}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK1hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK1hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjCh]h Description}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK3hjubh)}(hThis operation is atomic and provides acquire barrier semantics if the returned value is 0. It can be used to implement bit locks.h]hThis operation is atomic and provides acquire barrier semantics if the returned value is 0. It can be used to implement bit locks.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK2hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (xor_unlock_is_negative_byte (C function)c.xor_unlock_is_negative_bytehNtauh1hhjhhhNhNubj)}(hhh](j)}(hSbool xor_unlock_is_negative_byte (unsigned long mask, volatile unsigned long *addr)h]j)}(hRbool xor_unlock_is_negative_byte(unsigned long mask, volatile unsigned long *addr)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK>ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhK>ubj{)}(hxor_unlock_is_negative_byteh]j)}(hxor_unlock_is_negative_byteh]hxor_unlock_is_negative_byte}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhK>ubj)}(h2(unsigned long mask, volatile unsigned long *addr)h](j)}(hunsigned long maskh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hmaskh]hmask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvolatile unsigned long *addrh](j)}(hjh]hvolatile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(haddrh]haddr}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhK>ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK>ubah}(h]j{ah ](jjeh"]h$]h&]jj)jhuh1jhjhK>hj}hhubj)}(hhh]h)}(hCXOR a single byte in memory and test if it is negative, for unlock.h]hCXOR a single byte in memory and test if it is negative, for unlock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK>hjhhubah}(h]h ]h"]h$]h&]uh1jhj}hhhjhK>ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX-**Parameters** ``unsigned long mask`` Change the bits which are set in this mask. ``volatile unsigned long *addr`` The address of the word containing the byte to change. **Description** Changes some of bits 0-6 in the word pointed to by **addr**. This operation is atomic and provides release barrier semantics. Used to optimise some folio operations which are commonly paired with an unlock or end of writeback. Bit 7 is used as PG_waiters to indicate whether anybody is waiting for the unlock. **Return** Whether the top bit of the byte is set.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKBhjubj )}(hhh](j)}(hC``unsigned long mask`` Change the bits which are set in this mask. h](j)}(h``unsigned long mask``h]j)}(hjh]hunsigned long mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhK@hjubj2)}(hhh]h)}(h+Change the bits which are set in this mask.h]h+Change the bits which are set in this mask.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK@hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK@hjubj)}(hX``volatile unsigned long *addr`` The address of the word containing the byte to change. h](j)}(h ``volatile unsigned long *addr``h]j)}(hjh]hvolatile unsigned long *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKAhjubj2)}(hhh]h)}(h6The address of the word containing the byte to change.h]h6The address of the word containing the byte to change.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hKAhj/ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj.hKAhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjTh]h Description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKChjubh)}(hX6Changes some of bits 0-6 in the word pointed to by **addr**. This operation is atomic and provides release barrier semantics. Used to optimise some folio operations which are commonly paired with an unlock or end of writeback. Bit 7 is used as PG_waiters to indicate whether anybody is waiting for the unlock.h](h3Changes some of bits 0-6 in the word pointed to by }(hjjhhhNhNubj)}(h**addr**h]haddr}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubh. This operation is atomic and provides release barrier semantics. Used to optimise some folio operations which are commonly paired with an unlock or end of writeback. Bit 7 is used as PG_waiters to indicate whether anybody is waiting for the unlock.}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKBhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKHhjubh)}(h'Whether the top bit of the byte is set.h]h'Whether the top bit of the byte is set.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhr/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:60: ./include/asm-generic/bitops/instrumented-lock.hhKIhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]bit-operationsah ]h"]bit operationsah$]h&]uh1hhjhhhhhK4ubh)}(hhh](h)}(hBitmap Operationsh]hBitmap Operations}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK@ubh)}(hbitmaps provide an array of bits, implemented using an array of unsigned longs. The number of valid bits in a given bitmap does _not_ need to be an exact multiple of BITS_PER_LONG.h]hbitmaps provide an array of bits, implemented using an array of unsigned longs. The number of valid bits in a given bitmap does _not_ need to be an exact multiple of BITS_PER_LONG.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:66: ./lib/bitmap.chKhjhhubh)}(hXThe possible unused bits in the last, partially used word of a bitmap are 'don't care'. The implementation makes no particular effort to keep them zero. It ensures that their value will not affect the results of any operation. The bitmap operations that return Boolean (bitmap_empty, for example) or scalar (bitmap_weight, for example) results carefully filter out these unused bits from impacting their results.h]hXThe possible unused bits in the last, partially used word of a bitmap are ‘don’t care’. The implementation makes no particular effort to keep them zero. It ensures that their value will not affect the results of any operation. The bitmap operations that return Boolean (bitmap_empty, for example) or scalar (bitmap_weight, for example) results carefully filter out these unused bits from impacting their results.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:66: ./lib/bitmap.chKhjhhubh)}(hThe byte ordering of bitmaps is more natural on little endian architectures. See the big-endian headers include/asm-ppc64/bitops.h and include/asm-s390/bitops.h for the best explanations of this ordering.h]hThe byte ordering of bitmaps is more natural on little endian architectures. See the big-endian headers include/asm-ppc64/bitops.h and include/asm-s390/bitops.h for the best explanations of this ordering.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:66: ./lib/bitmap.chKhjhhubh)}(hThe DECLARE_BITMAP(name,bits) macro, in linux/types.h, can be used to declare an array named 'name' of just enough unsigned longs to contain all bit positions from 0 to 'bits' - 1.h]hThe DECLARE_BITMAP(name,bits) macro, in linux/types.h, can be used to declare an array named ‘name’ of just enough unsigned longs to contain all bit positions from 0 to ‘bits’ - 1.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:69: ./include/linux/bitmap.hhK}hjhhubh)}(hwThe available bitmap operations and their rough meaning in the case that the bitmap is a single unsigned long are thus:h]hwThe available bitmap operations and their rough meaning in the case that the bitmap is a single unsigned long are thus:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:72: ./include/linux/bitmap.hhK!hjhhubh)}(hcThe generated code is more efficient when nbits is known at compile-time and at most BITS_PER_LONG.h]hcThe generated code is more efficient when nbits is known at compile-time and at most BITS_PER_LONG.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:72: ./include/linux/bitmap.hhK$hjhhubj7C)}(hXbitmap_zero(dst, nbits) *dst = 0UL bitmap_fill(dst, nbits) *dst = ~0UL bitmap_copy(dst, src, nbits) *dst = *src bitmap_and(dst, src1, src2, nbits) *dst = *src1 & *src2 bitmap_or(dst, src1, src2, nbits) *dst = *src1 | *src2 bitmap_weighted_or(dst, src1, src2, nbits) *dst = *src1 | *src2. Returns Hamming Weight of dst bitmap_weighted_xor(dst, src1, src2, nbits) *dst = *src1 ^ *src2. Returns Hamming Weight of dst bitmap_xor(dst, src1, src2, nbits) *dst = *src1 ^ *src2 bitmap_andnot(dst, src1, src2, nbits) *dst = *src1 & ~(*src2) bitmap_complement(dst, src, nbits) *dst = ~(*src) bitmap_equal(src1, src2, nbits) Are *src1 and *src2 equal? bitmap_intersects(src1, src2, nbits) Do *src1 and *src2 overlap? bitmap_subset(src1, src2, nbits) Is *src1 a subset of *src2? bitmap_empty(src, nbits) Are all bits zero in *src? bitmap_full(src, nbits) Are all bits set in *src? bitmap_weight(src, nbits) Hamming Weight: number set bits bitmap_weight_and(src1, src2, nbits) Hamming Weight of and'ed bitmap bitmap_weight_andnot(src1, src2, nbits) Hamming Weight of andnot'ed bitmap bitmap_weight_from(src, start, end) Hamming Weight starting from **start** bitmap_set(dst, pos, nbits) Set specified bit area bitmap_clear(dst, pos, nbits) Clear specified bit area bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area bitmap_find_next_zero_area_off(buf, len, pos, n, mask, mask_off) as above bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n bitmap_shift_left(dst, src, n, nbits) *dst = *src << n bitmap_cut(dst, src, first, n, nbits) Cut n bits from first, copy rest bitmap_replace(dst, old, new, mask, nbits) *dst = (*old & ~(*mask)) | (*new & *mask) bitmap_scatter(dst, src, mask, nbits) *dst = map(dense, sparse)(src) bitmap_gather(dst, src, mask, nbits) *dst = map(sparse, dense)(src) bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src) bitmap_bitremap(oldbit, old, new, nbits) newbit = map(old, new)(oldbit) bitmap_onto(dst, orig, relmap, nbits) *dst = orig relative to relmap bitmap_fold(dst, orig, sz, nbits) dst bits = orig bits mod sz bitmap_parse(buf, buflen, dst, nbits) Parse bitmap dst from kernel buf bitmap_parse_user(ubuf, ulen, dst, nbits) Parse bitmap dst from user buf bitmap_parselist(buf, dst, nbits) Parse bitmap dst from kernel buf bitmap_parselist_user(buf, dst, nbits) Parse bitmap dst from user buf bitmap_find_free_region(bitmap, bits, order) Find and allocate bit region bitmap_release_region(bitmap, pos, order) Free specified bit region bitmap_allocate_region(bitmap, pos, order) Allocate specified bit region bitmap_from_arr32(dst, buf, nbits) Copy nbits from u32[] buf to dst bitmap_from_arr64(dst, buf, nbits) Copy nbits from u64[] buf to dst bitmap_to_arr32(buf, src, nbits) Copy nbits from buf to u32[] dst bitmap_to_arr64(buf, src, nbits) Copy nbits from buf to u64[] dst bitmap_get_value8(map, start) Get 8bit value from map at start bitmap_set_value8(map, value, start) Set 8bit value to map at start bitmap_read(map, start, nbits) Read an nbits-sized value from map at start bitmap_write(map, value, start, nbits) Write an nbits-sized value to map at starth]hXbitmap_zero(dst, nbits) *dst = 0UL bitmap_fill(dst, nbits) *dst = ~0UL bitmap_copy(dst, src, nbits) *dst = *src bitmap_and(dst, src1, src2, nbits) *dst = *src1 & *src2 bitmap_or(dst, src1, src2, nbits) *dst = *src1 | *src2 bitmap_weighted_or(dst, src1, src2, nbits) *dst = *src1 | *src2. Returns Hamming Weight of dst bitmap_weighted_xor(dst, src1, src2, nbits) *dst = *src1 ^ *src2. Returns Hamming Weight of dst bitmap_xor(dst, src1, src2, nbits) *dst = *src1 ^ *src2 bitmap_andnot(dst, src1, src2, nbits) *dst = *src1 & ~(*src2) bitmap_complement(dst, src, nbits) *dst = ~(*src) bitmap_equal(src1, src2, nbits) Are *src1 and *src2 equal? bitmap_intersects(src1, src2, nbits) Do *src1 and *src2 overlap? bitmap_subset(src1, src2, nbits) Is *src1 a subset of *src2? bitmap_empty(src, nbits) Are all bits zero in *src? bitmap_full(src, nbits) Are all bits set in *src? bitmap_weight(src, nbits) Hamming Weight: number set bits bitmap_weight_and(src1, src2, nbits) Hamming Weight of and'ed bitmap bitmap_weight_andnot(src1, src2, nbits) Hamming Weight of andnot'ed bitmap bitmap_weight_from(src, start, end) Hamming Weight starting from **start** bitmap_set(dst, pos, nbits) Set specified bit area bitmap_clear(dst, pos, nbits) Clear specified bit area bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area bitmap_find_next_zero_area_off(buf, len, pos, n, mask, mask_off) as above bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n bitmap_shift_left(dst, src, n, nbits) *dst = *src << n bitmap_cut(dst, src, first, n, nbits) Cut n bits from first, copy rest bitmap_replace(dst, old, new, mask, nbits) *dst = (*old & ~(*mask)) | (*new & *mask) bitmap_scatter(dst, src, mask, nbits) *dst = map(dense, sparse)(src) bitmap_gather(dst, src, mask, nbits) *dst = map(sparse, dense)(src) bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src) bitmap_bitremap(oldbit, old, new, nbits) newbit = map(old, new)(oldbit) bitmap_onto(dst, orig, relmap, nbits) *dst = orig relative to relmap bitmap_fold(dst, orig, sz, nbits) dst bits = orig bits mod sz bitmap_parse(buf, buflen, dst, nbits) Parse bitmap dst from kernel buf bitmap_parse_user(ubuf, ulen, dst, nbits) Parse bitmap dst from user buf bitmap_parselist(buf, dst, nbits) Parse bitmap dst from kernel buf bitmap_parselist_user(buf, dst, nbits) Parse bitmap dst from user buf bitmap_find_free_region(bitmap, bits, order) Find and allocate bit region bitmap_release_region(bitmap, pos, order) Free specified bit region bitmap_allocate_region(bitmap, pos, order) Allocate specified bit region bitmap_from_arr32(dst, buf, nbits) Copy nbits from u32[] buf to dst bitmap_from_arr64(dst, buf, nbits) Copy nbits from u64[] buf to dst bitmap_to_arr32(buf, src, nbits) Copy nbits from buf to u32[] dst bitmap_to_arr64(buf, src, nbits) Copy nbits from buf to u64[] dst bitmap_get_value8(map, start) Get 8bit value from map at start bitmap_set_value8(map, value, start) Set 8bit value to map at start bitmap_read(map, start, nbits) Read an nbits-sized value from map at start bitmap_write(map, value, start, nbits) Write an nbits-sized value to map at start}hj,sbah}(h]h ]h"]h$]h&]jjuh1j6ChZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:72: ./include/linux/bitmap.hhK)hjhhubh)}(hXNote, bitmap_zero() and bitmap_fill() operate over the region of unsigned longs, that is, bits behind bitmap till the unsigned long boundary will be zeroed or filled as well. Consider to use bitmap_clear() or bitmap_set() to make explicit zeroing or filling respectively.h]hXNote, bitmap_zero() and bitmap_fill() operate over the region of unsigned longs, that is, bits behind bitmap till the unsigned long boundary will be zeroed or filled as well. Consider to use bitmap_clear() or bitmap_set() to make explicit zeroing or filling respectively.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:72: ./include/linux/bitmap.hhK\hjhhubh)}(hAAlso the following operations in asm/bitops.h apply to bitmaps.::h]h@Also the following operations in asm/bitops.h apply to bitmaps.:}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:75: ./include/linux/bitmap.hhKfhjhhubj7C)}(hX{set_bit(bit, addr) *addr |= bit clear_bit(bit, addr) *addr &= ~bit change_bit(bit, addr) *addr ^= bit test_bit(bit, addr) Is bit set in *addr? test_and_set_bit(bit, addr) Set bit and return old value test_and_clear_bit(bit, addr) Clear bit and return old value test_and_change_bit(bit, addr) Change bit and return old value find_first_zero_bit(addr, nbits) Position first zero bit in *addr find_first_bit(addr, nbits) Position first set bit in *addr find_next_zero_bit(addr, nbits, bit) Position next zero bit in *addr >= bit find_next_bit(addr, nbits, bit) Position next set bit in *addr >= bit find_next_and_bit(addr1, addr2, nbits, bit) Same as find_next_bit, but in (*addr1 & *addr2)h]hX{set_bit(bit, addr) *addr |= bit clear_bit(bit, addr) *addr &= ~bit change_bit(bit, addr) *addr ^= bit test_bit(bit, addr) Is bit set in *addr? test_and_set_bit(bit, addr) Set bit and return old value test_and_clear_bit(bit, addr) Clear bit and return old value test_and_change_bit(bit, addr) Change bit and return old value find_first_zero_bit(addr, nbits) Position first zero bit in *addr find_first_bit(addr, nbits) Position first set bit in *addr find_next_zero_bit(addr, nbits, bit) Position next zero bit in *addr >= bit find_next_bit(addr, nbits, bit) Position next set bit in *addr >= bit find_next_and_bit(addr1, addr2, nbits, bit) Same as find_next_bit, but in (*addr1 & *addr2)}hjYsbah}(h]h ]h"]h$]h&]jjuh1j6ChZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:75: ./include/linux/bitmap.hhKhhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !__bitmap_shift_right (C function)c.__bitmap_shift_righthNtauh1hhjhhhNhNubj)}(hhh](j)}(hhvoid __bitmap_shift_right (unsigned long *dst, const unsigned long *src, unsigned shift, unsigned nbits)h]j)}(hgvoid __bitmap_shift_right(unsigned long *dst, const unsigned long *src, unsigned shift, unsigned nbits)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKSubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}hhhjhKSubj{)}(h__bitmap_shift_righth]j)}(h__bitmap_shift_righth]h__bitmap_shift_right}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj}hhhjhKSubj)}(hN(unsigned long *dst, const unsigned long *src, unsigned shift, unsigned nbits)h](j)}(hunsigned long *dsth](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdsth]hdst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst unsigned long *srch](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hj7hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjShhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsrch]hsrc}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned shifth](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hshifth]hshift}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned nbitsh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnbitsh]hnbits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj}hhhjhKSubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjyhhhjhKSubah}(h]jtah ](jjeh"]h$]h&]jj)jhuh1jhjhKShjvhhubj)}(hhh]h)}(h+logical right shift of the bits in a bitmaph]h+logical right shift of the bits in a bitmap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKShj hhubah}(h]h ]h"]h$]h&]uh1jhjvhhhjhKSubeh}(h]h ](jfunctioneh"]h$]h&]jjjj(jj(jjjuh1jhhhjhNhNubj)}(hX}**Parameters** ``unsigned long *dst`` destination bitmap ``const unsigned long *src`` source bitmap ``unsigned shift`` shift by this many bits ``unsigned nbits`` bitmap size, in bits **Description** Shifting right (dividing) means moving bits in the MS -> LS bit direction. Zeros are fed into the vacated MS positions and the LS bits shifted off the bottom are lost.h](h)}(h**Parameters**h]j)}(hj2h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKWhj,ubj )}(hhh](j)}(h*``unsigned long *dst`` destination bitmap h](j)}(h``unsigned long *dst``h]j)}(hjQh]hunsigned long *dst}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKThjKubj2)}(hhh]h)}(hdestination bitmaph]hdestination bitmap}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhKThjgubah}(h]h ]h"]h$]h&]uh1j1hjKubeh}(h]h ]h"]h$]h&]uh1jhjfhKThjHubj)}(h+``const unsigned long *src`` source bitmap h](j)}(h``const unsigned long *src``h]j)}(hjh]hconst unsigned long *src}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKUhjubj2)}(hhh]h)}(h source bitmaph]h source bitmap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKUhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKUhjHubj)}(h+``unsigned shift`` shift by this many bits h](j)}(h``unsigned shift``h]j)}(hjh]hunsigned shift}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKVhjubj2)}(hhh]h)}(hshift by this many bitsh]hshift by this many bits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKVhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKVhjHubj)}(h(``unsigned nbits`` bitmap size, in bits h](j)}(h``unsigned nbits``h]j)}(hjh]hunsigned nbits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKWhjubj2)}(hhh]h)}(hbitmap size, in bitsh]hbitmap size, in bits}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKWhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hKWhjHubeh}(h]h ]h"]h$]h&]uh1j hj,ubh)}(h**Description**h]j)}(hj7 h]h Description}(hj9 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5 ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKYhj,ubh)}(hShifting right (dividing) means moving bits in the MS -> LS bit direction. Zeros are fed into the vacated MS positions and the LS bits shifted off the bottom are lost.h]hShifting right (dividing) means moving bits in the MS -> LS bit direction. Zeros are fed into the vacated MS positions and the LS bits shifted off the bottom are lost.}(hjM hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKXhj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  __bitmap_shift_left (C function)c.__bitmap_shift_lefthNtauh1hhjhhhNhNubj)}(hhh](j)}(hovoid __bitmap_shift_left (unsigned long *dst, const unsigned long *src, unsigned int shift, unsigned int nbits)h]j)}(hnvoid __bitmap_shift_left(unsigned long *dst, const unsigned long *src, unsigned int shift, unsigned int nbits)h](j )}(hvoidh]hvoid}(hj| hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjx hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjx hhhj hKubj{)}(h__bitmap_shift_lefth]j)}(h__bitmap_shift_lefth]h__bitmap_shift_left}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjx hhhj hKubj)}(hV(unsigned long *dst, const unsigned long *src, unsigned int shift, unsigned int nbits)h](j)}(hunsigned long *dsth](j )}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hlongh]hlong}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hdsth]hdst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hconst unsigned long *srch](j)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj$ hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hunsignedh]hunsigned}(hj2 hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj@ hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hlongh]hlong}(hjN hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj\ hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hjj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hsrch]hsrc}(hjw hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hunsigned int shifth](j )}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hshifth]hshift}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hnbitsh]hnbits}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjx hhhj hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjt hhhj hKubah}(h]jo ah ](jjeh"]h$]h&]jj)jhuh1jhj hKhjq hhubj)}(hhh]h)}(h*logical left shift of the bits in a bitmaph]h*logical left shift of the bits in a bitmap}(hjC hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKhj@ hhubah}(h]h ]h"]h$]h&]uh1jhjq hhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[ jj[ jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``unsigned long *dst`` destination bitmap ``const unsigned long *src`` source bitmap ``unsigned int shift`` shift by this many bits ``unsigned int nbits`` bitmap size, in bits **Description** Shifting left (multiplying) means moving bits in the LS -> MS direction. Zeros are fed into the vacated LS bit positions and those MS bits shifted off the top are lost.h](h)}(h**Parameters**h]j)}(hje h]h Parameters}(hjg hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKhj_ ubj )}(hhh](j)}(h*``unsigned long *dst`` destination bitmap h](j)}(h``unsigned long *dst``h]j)}(hj h]hunsigned long *dst}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKhj~ ubj2)}(hhh]h)}(hdestination bitmaph]hdestination bitmap}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1j1hj~ ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj{ ubj)}(h+``const unsigned long *src`` source bitmap h](j)}(h``const unsigned long *src``h]j)}(hj h]hconst unsigned long *src}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKhj ubj2)}(hhh]h)}(h source bitmaph]h source bitmap}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj{ ubj)}(h/``unsigned int shift`` shift by this many bits h](j)}(h``unsigned int shift``h]j)}(hj h]hunsigned int shift}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKhj ubj2)}(hhh]h)}(hshift by this many bitsh]hshift by this many bits}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj{ ubj)}(h,``unsigned int nbits`` bitmap size, in bits h](j)}(h``unsigned int nbits``h]j)}(hj/ h]hunsigned int nbits}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj- ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKhj) ubj2)}(hhh]h)}(hbitmap size, in bitsh]hbitmap size, in bits}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjD hKhjE ubah}(h]h ]h"]h$]h&]uh1j1hj) ubeh}(h]h ]h"]h$]h&]uh1jhjD hKhj{ ubeh}(h]h ]h"]h$]h&]uh1j hj_ ubh)}(h**Description**h]j)}(hjj h]h Description}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKhj_ ubh)}(hShifting left (multiplying) means moving bits in the LS -> MS direction. Zeros are fed into the vacated LS bit positions and those MS bits shifted off the top are lost.h]hShifting left (multiplying) means moving bits in the LS -> MS direction. Zeros are fed into the vacated LS bit positions and those MS bits shifted off the top are lost.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKhj_ ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_cut (C function) c.bitmap_cuthNtauh1hhjhhhNhNubj)}(hhh](j)}(hxvoid bitmap_cut (unsigned long *dst, const unsigned long *src, unsigned int first, unsigned int cut, unsigned int nbits)h]j)}(hwvoid bitmap_cut(unsigned long *dst, const unsigned long *src, unsigned int first, unsigned int cut, unsigned int nbits)h](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chKubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj hKubj{)}(h bitmap_cuth]j)}(h bitmap_cuth]h bitmap_cut}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj hKubj)}(hh(unsigned long *dst, const unsigned long *src, unsigned int first, unsigned int cut, unsigned int nbits)h](j)}(hunsigned long *dsth](j )}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hlongh]hlong}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj$ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hdsth]hdst}(hj1 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hconst unsigned long *srch](j)}(hjh]hconst}(hjJ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF ubj2)}(h h]h }(hjW hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjF ubj )}(hunsignedh]hunsigned}(hje hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjF ubj2)}(h h]h }(hjs hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjF ubj )}(hlongh]hlong}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjF ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjF ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF ubj)}(hsrch]hsrc}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hunsigned int firsth](j )}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hfirsth]hfirst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hunsigned int cuth](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcuth]hcut}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hjehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(hnbitsh]hnbits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhj hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hKhj hhubj)}(hhh]h)}(hah"]h$]h&]uh1j1hjhhhjhMubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hbitmap_find_next_zero_area_offh]j)}(hbitmap_find_next_zero_area_offh]hbitmap_find_next_zero_area_off}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(unsigned long *map, unsigned long size, unsigned long start, unsigned int nr, unsigned long align_mask, unsigned long align_offset)h](j)}(hunsigned long *maph](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hj4hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmaph]hmap}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long sizeh](j )}(hunsignedh]hunsigned}(hjvhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long starth](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int nrh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hj4hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnrh]hnr}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long align_maskh](j )}(hunsignedh]hunsigned}(hjihhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjeubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjeubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjeubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjeubj)}(h align_maskh]h align_mask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long align_offseth](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h align_offseth]h align_offset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h#find a contiguous aligned zero areah]h#find a contiguous aligned zero area}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4jj4jjjuh1jhhhjhNhNubj)}(hXF**Parameters** ``unsigned long *map`` The address to base the search on ``unsigned long size`` The bitmap size in bits ``unsigned long start`` The bitnumber to start searching at ``unsigned int nr`` The number of zeroed bits we're looking for ``unsigned long align_mask`` Alignment mask for zero area ``unsigned long align_offset`` Alignment offset for zero area. **Description** The **align_mask** should be one less than a power of 2; the effect is that the bit offset of all zero areas this function finds plus **align_offset** is multiple of that power of 2.h](h)}(h**Parameters**h]j)}(hj>h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhj8ubj )}(hhh](j)}(h9``unsigned long *map`` The address to base the search on h](j)}(h``unsigned long *map``h]j)}(hj]h]hunsigned long *map}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjWubj2)}(hhh]h)}(h!The address to base the search onh]h!The address to base the search on}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhMhjsubah}(h]h ]h"]h$]h&]uh1j1hjWubeh}(h]h ]h"]h$]h&]uh1jhjrhMhjTubj)}(h/``unsigned long size`` The bitmap size in bits h](j)}(h``unsigned long size``h]j)}(hjh]hunsigned long size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubj2)}(hhh]h)}(hThe bitmap size in bitsh]hThe bitmap size in bits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjTubj)}(h<``unsigned long start`` The bitnumber to start searching at h](j)}(h``unsigned long start``h]j)}(hjh]hunsigned long start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubj2)}(hhh]h)}(h#The bitnumber to start searching ath]h#The bitnumber to start searching at}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjTubj)}(h@``unsigned int nr`` The number of zeroed bits we're looking for h](j)}(h``unsigned int nr``h]j)}(hjh]hunsigned int nr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubj2)}(hhh]h)}(h+The number of zeroed bits we're looking forh]h-The number of zeroed bits we’re looking for}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjTubj)}(h:``unsigned long align_mask`` Alignment mask for zero area h](j)}(h``unsigned long align_mask``h]j)}(hjAh]hunsigned long align_mask}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhj;ubj2)}(hhh]h)}(hAlignment mask for zero areah]hAlignment mask for zero area}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjWubah}(h]h ]h"]h$]h&]uh1j1hj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhMhjTubj)}(h?``unsigned long align_offset`` Alignment offset for zero area. h](j)}(h``unsigned long align_offset``h]j)}(hjzh]hunsigned long align_offset}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjtubj2)}(hhh]h)}(hAlignment offset for zero area.h]hAlignment offset for zero area.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjtubeh}(h]h ]h"]h$]h&]uh1jhjhMhjTubeh}(h]h ]h"]h$]h&]uh1j hj8ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhj8ubh)}(hThe **align_mask** should be one less than a power of 2; the effect is that the bit offset of all zero areas this function finds plus **align_offset** is multiple of that power of 2.h](hThe }(hjhhhNhNubj)}(h**align_mask**h]h align_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubht should be one less than a power of 2; the effect is that the bit offset of all zero areas this function finds plus }(hjhhhNhNubj)}(h**align_offset**h]h align_offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is multiple of that power of 2.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhj8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_remap (C function)c.bitmap_remaphNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid bitmap_remap (unsigned long *dst, const unsigned long *src, const unsigned long *old, const unsigned long *new, unsigned int nbits)h]j)}(hvoid bitmap_remap(unsigned long *dst, const unsigned long *src, const unsigned long *old, const unsigned long *new, unsigned int nbits)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj,hMubj{)}(h bitmap_remaph]j)}(h bitmap_remaph]h bitmap_remap}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj,hMubj)}(hv(unsigned long *dst, const unsigned long *src, const unsigned long *old, const unsigned long *new, unsigned int nbits)h](j)}(hunsigned long *dsth](j )}(hunsignedh]hunsigned}(hj[hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj )}(hlongh]hlong}(hjwhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hdsth]hdst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubj)}(hconst unsigned long *srch](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsrch]hsrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubj)}(hconst unsigned long *oldh](j)}(hjh]hconst}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj )}(hunsignedh]hunsigned}(hjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj )}(hlongh]hlong}(hjihhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(holdh]hold}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubj)}(hconst unsigned long *newh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnewh]hnew}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hj$hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hinth]hint}(hj@hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hnbitsh]hnbits}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj,hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj,hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj,hMhjhhubj)}(hhh]h)}(h8Apply map defined by a pair of bitmaps to another bitmaph]h8Apply map defined by a pair of bitmaps to another bitmap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj,hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``unsigned long *dst`` remapped result ``const unsigned long *src`` subset to be remapped ``const unsigned long *old`` defines domain of map ``const unsigned long *new`` defines range of map ``unsigned int nbits`` number of bits in each of these bitmaps **Description** Let **old** and **new** define a mapping of bit positions, such that whatever position is held by the n-th set bit in **old** is mapped to the n-th set bit in **new**. In the more general case, allowing for the possibility that the weight 'w' of **new** is less than the weight of **old**, map the position of the n-th set bit in **old** to the position of the m-th set bit in **new**, where m == n % w. If either of the **old** and **new** bitmaps are empty, or if **src** and **dst** point to the same location, then this routine copies **src** to **dst**. The positions of unset bits in **old** are mapped to themselves (the identity map). Apply the above specified mapping to **src**, placing the result in **dst**, clearing any bits previously set in **dst**. For example, lets say that **old** has bits 4 through 7 set, and **new** has bits 12 through 15 set. This defines the mapping of bit position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other bit positions unchanged. So if say **src** comes into this routine with bits 1, 5 and 7 set, then **dst** should leave with bits 1, 13 and 15 set.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubj )}(hhh](j)}(h'``unsigned long *dst`` remapped result h](j)}(h``unsigned long *dst``h]j)}(hjh]hunsigned long *dst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubj2)}(hhh]h)}(hremapped resulth]hremapped result}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h3``const unsigned long *src`` subset to be remapped h](j)}(h``const unsigned long *src``h]j)}(hjh]hconst unsigned long *src}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubj2)}(hhh]h)}(hsubset to be remappedh]hsubset to be remapped}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h3``const unsigned long *old`` defines domain of map h](j)}(h``const unsigned long *old``h]j)}(hj9h]hconst unsigned long *old}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhj3ubj2)}(hhh]h)}(hdefines domain of maph]hdefines domain of map}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMhjOubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhjNhMhjubj)}(h2``const unsigned long *new`` defines range of map h](j)}(h``const unsigned long *new``h]j)}(hjrh]hconst unsigned long *new}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjlubj2)}(hhh]h)}(hdefines range of maph]hdefines range of map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjlubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h?``unsigned int nbits`` number of bits in each of these bitmaps h](j)}(h``unsigned int nbits``h]j)}(hjh]hunsigned int nbits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubj2)}(hhh]h)}(h'number of bits in each of these bitmapsh]h'number of bits in each of these bitmaps}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubh)}(hXLet **old** and **new** define a mapping of bit positions, such that whatever position is held by the n-th set bit in **old** is mapped to the n-th set bit in **new**. In the more general case, allowing for the possibility that the weight 'w' of **new** is less than the weight of **old**, map the position of the n-th set bit in **old** to the position of the m-th set bit in **new**, where m == n % w.h](hLet }(hjhhhNhNubj)}(h**old**h]hold}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**new**h]hnew}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh_ define a mapping of bit positions, such that whatever position is held by the n-th set bit in }(hjhhhNhNubj)}(h**old**h]hold}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh" is mapped to the n-th set bit in }(hjhhhNhNubj)}(h**new**h]hnew}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhU. In the more general case, allowing for the possibility that the weight ‘w’ of }(hjhhhNhNubj)}(h**new**h]hnew}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is less than the weight of }(hjhhhNhNubj)}(h**old**h]hold}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh*, map the position of the n-th set bit in }(hjhhhNhNubj)}(h**old**h]hold}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh( to the position of the m-th set bit in }(hjhhhNhNubj)}(h**new**h]hnew}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, where m == n % w.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubh)}(hIf either of the **old** and **new** bitmaps are empty, or if **src** and **dst** point to the same location, then this routine copies **src** to **dst**.h](hIf either of the }(hjhhhNhNubj)}(h**old**h]hold}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**new**h]hnew}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh bitmaps are empty, or if }(hjhhhNhNubj)}(h**src**h]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**dst**h]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh6 point to the same location, then this routine copies }(hjhhhNhNubj)}(h**src**h]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to }(hjhhhNhNubj)}(h**dst**h]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubh)}(hSThe positions of unset bits in **old** are mapped to themselves (the identity map).h](hThe positions of unset bits in }(hjhhhNhNubj)}(h**old**h]hold}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh- are mapped to themselves (the identity map).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubh)}(hyApply the above specified mapping to **src**, placing the result in **dst**, clearing any bits previously set in **dst**.h](h%Apply the above specified mapping to }(hj7hhhNhNubj)}(h**src**h]hsrc}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubh, placing the result in }(hj7hhhNhNubj)}(h**dst**h]hdst}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubh&, clearing any bits previously set in }(hj7hhhNhNubj)}(h**dst**h]hdst}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubh.}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubh)}(hXZFor example, lets say that **old** has bits 4 through 7 set, and **new** has bits 12 through 15 set. This defines the mapping of bit position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other bit positions unchanged. So if say **src** comes into this routine with bits 1, 5 and 7 set, then **dst** should leave with bits 1, 13 and 15 set.h](hFor example, lets say that }(hj|hhhNhNubj)}(h**old**h]hold}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubh has bits 4 through 7 set, and }(hj|hhhNhNubj)}(h**new**h]hnew}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubh has bits 12 through 15 set. This defines the mapping of bit position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other bit positions unchanged. So if say }(hj|hhhNhNubj)}(h**src**h]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubh8 comes into this routine with bits 1, 5 and 7 set, then }(hj|hhhNhNubj)}(h**dst**h]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubh) should leave with bits 1, 13 and 15 set.}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_bitremap (C function)c.bitmap_bitremaphNtauh1hhjhhhNhNubj)}(hhh](j)}(h^int bitmap_bitremap (int oldbit, const unsigned long *old, const unsigned long *new, int bits)h]j)}(h]int bitmap_bitremap(int oldbit, const unsigned long *old, const unsigned long *new, int bits)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hbitmap_bitremaph]j)}(hbitmap_bitremaph]hbitmap_bitremap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hJ(int oldbit, const unsigned long *old, const unsigned long *new, int bits)h](j)}(h int oldbith](j )}(hinth]hint}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj,ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubj)}(holdbith]holdbit}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubj)}(hconst unsigned long *oldh](j)}(hjh]hconst}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj)}(holdh]hold}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubj)}(hconst unsigned long *newh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnewh]hnew}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubj)}(hint bitsh](j )}(hinth]hint}(hjWhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjSubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hbitsh]hbits}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h6Apply map defined by a pair of bitmaps to a single bith]h6Apply map defined by a pair of bitmaps to a single bit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXS**Parameters** ``int oldbit`` bit position to be mapped ``const unsigned long *old`` defines domain of map ``const unsigned long *new`` defines range of map ``int bits`` number of bits in each of these bitmaps **Description** Let **old** and **new** define a mapping of bit positions, such that whatever position is held by the n-th set bit in **old** is mapped to the n-th set bit in **new**. In the more general case, allowing for the possibility that the weight 'w' of **new** is less than the weight of **old**, map the position of the n-th set bit in **old** to the position of the m-th set bit in **new**, where m == n % w. The positions of unset bits in **old** are mapped to themselves (the identity map). Apply the above specified mapping to bit position **oldbit**, returning the new bit position. For example, lets say that **old** has bits 4 through 7 set, and **new** has bits 12 through 15 set. This defines the mapping of bit position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other bit positions unchanged. So if say **oldbit** is 5, then this routine returns 13.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubj )}(hhh](j)}(h)``int oldbit`` bit position to be mapped h](j)}(h``int oldbit``h]j)}(hjh]h int oldbit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubj2)}(hhh]h)}(hbit position to be mappedh]hbit position to be mapped}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h3``const unsigned long *old`` defines domain of map h](j)}(h``const unsigned long *old``h]j)}(hjh]hconst unsigned long *old}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubj2)}(hhh]h)}(hdefines domain of maph]hdefines domain of map}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj-ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj,hMhjubj)}(h2``const unsigned long *new`` defines range of map h](j)}(h``const unsigned long *new``h]j)}(hjPh]hconst unsigned long *new}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjJubj2)}(hhh]h)}(hdefines range of maph]hdefines range of map}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMhjfubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjehMhjubj)}(h5``int bits`` number of bits in each of these bitmaps h](j)}(h ``int bits``h]j)}(hjh]hint bits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubj2)}(hhh]h)}(h'number of bits in each of these bitmapsh]h'number of bits in each of these bitmaps}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubh)}(hXLet **old** and **new** define a mapping of bit positions, such that whatever position is held by the n-th set bit in **old** is mapped to the n-th set bit in **new**. In the more general case, allowing for the possibility that the weight 'w' of **new** is less than the weight of **old**, map the position of the n-th set bit in **old** to the position of the m-th set bit in **new**, where m == n % w.h](hLet }(hjhhhNhNubj)}(h**old**h]hold}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**new**h]hnew}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh_ define a mapping of bit positions, such that whatever position is held by the n-th set bit in }(hjhhhNhNubj)}(h**old**h]hold}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh" is mapped to the n-th set bit in }(hjhhhNhNubj)}(h**new**h]hnew}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhU. In the more general case, allowing for the possibility that the weight ‘w’ of }(hjhhhNhNubj)}(h**new**h]hnew}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is less than the weight of }(hjhhhNhNubj)}(h**old**h]hold}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh*, map the position of the n-th set bit in }(hjhhhNhNubj)}(h**old**h]hold}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh( to the position of the m-th set bit in }(hjhhhNhNubj)}(h**new**h]hnew}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, where m == n % w.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhjubh)}(hSThe positions of unset bits in **old** are mapped to themselves (the identity map).h](hThe positions of unset bits in }(hjyhhhNhNubj)}(h**old**h]hold}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubh- are mapped to themselves (the identity map).}(hjyhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM#hjubh)}(h]Apply the above specified mapping to bit position **oldbit**, returning the new bit position.h](h2Apply the above specified mapping to bit position }(hjhhhNhNubj)}(h **oldbit**h]holdbit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh!, returning the new bit position.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM&hjubh)}(hXFor example, lets say that **old** has bits 4 through 7 set, and **new** has bits 12 through 15 set. This defines the mapping of bit position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other bit positions unchanged. So if say **oldbit** is 5, then this routine returns 13.h](hFor example, lets say that }(hjhhhNhNubj)}(h**old**h]hold}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh has bits 4 through 7 set, and }(hjhhhNhNubj)}(h**new**h]hnew}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh has bits 12 through 15 set. This defines the mapping of bit position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other bit positions unchanged. So if say }(hjhhhNhNubj)}(h **oldbit**h]holdbit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh$ is 5, then this routine returns 13.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM)hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_from_arr32 (C function)c.bitmap_from_arr32hNtauh1hhjhhhNhNubj)}(hhh](j)}(hRvoid bitmap_from_arr32 (unsigned long *bitmap, const u32 *buf, unsigned int nbits)h]j)}(hQvoid bitmap_from_arr32(unsigned long *bitmap, const u32 *buf, unsigned int nbits)h](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMubj2)}(h h]h }(hj/ hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj. hMubj{)}(hbitmap_from_arr32h]j)}(hbitmap_from_arr32h]hbitmap_from_arr32}(hjA hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj= ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj. hMubj)}(h;(unsigned long *bitmap, const u32 *buf, unsigned int nbits)h](j)}(hunsigned long *bitmaph](j )}(hunsignedh]hunsigned}(hj] hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjY ubj2)}(h h]h }(hjk hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjY ubj )}(hlongh]hlong}(hjy hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjY ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjY ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY ubj)}(hbitmaph]hbitmap}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjU ubj)}(hconst u32 *bufh](j)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hu32h]hu32}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY jC sbc.bitmap_from_arr32asbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hbufh]hbuf}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjU ubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hj-!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)!ubj2)}(h h]h }(hj;!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)!ubj )}(hinth]hint}(hjI!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)!ubj2)}(h h]h }(hjW!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)!ubj)}(hnbitsh]hnbits}(hje!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjU ubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhj. hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj. hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj. hMhj hhubj)}(hhh]h)}(h0copy the contents of u32 array of bits to bitmaph]h0copy the contents of u32 array of bits to bitmap}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhj!hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj. hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!jj!jjjuh1jhhhjhNhNubj)}(h**Parameters** ``unsigned long *bitmap`` array of unsigned longs, the destination bitmap ``const u32 *buf`` array of u32 (in host byte order), the source bitmap ``unsigned int nbits`` number of bits in **bitmap**h](h)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM"hj!ubj )}(hhh](j)}(hJ``unsigned long *bitmap`` array of unsigned longs, the destination bitmap h](j)}(h``unsigned long *bitmap``h]j)}(hj!h]hunsigned long *bitmap}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMhj!ubj2)}(hhh]h)}(h/array of unsigned longs, the destination bitmaph]h/array of unsigned longs, the destination bitmap}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMhj!ubah}(h]h ]h"]h$]h&]uh1j1hj!ubeh}(h]h ]h"]h$]h&]uh1jhj!hMhj!ubj)}(hH``const u32 *buf`` array of u32 (in host byte order), the source bitmap h](j)}(h``const u32 *buf``h]j)}(hj "h]hconst u32 *buf}(hj "hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM hj"ubj2)}(hhh]h)}(h4array of u32 (in host byte order), the source bitmaph]h4array of u32 (in host byte order), the source bitmap}(hj""hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hM hj"ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hM hj!ubj)}(h3``unsigned int nbits`` number of bits in **bitmap**h](j)}(h``unsigned int nbits``h]j)}(hjB"h]hunsigned int nbits}(hjD"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@"ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM"hj<"ubj2)}(hhh]h)}(hnumber of bits in **bitmap**h](hnumber of bits in }(hj["hhhNhNubj)}(h **bitmap**h]hbitmap}(hjc"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj["ubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM!hjX"ubah}(h]h ]h"]h$]h&]uh1j1hj<"ubeh}(h]h ]h"]h$]h&]uh1jhjW"hM"hj!ubeh}(h]h ]h"]h$]h&]uh1j hj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_to_arr32 (C function)c.bitmap_to_arr32hNtauh1hhjhhhNhNubj)}(hhh](j)}(hPvoid bitmap_to_arr32 (u32 *buf, const unsigned long *bitmap, unsigned int nbits)h]j)}(hOvoid bitmap_to_arr32(u32 *buf, const unsigned long *bitmap, unsigned int nbits)h](j )}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj"hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM5ubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"hhhj"hM5ubj{)}(hbitmap_to_arr32h]j)}(hbitmap_to_arr32h]hbitmap_to_arr32}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj"hhhj"hM5ubj)}(h;(u32 *buf, const unsigned long *bitmap, unsigned int nbits)h](j)}(hu32 *bufh](h)}(hhh]j)}(hu32h]hu32}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj"modnameN classnameNj] j` )}jc ]jf )}jY j"sbc.bitmap_to_arr32asbuh1hhj"ubj2)}(h h]h }(hj #hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"ubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hbufh]hbuf}(hj%#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubj)}(hconst unsigned long *bitmaph](j)}(hjh]hconst}(hj>#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:#ubj2)}(h h]h }(hjK#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:#ubj )}(hunsignedh]hunsigned}(hjY#hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj:#ubj2)}(h h]h }(hjg#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:#ubj )}(hlongh]hlong}(hju#hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj:#ubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:#ubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:#ubj)}(hbitmaph]hbitmap}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:#ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hj#hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#ubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#ubj )}(hinth]hint}(hj#hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#ubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#ubj)}(hnbitsh]hnbits}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubeh}(h]h ]h"]h$]h&]jjuh1jhj"hhhj"hM5ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj"hhhj"hM5ubah}(h]j"ah ](jjeh"]h$]h&]jj)jhuh1jhj"hM5hj"hhubj)}(hhh]h)}(h2copy the contents of bitmap to a u32 array of bitsh]h2copy the contents of bitmap to a u32 array of bits}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM5hj$hhubah}(h]h ]h"]h$]h&]uh1jhj"hhhj"hM5ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj1$jj1$jjjuh1jhhhjhNhNubj)}(h**Parameters** ``u32 *buf`` array of u32 (in host byte order), the dest bitmap ``const unsigned long *bitmap`` array of unsigned longs, the source bitmap ``unsigned int nbits`` number of bits in **bitmap**h](h)}(h**Parameters**h]j)}(hj;$h]h Parameters}(hj=$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9$ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM9hj5$ubj )}(hhh](j)}(h@``u32 *buf`` array of u32 (in host byte order), the dest bitmap h](j)}(h ``u32 *buf``h]j)}(hjZ$h]hu32 *buf}(hj\$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX$ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM6hjT$ubj2)}(hhh]h)}(h2array of u32 (in host byte order), the dest bitmaph]h2array of u32 (in host byte order), the dest bitmap}(hjs$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjo$hM6hjp$ubah}(h]h ]h"]h$]h&]uh1j1hjT$ubeh}(h]h ]h"]h$]h&]uh1jhjo$hM6hjQ$ubj)}(hK``const unsigned long *bitmap`` array of unsigned longs, the source bitmap h](j)}(h``const unsigned long *bitmap``h]j)}(hj$h]hconst unsigned long *bitmap}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM7hj$ubj2)}(hhh]h)}(h*array of unsigned longs, the source bitmaph]h*array of unsigned longs, the source bitmap}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hM7hj$ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hM7hjQ$ubj)}(h3``unsigned int nbits`` number of bits in **bitmap**h](j)}(h``unsigned int nbits``h]j)}(hj$h]hunsigned int nbits}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM9hj$ubj2)}(hhh]h)}(hnumber of bits in **bitmap**h](hnumber of bits in }(hj$hhhNhNubj)}(h **bitmap**h]hbitmap}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chM8hj$ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hM9hjQ$ubeh}(h]h ]h"]h$]h&]uh1j hj5$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_from_arr64 (C function)c.bitmap_from_arr64hNtauh1hhjhhhNhNubj)}(hhh](j)}(hRvoid bitmap_from_arr64 (unsigned long *bitmap, const u64 *buf, unsigned int nbits)h]j)}(hQvoid bitmap_from_arr64(unsigned long *bitmap, const u64 *buf, unsigned int nbits)h](j )}(hvoidh]hvoid}(hj4%hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj0%hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMNubj2)}(h h]h }(hjC%hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0%hhhjB%hMNubj{)}(hbitmap_from_arr64h]j)}(hbitmap_from_arr64h]hbitmap_from_arr64}(hjU%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ%ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj0%hhhjB%hMNubj)}(h;(unsigned long *bitmap, const u64 *buf, unsigned int nbits)h](j)}(hunsigned long *bitmaph](j )}(hunsignedh]hunsigned}(hjq%hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjm%ubj2)}(h h]h }(hj%hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjm%ubj )}(hlongh]hlong}(hj%hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjm%ubj2)}(h h]h }(hj%hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjm%ubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjm%ubj)}(hbitmaph]hbitmap}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjm%ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhji%ubj)}(hconst u64 *bufh](j)}(hjh]hconst}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj2)}(h h]h }(hj%hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%ubh)}(hhh]j)}(hu64h]hu64}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj%modnameN classnameNj] j` )}jc ]jf )}jY jW%sbc.bitmap_from_arr64asbuh1hhj%ubj2)}(h h]h }(hj &hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%ubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(hbufh]hbuf}(hj(&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhji%ubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hjA&hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj=&ubj2)}(h h]h }(hjO&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=&ubj )}(hinth]hint}(hj]&hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj=&ubj2)}(h h]h }(hjk&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=&ubj)}(hnbitsh]hnbits}(hjy&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhji%ubeh}(h]h ]h"]h$]h&]jjuh1jhj0%hhhjB%hMNubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj,%hhhjB%hMNubah}(h]j'%ah ](jjeh"]h$]h&]jj)jhuh1jhjB%hMNhj)%hhubj)}(hhh]h)}(h0copy the contents of u64 array of bits to bitmaph]h0copy the contents of u64 array of bits to bitmap}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMNhj&hhubah}(h]h ]h"]h$]h&]uh1jhj)%hhhjB%hMNubeh}(h]h ](jfunctioneh"]h$]h&]jjjj&jj&jjjuh1jhhhjhNhNubj)}(h**Parameters** ``unsigned long *bitmap`` array of unsigned longs, the destination bitmap ``const u64 *buf`` array of u64 (in host byte order), the source bitmap ``unsigned int nbits`` number of bits in **bitmap**h](h)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMRhj&ubj )}(hhh](j)}(hJ``unsigned long *bitmap`` array of unsigned longs, the destination bitmap h](j)}(h``unsigned long *bitmap``h]j)}(hj&h]hunsigned long *bitmap}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMOhj&ubj2)}(hhh]h)}(h/array of unsigned longs, the destination bitmaph]h/array of unsigned longs, the destination bitmap}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMOhj&ubah}(h]h ]h"]h$]h&]uh1j1hj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMOhj&ubj)}(hH``const u64 *buf`` array of u64 (in host byte order), the source bitmap h](j)}(h``const u64 *buf``h]j)}(hj'h]hconst u64 *buf}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMPhj'ubj2)}(hhh]h)}(h4array of u64 (in host byte order), the source bitmaph]h4array of u64 (in host byte order), the source bitmap}(hj6'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2'hMPhj3'ubah}(h]h ]h"]h$]h&]uh1j1hj'ubeh}(h]h ]h"]h$]h&]uh1jhj2'hMPhj&ubj)}(h3``unsigned int nbits`` number of bits in **bitmap**h](j)}(h``unsigned int nbits``h]j)}(hjV'h]hunsigned int nbits}(hjX'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT'ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMRhjP'ubj2)}(hhh]h)}(hnumber of bits in **bitmap**h](hnumber of bits in }(hjo'hhhNhNubj)}(h **bitmap**h]hbitmap}(hjw'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo'ubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMQhjl'ubah}(h]h ]h"]h$]h&]uh1j1hjP'ubeh}(h]h ]h"]h$]h&]uh1jhjk'hMRhj&ubeh}(h]h ]h"]h$]h&]uh1j hj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_to_arr64 (C function)c.bitmap_to_arr64hNtauh1hhjhhhNhNubj)}(hhh](j)}(hPvoid bitmap_to_arr64 (u64 *buf, const unsigned long *bitmap, unsigned int nbits)h]j)}(hOvoid bitmap_to_arr64(u64 *buf, const unsigned long *bitmap, unsigned int nbits)h](j )}(hvoidh]hvoid}(hj'hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj'hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMlubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'hhhj'hMlubj{)}(hbitmap_to_arr64h]j)}(hbitmap_to_arr64h]hbitmap_to_arr64}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj'hhhj'hMlubj)}(h;(u64 *buf, const unsigned long *bitmap, unsigned int nbits)h](j)}(hu64 *bufh](h)}(hhh]j)}(hu64h]hu64}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj(modnameN classnameNj] j` )}jc ]jf )}jY j'sbc.bitmap_to_arr64asbuh1hhj'ubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'ubj)}(hjh]h*}(hj,(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hbufh]hbuf}(hj9(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'ubj)}(hconst unsigned long *bitmaph](j)}(hjh]hconst}(hjR(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN(ubj2)}(h h]h }(hj_(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjN(ubj )}(hunsignedh]hunsigned}(hjm(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjN(ubj2)}(h h]h }(hj{(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjN(ubj )}(hlongh]hlong}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjN(ubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjN(ubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN(ubj)}(hbitmaph]hbitmap}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN(ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'ubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj(ubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(ubj )}(hinth]hint}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj(ubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(ubj)}(hnbitsh]hnbits}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'ubeh}(h]h ]h"]h$]h&]jjuh1jhj'hhhj'hMlubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj'hhhj'hMlubah}(h]j'ah ](jjeh"]h$]h&]jj)jhuh1jhj'hMlhj'hhubj)}(hhh]h)}(h2copy the contents of bitmap to a u64 array of bitsh]h2copy the contents of bitmap to a u64 array of bits}(hj-)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMlhj*)hhubah}(h]h ]h"]h$]h&]uh1jhj'hhhj'hMlubeh}(h]h ](jfunctioneh"]h$]h&]jjjjE)jjE)jjjuh1jhhhjhNhNubj)}(h**Parameters** ``u64 *buf`` array of u64 (in host byte order), the dest bitmap ``const unsigned long *bitmap`` array of unsigned longs, the source bitmap ``unsigned int nbits`` number of bits in **bitmap**h](h)}(h**Parameters**h]j)}(hjO)h]h Parameters}(hjQ)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM)ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMphjI)ubj )}(hhh](j)}(h@``u64 *buf`` array of u64 (in host byte order), the dest bitmap h](j)}(h ``u64 *buf``h]j)}(hjn)h]hu64 *buf}(hjp)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl)ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMmhjh)ubj2)}(hhh]h)}(h2array of u64 (in host byte order), the dest bitmaph]h2array of u64 (in host byte order), the dest bitmap}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMmhj)ubah}(h]h ]h"]h$]h&]uh1j1hjh)ubeh}(h]h ]h"]h$]h&]uh1jhj)hMmhje)ubj)}(hK``const unsigned long *bitmap`` array of unsigned longs, the source bitmap h](j)}(h``const unsigned long *bitmap``h]j)}(hj)h]hconst unsigned long *bitmap}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMnhj)ubj2)}(hhh]h)}(h*array of unsigned longs, the source bitmaph]h*array of unsigned longs, the source bitmap}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMnhj)ubah}(h]h ]h"]h$]h&]uh1j1hj)ubeh}(h]h ]h"]h$]h&]uh1jhj)hMnhje)ubj)}(h3``unsigned int nbits`` number of bits in **bitmap**h](j)}(h``unsigned int nbits``h]j)}(hj)h]hunsigned int nbits}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMphj)ubj2)}(hhh]h)}(hnumber of bits in **bitmap**h](hnumber of bits in }(hj)hhhNhNubj)}(h **bitmap**h]hbitmap}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:78: ./lib/bitmap.chMohj)ubah}(h]h ]h"]h$]h&]uh1j1hj)ubeh}(h]h ]h"]h$]h&]uh1jhj)hMphje)ubeh}(h]h ]h"]h$]h&]uh1j hjI)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_pos_to_ord (C function)c.bitmap_pos_to_ordhNtauh1hhjhhhNhNubj)}(hhh](j)}(hVint bitmap_pos_to_ord (const unsigned long *buf, unsigned int pos, unsigned int nbits)h]j)}(hUint bitmap_pos_to_ord(const unsigned long *buf, unsigned int pos, unsigned int nbits)h](j )}(hinth]hint}(hjH*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjD*hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMubj2)}(h h]h }(hjW*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjD*hhhjV*hMubj{)}(hbitmap_pos_to_ordh]j)}(hbitmap_pos_to_ordh]hbitmap_pos_to_ord}(hji*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje*ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjD*hhhjV*hMubj)}(h@(const unsigned long *buf, unsigned int pos, unsigned int nbits)h](j)}(hconst unsigned long *bufh](j)}(hjh]hconst}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj )}(hunsignedh]hunsigned}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj )}(hlongh]hlong}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj)}(hjh]h*}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hbufh]hbuf}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj}*ubj)}(hunsigned int posh](j )}(hunsignedh]hunsigned}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj +hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj )}(hinth]hint}(hj+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj(+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj)}(hposh]hpos}(hj6+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj}*ubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hjO+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjK+ubj2)}(h h]h }(hj]+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjK+ubj )}(hinth]hint}(hjk+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjK+ubj2)}(h h]h }(hjy+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjK+ubj)}(hnbitsh]hnbits}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj}*ubeh}(h]h ]h"]h$]h&]jjuh1jhjD*hhhjV*hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj@*hhhjV*hMubah}(h]j;*ah ](jjeh"]h$]h&]jj)jhuh1jhjV*hMhj=*hhubj)}(hhh]h)}(h3find ordinal of set bit at given position in bitmaph]h3find ordinal of set bit at given position in bitmap}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj+hhubah}(h]h ]h"]h$]h&]uh1jhj=*hhhjV*hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+jj+jjjuh1jhhhjhNhNubj)}(hX,**Parameters** ``const unsigned long *buf`` pointer to a bitmap ``unsigned int pos`` a bit position in **buf** (0 <= **pos** < **nbits**) ``unsigned int nbits`` number of valid bit positions in **buf** **Description** Map the bit at position **pos** in **buf** (of length **nbits**) to the ordinal of which set bit it is. If it is not set or if **pos** is not a valid bit position, map to -1. If for example, just bits 4 through 7 are set in **buf**, then **pos** values 4 through 7 will get mapped to 0 through 3, respectively, and other **pos** values will get mapped to -1. When **pos** value 7 gets mapped to (returns) **ord** value 3 in this example, that means that bit 7 is the 3rd (starting with 0th) set bit in **buf**. The bit positions 0 through **bits** are valid positions in **buf**.h](h)}(h**Parameters**h]j)}(hj+h]h Parameters}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj+ubj )}(hhh](j)}(h1``const unsigned long *buf`` pointer to a bitmap h](j)}(h``const unsigned long *buf``h]j)}(hj+h]hconst unsigned long *buf}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj+ubj2)}(hhh]h)}(hpointer to a bitmaph]hpointer to a bitmap}(hj ,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1j1hj+ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhj+ubj)}(hJ``unsigned int pos`` a bit position in **buf** (0 <= **pos** < **nbits**) h](j)}(h``unsigned int pos``h]j)}(hj+,h]hunsigned int pos}(hj-,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj),ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj%,ubj2)}(hhh]h)}(h4a bit position in **buf** (0 <= **pos** < **nbits**)h](ha bit position in }(hjD,hhhNhNubj)}(h**buf**h]hbuf}(hjL,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD,ubh (0 <= }(hjD,hhhNhNubj)}(h**pos**h]hpos}(hj^,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD,ubh < }(hjD,hhhNhNubj)}(h **nbits**h]hnbits}(hjp,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD,ubh)}(hjD,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj@,hMhjA,ubah}(h]h ]h"]h$]h&]uh1j1hj%,ubeh}(h]h ]h"]h$]h&]uh1jhj@,hMhj+ubj)}(h@``unsigned int nbits`` number of valid bit positions in **buf** h](j)}(h``unsigned int nbits``h]j)}(hj,h]hunsigned int nbits}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj,ubj2)}(hhh]h)}(h(number of valid bit positions in **buf**h](h!number of valid bit positions in }(hj,hhhNhNubj)}(h**buf**h]hbuf}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhj+ubeh}(h]h ]h"]h$]h&]uh1j hj+ubh)}(h**Description**h]j)}(hj,h]h Description}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj+ubh)}(hMap the bit at position **pos** in **buf** (of length **nbits**) to the ordinal of which set bit it is. If it is not set or if **pos** is not a valid bit position, map to -1.h](hMap the bit at position }(hj,hhhNhNubj)}(h**pos**h]hpos}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh in }(hj,hhhNhNubj)}(h**buf**h]hbuf}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh (of length }(hj,hhhNhNubj)}(h **nbits**h]hnbits}(hj%-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubhA) to the ordinal of which set bit it is. If it is not set or if }(hj,hhhNhNubj)}(h**pos**h]hpos}(hj7-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh( is not a valid bit position, map to -1.}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj+ubh)}(hXPIf for example, just bits 4 through 7 are set in **buf**, then **pos** values 4 through 7 will get mapped to 0 through 3, respectively, and other **pos** values will get mapped to -1. When **pos** value 7 gets mapped to (returns) **ord** value 3 in this example, that means that bit 7 is the 3rd (starting with 0th) set bit in **buf**.h](h1If for example, just bits 4 through 7 are set in }(hjP-hhhNhNubj)}(h**buf**h]hbuf}(hjX-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP-ubh, then }(hjP-hhhNhNubj)}(h**pos**h]hpos}(hjj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP-ubhL values 4 through 7 will get mapped to 0 through 3, respectively, and other }(hjP-hhhNhNubj)}(h**pos**h]hpos}(hj|-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP-ubh% values will get mapped to -1. When }(hjP-hhhNhNubj)}(h**pos**h]hpos}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP-ubh" value 7 gets mapped to (returns) }(hjP-hhhNhNubj)}(h**ord**h]hord}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP-ubhZ value 3 in this example, that means that bit 7 is the 3rd (starting with 0th) set bit in }(hjP-hhhNhNubj)}(h**buf**h]hbuf}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP-ubh.}(hjP-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj+ubh)}(hDThe bit positions 0 through **bits** are valid positions in **buf**.h](hThe bit positions 0 through }(hj-hhhNhNubj)}(h**bits**h]hbits}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubh are valid positions in }(hj-hhhNhNubj)}(h**buf**h]hbuf}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubh.}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_onto (C function) c.bitmap_ontohNtauh1hhjhhhNhNubj)}(hhh](j)}(hpvoid bitmap_onto (unsigned long *dst, const unsigned long *orig, const unsigned long *relmap, unsigned int bits)h]j)}(hovoid bitmap_onto(unsigned long *dst, const unsigned long *orig, const unsigned long *relmap, unsigned int bits)h](j )}(hvoidh]hvoid}(hj.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chM>ubj2)}(h h]h }(hj-.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.hhhj,.hM>ubj{)}(h bitmap_ontoh]j)}(h bitmap_ontoh]h bitmap_onto}(hj?.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;.ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj.hhhj,.hM>ubj)}(h_(unsigned long *dst, const unsigned long *orig, const unsigned long *relmap, unsigned int bits)h](j)}(hunsigned long *dsth](j )}(hunsignedh]hunsigned}(hj[.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjW.ubj2)}(h h]h }(hji.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjW.ubj )}(hlongh]hlong}(hjw.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjW.ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjW.ubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjW.ubj)}(hdsth]hdst}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjW.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjS.ubj)}(hconst unsigned long *origh](j)}(hjh]hconst}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj )}(hunsignedh]hunsigned}(hj.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj )}(hlongh]hlong}(hj.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hjh]h*}(hj /hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(horigh]horig}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjS.ubj)}(hconst unsigned long *relmaph](j)}(hjh]hconst}(hj2/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj./ubj2)}(h h]h }(hj?/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj./ubj )}(hunsignedh]hunsigned}(hjM/hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj./ubj2)}(h h]h }(hj[/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj./ubj )}(hlongh]hlong}(hji/hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj./ubj2)}(h h]h }(hjw/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj./ubj)}(hjh]h*}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj./ubj)}(hrelmaph]hrelmap}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj./ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjS.ubj)}(hunsigned int bitsh](j )}(hunsignedh]hunsigned}(hj/hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj/ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj )}(hinth]hint}(hj/hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj/ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(hbitsh]hbits}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjS.ubeh}(h]h ]h"]h$]h&]jjuh1jhj.hhhj,.hM>ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj.hhhj,.hM>ubah}(h]j.ah ](jjeh"]h$]h&]jj)jhuh1jhj,.hM>hj.hhubj)}(hhh]h)}(h(translate one bitmap relative to anotherh]h(translate one bitmap relative to another}(hj 0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chM>hj 0hhubah}(h]h ]h"]h$]h&]uh1jhj.hhhj,.hM>ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj%0jj%0jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``unsigned long *dst`` resulting translated bitmap ``const unsigned long *orig`` original untranslated bitmap ``const unsigned long *relmap`` bitmap relative to which translated ``unsigned int bits`` number of bits in each of these bitmaps **Description** Set the n-th bit of **dst** iff there exists some m such that the n-th bit of **relmap** is set, the m-th bit of **orig** is set, and the n-th bit of **relmap** is also the m-th _set_ bit of **relmap**. (If you understood the previous sentence the first time your read it, you're overqualified for your current job.) In other words, **orig** is mapped onto (surjectively) **dst**, using the map { | the n-th bit of **relmap** is the m-th set bit of **relmap** }. Any set bits in **orig** above bit number W, where W is the weight of (number of set bits in) **relmap** are mapped nowhere. In particular, if for all bits m set in **orig**, m >= W, then **dst** will end up empty. In situations where the possibility of such an empty result is not desired, one way to avoid it is to use the bitmap_fold() operator, below, to first fold the **orig** bitmap over itself so that all its set bits x are in the range 0 <= x < W. The bitmap_fold() operator does this by setting the bit (m % W) in **dst**, for each bit (m) set in **orig**. Example [1] for bitmap_onto(): Let's say **relmap** has bits 30-39 set, and **orig** has bits 1, 3, 5, 7, 9 and 11 set. Then on return from this routine, **dst** will have bits 31, 33, 35, 37 and 39 set. When bit 0 is set in **orig**, it means turn on the bit in **dst** corresponding to whatever is the first bit (if any) that is turned on in **relmap**. Since bit 0 was off in the above example, we leave off that bit (bit 30) in **dst**. When bit 1 is set in **orig** (as in the above example), it means turn on the bit in **dst** corresponding to whatever is the second bit that is turned on in **relmap**. The second bit in **relmap** that was turned on in the above example was bit 31, so we turned on bit 31 in **dst**. Similarly, we turned on bits 33, 35, 37 and 39 in **dst**, because they were the 4th, 6th, 8th and 10th set bits set in **relmap**, and the 4th, 6th, 8th and 10th bits of **orig** (i.e. bits 3, 5, 7 and 9) were also set. When bit 11 is set in **orig**, it means turn on the bit in **dst** corresponding to whatever is the twelfth bit that is turned on in **relmap**. In the above example, there were only ten bits turned on in **relmap** (30..39), so that bit 11 was set in **orig** had no affect on **dst**. Example [2] for bitmap_fold() + bitmap_onto(): Let's say **relmap** has these ten bits set:: 40 41 42 43 45 48 53 61 74 95 (for the curious, that's 40 plus the first ten terms of the Fibonacci sequence.) Further lets say we use the following code, invoking bitmap_fold() then bitmap_onto, as suggested above to avoid the possibility of an empty **dst** result:: unsigned long *tmp; // a temporary bitmap's bits bitmap_fold(tmp, orig, bitmap_weight(relmap, bits), bits); bitmap_onto(dst, tmp, relmap, bits); Then this table shows what various values of **dst** would be, for various **orig**'s. I list the zero-based positions of each set bit. The tmp column shows the intermediate result, as computed by using bitmap_fold() to fold the **orig** bitmap modulo ten (the weight of **relmap**): =============== ============== ================= **orig** tmp **dst** 0 0 40 1 1 41 9 9 95 10 0 40 [#f1]_ 1 3 5 7 1 3 5 7 41 43 48 61 0 1 2 3 4 0 1 2 3 4 40 41 42 43 45 0 9 18 27 0 9 8 7 40 61 74 95 0 10 20 30 0 40 0 11 22 33 0 1 2 3 40 41 42 43 0 12 24 36 0 2 4 6 40 42 45 53 78 102 211 1 2 8 41 42 74 [#f1]_ =============== ============== ================= .. [#f1] For these marked lines, if we hadn't first done bitmap_fold() into tmp, then the **dst** result would have been empty. If either of **orig** or **relmap** is empty (no set bits), then **dst** will be returned empty. If (as explained above) the only set bits in **orig** are in positions m where m >= W, (where W is the weight of **relmap**) then **dst** will once again be returned empty. All bits in **dst** not set by the above rule are cleared.h](h)}(h**Parameters**h]j)}(hj/0h]h Parameters}(hj10hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-0ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMBhj)0ubj )}(hhh](j)}(h3``unsigned long *dst`` resulting translated bitmap h](j)}(h``unsigned long *dst``h]j)}(hjN0h]hunsigned long *dst}(hjP0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL0ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chM?hjH0ubj2)}(hhh]h)}(hresulting translated bitmaph]hresulting translated bitmap}(hjg0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjc0hM?hjd0ubah}(h]h ]h"]h$]h&]uh1j1hjH0ubeh}(h]h ]h"]h$]h&]uh1jhjc0hM?hjE0ubj)}(h;``const unsigned long *orig`` original untranslated bitmap h](j)}(h``const unsigned long *orig``h]j)}(hj0h]hconst unsigned long *orig}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chM@hj0ubj2)}(hhh]h)}(horiginal untranslated bitmaph]horiginal untranslated bitmap}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hM@hj0ubah}(h]h ]h"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]uh1jhj0hM@hjE0ubj)}(hD``const unsigned long *relmap`` bitmap relative to which translated h](j)}(h``const unsigned long *relmap``h]j)}(hj0h]hconst unsigned long *relmap}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMAhj0ubj2)}(hhh]h)}(h#bitmap relative to which translatedh]h#bitmap relative to which translated}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMAhj0ubah}(h]h ]h"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]uh1jhj0hMAhjE0ubj)}(h>``unsigned int bits`` number of bits in each of these bitmaps h](j)}(h``unsigned int bits``h]j)}(hj0h]hunsigned int bits}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMBhj0ubj2)}(hhh]h)}(h'number of bits in each of these bitmapsh]h'number of bits in each of these bitmaps}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMBhj1ubah}(h]h ]h"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]uh1jhj1hMBhjE0ubeh}(h]h ]h"]h$]h&]uh1j hj)0ubh)}(h**Description**h]j)}(hj41h]h Description}(hj61hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj21ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMDhj)0ubh)}(hX<Set the n-th bit of **dst** iff there exists some m such that the n-th bit of **relmap** is set, the m-th bit of **orig** is set, and the n-th bit of **relmap** is also the m-th _set_ bit of **relmap**. (If you understood the previous sentence the first time your read it, you're overqualified for your current job.)h](hSet the n-th bit of }(hjJ1hhhNhNubj)}(h**dst**h]hdst}(hjR1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ1ubh3 iff there exists some m such that the n-th bit of }(hjJ1hhhNhNubj)}(h **relmap**h]hrelmap}(hjd1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ1ubh is set, the m-th bit of }(hjJ1hhhNhNubj)}(h**orig**h]horig}(hjv1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ1ubh is set, and the n-th bit of }(hjJ1hhhNhNubj)}(h **relmap**h]hrelmap}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ1ubh is also the m-th _set_ bit of }(hjJ1hhhNhNubj)}(h **relmap**h]hrelmap}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ1ubhu. (If you understood the previous sentence the first time your read it, you’re overqualified for your current job.)}(hjJ1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMChj)0ubh)}(hIn other words, **orig** is mapped onto (surjectively) **dst**, using the map { | the n-th bit of **relmap** is the m-th set bit of **relmap** }.h](hIn other words, }(hj1hhhNhNubj)}(h**orig**h]horig}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh is mapped onto (surjectively) }(hj1hhhNhNubj)}(h**dst**h]hdst}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh+, using the map { | the n-th bit of }(hj1hhhNhNubj)}(h **relmap**h]hrelmap}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh is the m-th set bit of }(hj1hhhNhNubj)}(h **relmap**h]hrelmap}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh }.}(hj1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMIhj)0ubh)}(hX9Any set bits in **orig** above bit number W, where W is the weight of (number of set bits in) **relmap** are mapped nowhere. In particular, if for all bits m set in **orig**, m >= W, then **dst** will end up empty. In situations where the possibility of such an empty result is not desired, one way to avoid it is to use the bitmap_fold() operator, below, to first fold the **orig** bitmap over itself so that all its set bits x are in the range 0 <= x < W. The bitmap_fold() operator does this by setting the bit (m % W) in **dst**, for each bit (m) set in **orig**.h](hAny set bits in }(hj 2hhhNhNubj)}(h**orig**h]horig}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 2ubhF above bit number W, where W is the weight of (number of set bits in) }(hj 2hhhNhNubj)}(h **relmap**h]hrelmap}(hj$2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 2ubh= are mapped nowhere. In particular, if for all bits m set in }(hj 2hhhNhNubj)}(h**orig**h]horig}(hj62hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 2ubh, m >= W, then }(hj 2hhhNhNubj)}(h**dst**h]hdst}(hjH2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 2ubh will end up empty. In situations where the possibility of such an empty result is not desired, one way to avoid it is to use the bitmap_fold() operator, below, to first fold the }(hj 2hhhNhNubj)}(h**orig**h]horig}(hjZ2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 2ubh bitmap over itself so that all its set bits x are in the range 0 <= x < W. The bitmap_fold() operator does this by setting the bit (m % W) in }(hj 2hhhNhNubj)}(h**dst**h]hdst}(hjl2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 2ubh, for each bit (m) set in }(hj 2hhhNhNubj)}(h**orig**h]horig}(hj~2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 2ubh.}(hj 2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMMhj)0ubj )}(hhh](j)}(hXExample [1] for bitmap_onto(): Let's say **relmap** has bits 30-39 set, and **orig** has bits 1, 3, 5, 7, 9 and 11 set. Then on return from this routine, **dst** will have bits 31, 33, 35, 37 and 39 set. When bit 0 is set in **orig**, it means turn on the bit in **dst** corresponding to whatever is the first bit (if any) that is turned on in **relmap**. Since bit 0 was off in the above example, we leave off that bit (bit 30) in **dst**. When bit 1 is set in **orig** (as in the above example), it means turn on the bit in **dst** corresponding to whatever is the second bit that is turned on in **relmap**. The second bit in **relmap** that was turned on in the above example was bit 31, so we turned on bit 31 in **dst**. Similarly, we turned on bits 33, 35, 37 and 39 in **dst**, because they were the 4th, 6th, 8th and 10th set bits set in **relmap**, and the 4th, 6th, 8th and 10th bits of **orig** (i.e. bits 3, 5, 7 and 9) were also set. When bit 11 is set in **orig**, it means turn on the bit in **dst** corresponding to whatever is the twelfth bit that is turned on in **relmap**. In the above example, there were only ten bits turned on in **relmap** (30..39), so that bit 11 was set in **orig** had no affect on **dst**. h](j)}(hExample [1] for bitmap_onto():h]hExample [1] for bitmap_onto():}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMphj2ubj2)}(hhh](h)}(hLet's say **relmap** has bits 30-39 set, and **orig** has bits 1, 3, 5, 7, 9 and 11 set. Then on return from this routine, **dst** will have bits 31, 33, 35, 37 and 39 set.h](h Let’s say }(hj2hhhNhNubj)}(h **relmap**h]hrelmap}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh has bits 30-39 set, and }(hj2hhhNhNubj)}(h**orig**h]horig}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubhG has bits 1, 3, 5, 7, 9 and 11 set. Then on return from this routine, }(hj2hhhNhNubj)}(h**dst**h]hdst}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh* will have bits 31, 33, 35, 37 and 39 set.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMXhj2ubh)}(hWhen bit 0 is set in **orig**, it means turn on the bit in **dst** corresponding to whatever is the first bit (if any) that is turned on in **relmap**. Since bit 0 was off in the above example, we leave off that bit (bit 30) in **dst**.h](hWhen bit 0 is set in }(hj2hhhNhNubj)}(h**orig**h]horig}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh, it means turn on the bit in }(hj2hhhNhNubj)}(h**dst**h]hdst}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubhJ corresponding to whatever is the first bit (if any) that is turned on in }(hj2hhhNhNubj)}(h **relmap**h]hrelmap}(hj!3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubhO. Since bit 0 was off in the above example, we leave off that bit (bit 30) in }(hj2hhhNhNubj)}(h**dst**h]hdst}(hj33hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chM\hj2ubh)}(hXWhen bit 1 is set in **orig** (as in the above example), it means turn on the bit in **dst** corresponding to whatever is the second bit that is turned on in **relmap**. The second bit in **relmap** that was turned on in the above example was bit 31, so we turned on bit 31 in **dst**.h](hWhen bit 1 is set in }(hjL3hhhNhNubj)}(h**orig**h]horig}(hjT3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL3ubh8 (as in the above example), it means turn on the bit in }(hjL3hhhNhNubj)}(h**dst**h]hdst}(hjf3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL3ubhB corresponding to whatever is the second bit that is turned on in }(hjL3hhhNhNubj)}(h **relmap**h]hrelmap}(hjx3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL3ubh. The second bit in }(hjL3hhhNhNubj)}(h **relmap**h]hrelmap}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL3ubhO that was turned on in the above example was bit 31, so we turned on bit 31 in }(hjL3hhhNhNubj)}(h**dst**h]hdst}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL3ubh.}(hjL3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMahj2ubh)}(hSimilarly, we turned on bits 33, 35, 37 and 39 in **dst**, because they were the 4th, 6th, 8th and 10th set bits set in **relmap**, and the 4th, 6th, 8th and 10th bits of **orig** (i.e. bits 3, 5, 7 and 9) were also set.h](h2Similarly, we turned on bits 33, 35, 37 and 39 in }(hj3hhhNhNubj)}(h**dst**h]hdst}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh?, because they were the 4th, 6th, 8th and 10th set bits set in }(hj3hhhNhNubj)}(h **relmap**h]hrelmap}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh), and the 4th, 6th, 8th and 10th bits of }(hj3hhhNhNubj)}(h**orig**h]horig}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh) (i.e. bits 3, 5, 7 and 9) were also set.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMghj2ubh)}(hX When bit 11 is set in **orig**, it means turn on the bit in **dst** corresponding to whatever is the twelfth bit that is turned on in **relmap**. In the above example, there were only ten bits turned on in **relmap** (30..39), so that bit 11 was set in **orig** had no affect on **dst**.h](hWhen bit 11 is set in }(hj3hhhNhNubj)}(h**orig**h]horig}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh, it means turn on the bit in }(hj3hhhNhNubj)}(h**dst**h]hdst}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubhC corresponding to whatever is the twelfth bit that is turned on in }(hj3hhhNhNubj)}(h **relmap**h]hrelmap}(hj&4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh?. In the above example, there were only ten bits turned on in }(hj3hhhNhNubj)}(h **relmap**h]hrelmap}(hj84hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh% (30..39), so that bit 11 was set in }(hj3hhhNhNubj)}(h**orig**h]horig}(hjJ4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh had no affect on }(hj3hhhNhNubj)}(h**dst**h]hdst}(hj\4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMlhj2ubeh}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhj2hMphj2ubj)}(hXExample [2] for bitmap_fold() + bitmap_onto(): Let's say **relmap** has these ten bits set:: 40 41 42 43 45 48 53 61 74 95 (for the curious, that's 40 plus the first ten terms of the Fibonacci sequence.) Further lets say we use the following code, invoking bitmap_fold() then bitmap_onto, as suggested above to avoid the possibility of an empty **dst** result:: unsigned long *tmp; // a temporary bitmap's bits bitmap_fold(tmp, orig, bitmap_weight(relmap, bits), bits); bitmap_onto(dst, tmp, relmap, bits); Then this table shows what various values of **dst** would be, for various **orig**'s. I list the zero-based positions of each set bit. The tmp column shows the intermediate result, as computed by using bitmap_fold() to fold the **orig** bitmap modulo ten (the weight of **relmap**): =============== ============== ================= **orig** tmp **dst** 0 0 40 1 1 41 9 9 95 10 0 40 [#f1]_ 1 3 5 7 1 3 5 7 41 43 48 61 0 1 2 3 4 0 1 2 3 4 40 41 42 43 45 0 9 18 27 0 9 8 7 40 61 74 95 0 10 20 30 0 40 0 11 22 33 0 1 2 3 40 41 42 43 0 12 24 36 0 2 4 6 40 42 45 53 78 102 211 1 2 8 41 42 74 [#f1]_ =============== ============== ================= h](j)}(h.Example [2] for bitmap_fold() + bitmap_onto():h]h.Example [2] for bitmap_fold() + bitmap_onto():}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj4ubj2)}(hhh](h)}(h-Let's say **relmap** has these ten bits set::h](h Let’s say }(hj4hhhNhNubj)}(h **relmap**h]hrelmap}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh has these ten bits set:}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMshj4ubj7C)}(h40 41 42 43 45 48 53 61 74 95h]h40 41 42 43 45 48 53 61 74 95}hj4sbah}(h]h ]h"]h$]h&]jjuh1j6ChP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMuhj4ubh)}(hP(for the curious, that's 40 plus the first ten terms of the Fibonacci sequence.)h]hR(for the curious, that’s 40 plus the first ten terms of the Fibonacci sequence.)}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMwhj4ubh)}(hFurther lets say we use the following code, invoking bitmap_fold() then bitmap_onto, as suggested above to avoid the possibility of an empty **dst** result::h](hFurther lets say we use the following code, invoking bitmap_fold() then bitmap_onto, as suggested above to avoid the possibility of an empty }(hj4hhhNhNubj)}(h**dst**h]hdst}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh result:}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMzhj4ubj7C)}(hunsigned long *tmp; // a temporary bitmap's bits bitmap_fold(tmp, orig, bitmap_weight(relmap, bits), bits); bitmap_onto(dst, tmp, relmap, bits);h]hunsigned long *tmp; // a temporary bitmap's bits bitmap_fold(tmp, orig, bitmap_weight(relmap, bits), bits); bitmap_onto(dst, tmp, relmap, bits);}hj4sbah}(h]h ]h"]h$]h&]jjuh1j6ChP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chM~hj4ubh)}(hXThen this table shows what various values of **dst** would be, for various **orig**'s. I list the zero-based positions of each set bit. The tmp column shows the intermediate result, as computed by using bitmap_fold() to fold the **orig** bitmap modulo ten (the weight of **relmap**):h](h-Then this table shows what various values of }(hj5hhhNhNubj)}(h**dst**h]hdst}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh would be, for various }(hj5hhhNhNubj)}(h**orig**h]horig}(hj 5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh’s. I list the zero-based positions of each set bit. The tmp column shows the intermediate result, as computed by using bitmap_fold() to fold the }(hj5hhhNhNubj)}(h**orig**h]horig}(hj25hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh" bitmap modulo ten (the weight of }(hj5hhhNhNubj)}(h **relmap**h]hrelmap}(hjD5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh):}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj4ubj)}(hXF=============== ============== ================= **orig** tmp **dst** 0 0 40 1 1 41 9 9 95 10 0 40 [#f1]_ 1 3 5 7 1 3 5 7 41 43 48 61 0 1 2 3 4 0 1 2 3 4 40 41 42 43 45 0 9 18 27 0 9 8 7 40 61 74 95 0 10 20 30 0 40 0 11 22 33 0 1 2 3 40 41 42 43 0 12 24 36 0 2 4 6 40 42 45 53 78 102 211 1 2 8 41 42 74 [#f1]_ =============== ============== ================= h]htable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jk5hjh5ubjl5)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jk5hjh5ubjl5)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jk5hjh5ubhtbody)}(hhh](hrow)}(hhh](hentry)}(hhh]h)}(h**orig**h]j)}(hj5h]horig}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj5ubah}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh]h)}(htmph]htmp}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMhj5ubah}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh]h)}(h**dst**h]j)}(hj5h]hdst}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhj5hMhj5ubah}(h]h ]h"]h$]h&]uh1j5hj5ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh](j5)}(hhh]h)}(h0h]h0}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj5ubah}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh]h)}(hj5h]h0}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 6hMhj6ubah}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh]h)}(h40h]h40}(hj)6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 6hMhj&6ubah}(h]h ]h"]h$]h&]uh1j5hj5ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh](j5)}(hhh]h)}(h1h]h1}(hjI6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhjF6ubah}(h]h ]h"]h$]h&]uh1j5hjC6ubj5)}(hhh]h)}(hjK6h]h1}(hja6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjW6hMhj^6ubah}(h]h ]h"]h$]h&]uh1j5hjC6ubj5)}(hhh]h)}(h41h]h41}(hjw6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjW6hMhjt6ubah}(h]h ]h"]h$]h&]uh1j5hjC6ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh](j5)}(hhh]h)}(h9h]h9}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj6ubah}(h]h ]h"]h$]h&]uh1j5hj6ubj5)}(hhh]h)}(hj6h]h9}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj6ubah}(h]h ]h"]h$]h&]uh1j5hj6ubj5)}(hhh]h)}(h95h]h95}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj6ubah}(h]h ]h"]h$]h&]uh1j5hj6ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh](j5)}(hhh]h)}(h10h]h10}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj6ubah}(h]h ]h"]h$]h&]uh1j5hj6ubj5)}(hhh]h)}(hj5h]h0}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj6ubah}(h]h ]h"]h$]h&]uh1j5hj6ubj5)}(hhh]h)}(h 40 [#f1]_h](h40 }(hj7hhhNhNubhfootnote_reference)}(h[#f1]_h]h1}(hj7hhhNhNubah}(h]id1ah ]h"]h$]h&]autoKrefidf1docnamecore-api/kernel-apiuh1j7hj7resolvedKubeh}(h]h ]h"]h$]h&]uh1hhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1j5hj6ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh](j5)}(hhh]h)}(h1 3 5 7h]h1 3 5 7}(hjJ7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhjG7ubah}(h]h ]h"]h$]h&]uh1j5hjD7ubj5)}(hhh]h)}(h1 3 5 7h]h1 3 5 7}(hjb7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjX7hMhj_7ubah}(h]h ]h"]h$]h&]uh1j5hjD7ubj5)}(hhh]h)}(h 41 43 48 61h]h 41 43 48 61}(hjy7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjX7hMhjv7ubah}(h]h ]h"]h$]h&]uh1j5hjD7ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh](j5)}(hhh]h)}(h 0 1 2 3 4h]h 0 1 2 3 4}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj7ubah}(h]h ]h"]h$]h&]uh1j5hj7ubj5)}(hhh]h)}(h 0 1 2 3 4h]h 0 1 2 3 4}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMhj7ubah}(h]h ]h"]h$]h&]uh1j5hj7ubj5)}(hhh]h)}(h40 41 42 43 45h]h40 41 42 43 45}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMhj7ubah}(h]h ]h"]h$]h&]uh1j5hj7ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh](j5)}(hhh]h)}(h 0 9 18 27h]h 0 9 18 27}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj7ubah}(h]h ]h"]h$]h&]uh1j5hj7ubj5)}(hhh]h)}(h0 9 8 7h]h0 9 8 7}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMhj7ubah}(h]h ]h"]h$]h&]uh1j5hj7ubj5)}(hhh]h)}(h 40 61 74 95h]h 40 61 74 95}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMhj8ubah}(h]h ]h"]h$]h&]uh1j5hj7ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh](j5)}(hhh]h)}(h 0 10 20 30h]h 0 10 20 30}(hj78hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj48ubah}(h]h ]h"]h$]h&]uh1j5hj18ubj5)}(hhh]h)}(hj5h]h0}(hjO8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjE8hMhjL8ubah}(h]h ]h"]h$]h&]uh1j5hj18ubj5)}(hhh]h)}(h40h]h40}(hje8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjE8hMhjb8ubah}(h]h ]h"]h$]h&]uh1j5hj18ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh](j5)}(hhh]h)}(h 0 11 22 33h]h 0 11 22 33}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj8ubah}(h]h ]h"]h$]h&]uh1j5hj8ubj5)}(hhh]h)}(h0 1 2 3h]h0 1 2 3}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1j5hj8ubj5)}(hhh]h)}(h 40 41 42 43h]h 40 41 42 43}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1j5hj8ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh](j5)}(hhh]h)}(h 0 12 24 36h]h 0 12 24 36}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj8ubah}(h]h ]h"]h$]h&]uh1j5hj8ubj5)}(hhh]h)}(h0 2 4 6h]h0 2 4 6}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1j5hj8ubj5)}(hhh]h)}(h 40 42 45 53h]h 40 42 45 53}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj9ubah}(h]h ]h"]h$]h&]uh1j5hj8ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubj5)}(hhh](j5)}(hhh]h)}(h 78 102 211h]h 78 102 211}(hj#9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj 9ubah}(h]h ]h"]h$]h&]uh1j5hj9ubj5)}(hhh]h)}(h1 2 8h]h1 2 8}(hj;9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj19hMhj89ubah}(h]h ]h"]h$]h&]uh1j5hj9ubj5)}(hhh]h)}(h41 42 74 [#f1]_h](h 41 42 74 }(hjR9hhhNhNubj7)}(h[#f1]_h]h1}(hjZ9hhhNhNubah}(h]id2ah ]h"]h$]h&]j,7Kj-7j.7j/7j07uh1j7hjR9j17Kubeh}(h]h ]h"]h$]h&]uh1hhj19hMhjO9ubah}(h]h ]h"]h$]h&]uh1j5hj9ubeh}(h]h ]h"]h$]h&]uh1j5hj5ubeh}(h]h ]h"]h$]h&]uh1j5hjh5ubeh}(h]h ]h"]h$]h&]colsKuh1jf5hjc5ubah}(h]h ]h"]h$]h&]uh1ja5hj]5ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj4ubeh}(h]h ]h"]h$]h&]uh1j1hj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hMhj2ubeh}(h]h ]h"]h$]h&]uh1j hj)0ubhfootnote)}(hwFor these marked lines, if we hadn't first done bitmap_fold() into tmp, then the **dst** result would have been empty. h](hlabel)}(hhh]h1}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j9hj9hhhNhNubh)}(hvFor these marked lines, if we hadn't first done bitmap_fold() into tmp, then the **dst** result would have been empty.h](hSFor these marked lines, if we hadn’t first done bitmap_fold() into tmp, then the }(hj9hhhNhNubj)}(h**dst**h]hdst}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubh result would have been empty.}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj9ubeh}(h]j.7ah ]h"]f1ah$]h&](j'7jd9ej,7Kj/7j07uh1j9hP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj)0ubh)}(h`If either of **orig** or **relmap** is empty (no set bits), then **dst** will be returned empty.h](h If either of }(hj9hhhNhNubj)}(h**orig**h]horig}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubh or }(hj9hhhNhNubj)}(h **relmap**h]hrelmap}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubh is empty (no set bits), then }(hj9hhhNhNubj)}(h**dst**h]hdst}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubh will be returned empty.}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj)0ubh)}(hIf (as explained above) the only set bits in **orig** are in positions m where m >= W, (where W is the weight of **relmap**) then **dst** will once again be returned empty.h](h-If (as explained above) the only set bits in }(hj*:hhhNhNubj)}(h**orig**h]horig}(hj2:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*:ubh< are in positions m where m >= W, (where W is the weight of }(hj*:hhhNhNubj)}(h **relmap**h]hrelmap}(hjD:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*:ubh) then }(hj*:hhhNhNubj)}(h**dst**h]hdst}(hjV:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*:ubh# will once again be returned empty.}(hj*:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj)0ubh)}(h:All bits in **dst** not set by the above rule are cleared.h](h All bits in }(hjo:hhhNhNubj)}(h**dst**h]hdst}(hjw:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo:ubh' not set by the above rule are cleared.}(hjo:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj)0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_fold (C function) c.bitmap_foldhNtauh1hhjhhhNhNubj)}(hhh](j)}(hevoid bitmap_fold (unsigned long *dst, const unsigned long *orig, unsigned int sz, unsigned int nbits)h]j)}(hdvoid bitmap_fold(unsigned long *dst, const unsigned long *orig, unsigned int sz, unsigned int nbits)h](j )}(hvoidh]hvoid}(hj:hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj:hhhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:hhhj:hMubj{)}(h bitmap_foldh]j)}(h bitmap_foldh]h bitmap_fold}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj:hhhj:hMubj)}(hT(unsigned long *dst, const unsigned long *orig, unsigned int sz, unsigned int nbits)h](j)}(hunsigned long *dsth](j )}(hunsignedh]hunsigned}(hj:hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj:ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj )}(hlongh]hlong}(hj ;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj:ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(hjh]h*}(hj%;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hdsth]hdst}(hj2;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hconst unsigned long *origh](j)}(hjh]hconst}(hjK;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG;ubj2)}(h h]h }(hjX;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjG;ubj )}(hunsignedh]hunsigned}(hjf;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjG;ubj2)}(h h]h }(hjt;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjG;ubj )}(hlongh]hlong}(hj;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjG;ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjG;ubj)}(hjh]h*}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG;ubj)}(horigh]horig}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG;ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hunsigned int szh](j )}(hunsignedh]hunsigned}(hj;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj;ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;ubj )}(hinth]hint}(hj;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj;ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;ubj)}(hszh]hsz}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hj<hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj<ubj2)}(h h]h }(hj#<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubj )}(hinth]hint}(hj1<hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj<ubj2)}(h h]h }(hj?<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubj)}(hnbitsh]hnbits}(hjM<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubeh}(h]h ]h"]h$]h&]jjuh1jhj:hhhj:hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj:hhhj:hMubah}(h]j:ah ](jjeh"]h$]h&]jj)jhuh1jhj:hMhj:hhubj)}(hhh]h)}(h6fold larger bitmap into smaller, modulo specified sizeh]h6fold larger bitmap into smaller, modulo specified size}(hjw<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhjt<hhubah}(h]h ]h"]h$]h&]uh1jhj:hhhj:hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj<jj<jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``unsigned long *dst`` resulting smaller bitmap ``const unsigned long *orig`` original larger bitmap ``unsigned int sz`` specified size ``unsigned int nbits`` number of bits in each of these bitmaps **Description** For each bit oldbit in **orig**, set bit oldbit mod **sz** in **dst**. Clear all other bits in **dst**. See further the comment and Example [2] for bitmap_onto() for why and how to use this.h](h)}(h**Parameters**h]j)}(hj<h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj<ubj )}(hhh](j)}(h0``unsigned long *dst`` resulting smaller bitmap h](j)}(h``unsigned long *dst``h]j)}(hj<h]hunsigned long *dst}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj<ubj2)}(hhh]h)}(hresulting smaller bitmaph]hresulting smaller bitmap}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhj<ubj)}(h5``const unsigned long *orig`` original larger bitmap h](j)}(h``const unsigned long *orig``h]j)}(hj<h]hconst unsigned long *orig}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj<ubj2)}(hhh]h)}(horiginal larger bitmaph]horiginal larger bitmap}(hj =hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj=ubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhj=hMhj<ubj)}(h#``unsigned int sz`` specified size h](j)}(h``unsigned int sz``h]j)}(hj*=h]hunsigned int sz}(hj,=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(=ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj$=ubj2)}(hhh]h)}(hspecified sizeh]hspecified size}(hjC=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?=hMhj@=ubah}(h]h ]h"]h$]h&]uh1j1hj$=ubeh}(h]h ]h"]h$]h&]uh1jhj?=hMhj<ubj)}(h?``unsigned int nbits`` number of bits in each of these bitmaps h](j)}(h``unsigned int nbits``h]j)}(hjc=h]hunsigned int nbits}(hje=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhja=ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj]=ubj2)}(hhh]h)}(h'number of bits in each of these bitmapsh]h'number of bits in each of these bitmaps}(hj|=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjx=hMhjy=ubah}(h]h ]h"]h$]h&]uh1j1hj]=ubeh}(h]h ]h"]h$]h&]uh1jhjx=hMhj<ubeh}(h]h ]h"]h$]h&]uh1j hj<ubh)}(h**Description**h]j)}(hj=h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj<ubh)}(hFor each bit oldbit in **orig**, set bit oldbit mod **sz** in **dst**. Clear all other bits in **dst**. See further the comment and Example [2] for bitmap_onto() for why and how to use this.h](hFor each bit oldbit in }(hj=hhhNhNubj)}(h**orig**h]horig}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh, set bit oldbit mod }(hj=hhhNhNubj)}(h**sz**h]hsz}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh in }(hj=hhhNhNubj)}(h**dst**h]hdst}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh. Clear all other bits in }(hj=hhhNhNubj)}(h**dst**h]hdst}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubhY. See further the comment and Example [2] for bitmap_onto() for why and how to use this.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:81: ./lib/bitmap.chMhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'bitmap_find_next_zero_area (C function)c.bitmap_find_next_zero_areahNtauh1hhjhhhNhNubj)}(hhh](j)}(hunsigned long bitmap_find_next_zero_area (unsigned long *map, unsigned long size, unsigned long start, unsigned int nr, unsigned long align_mask)h]j)}(hunsigned long bitmap_find_next_zero_area(unsigned long *map, unsigned long size, unsigned long start, unsigned int nr, unsigned long align_mask)h](j )}(hunsignedh]hunsigned}(hj+>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj'>hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhKubj2)}(h h]h }(hj:>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'>hhhj9>hKubj )}(hlongh]hlong}(hjH>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj'>hhhj9>hKubj2)}(h h]h }(hjV>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'>hhhj9>hKubj{)}(hbitmap_find_next_zero_areah]j)}(hbitmap_find_next_zero_areah]hbitmap_find_next_zero_area}(hjh>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd>ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj'>hhhj9>hKubj)}(hh(unsigned long *map, unsigned long size, unsigned long start, unsigned int nr, unsigned long align_mask)h](j)}(hunsigned long *maph](j )}(hunsignedh]hunsigned}(hj>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj )}(hlongh]hlong}(hj>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hmaph]hmap}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|>ubj)}(hunsigned long sizeh](j )}(hunsignedh]hunsigned}(hj>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj )}(hlongh]hlong}(hj>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hj ?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hsizeh]hsize}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|>ubj)}(hunsigned long starth](j )}(hunsignedh]hunsigned}(hj3?hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj/?ubj2)}(h h]h }(hjA?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/?ubj )}(hlongh]hlong}(hjO?hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj/?ubj2)}(h h]h }(hj]?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/?ubj)}(hstarth]hstart}(hjk?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|>ubj)}(hunsigned int nrh](j )}(hunsignedh]hunsigned}(hj?hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubj )}(hinth]hint}(hj?hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubj)}(hnrh]hnr}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|>ubj)}(hunsigned long align_maskh](j )}(hunsignedh]hunsigned}(hj?hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubj )}(hlongh]hlong}(hj?hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubj)}(h align_maskh]h align_mask}(hj @hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|>ubeh}(h]h ]h"]h$]h&]jjuh1jhj'>hhhj9>hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj#>hhhj9>hKubah}(h]j>ah ](jjeh"]h$]h&]jj)jhuh1jhj9>hKhj >hhubj)}(hhh]h)}(h#find a contiguous aligned zero areah]h#find a contiguous aligned zero area}(hj7@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhKhj4@hhubah}(h]h ]h"]h$]h&]uh1jhj >hhhj9>hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjO@jjO@jjjuh1jhhhjhNhNubj)}(hX%**Parameters** ``unsigned long *map`` The address to base the search on ``unsigned long size`` The bitmap size in bits ``unsigned long start`` The bitnumber to start searching at ``unsigned int nr`` The number of zeroed bits we're looking for ``unsigned long align_mask`` Alignment mask for zero area **Description** The **align_mask** should be one less than a power of 2; the effect is that the bit offset of all zero areas this function finds is multiples of that power of 2. A **align_mask** of 0 means no alignment is required.h](h)}(h**Parameters**h]j)}(hjY@h]h Parameters}(hj[@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW@ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhKhjS@ubj )}(hhh](j)}(h9``unsigned long *map`` The address to base the search on h](j)}(h``unsigned long *map``h]j)}(hjx@h]hunsigned long *map}(hjz@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv@ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhKhjr@ubj2)}(hhh]h)}(h!The address to base the search onh]h!The address to base the search on}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hKhj@ubah}(h]h ]h"]h$]h&]uh1j1hjr@ubeh}(h]h ]h"]h$]h&]uh1jhj@hKhjo@ubj)}(h/``unsigned long size`` The bitmap size in bits h](j)}(h``unsigned long size``h]j)}(hj@h]hunsigned long size}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhKhj@ubj2)}(hhh]h)}(hThe bitmap size in bitsh]hThe bitmap size in bits}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hKhj@ubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hKhjo@ubj)}(h<``unsigned long start`` The bitnumber to start searching at h](j)}(h``unsigned long start``h]j)}(hj@h]hunsigned long start}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhKhj@ubj2)}(hhh]h)}(h#The bitnumber to start searching ath]h#The bitnumber to start searching at}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hKhjAubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hKhjo@ubj)}(h@``unsigned int nr`` The number of zeroed bits we're looking for h](j)}(h``unsigned int nr``h]j)}(hj#Ah]hunsigned int nr}(hj%AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!Aubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhKhjAubj2)}(hhh]h)}(h+The number of zeroed bits we're looking forh]h-The number of zeroed bits we’re looking for}(hjah"]h$]h&]uh1j1hjAhhhj BhMubj{)}(hbitmap_or_equalh]j)}(hbitmap_or_equalh]hbitmap_or_equal}(hj BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjAhhhj BhMubj)}(he(const unsigned long *src1, const unsigned long *src2, const unsigned long *src3, unsigned int nbits)h](j)}(hconst unsigned long *src1h](j)}(hjh]hconst}(hjah"]h$]h&]uh1j1hj8Bubj )}(hunsignedh]hunsigned}(hjWBhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj8Bubj2)}(h h]h }(hjeBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8Bubj )}(hlongh]hlong}(hjsBhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj8Bubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8Bubj)}(hjh]h*}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8Bubj)}(hsrc1h]hsrc1}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8Bubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj4Bubj)}(hconst unsigned long *src2h](j)}(hjh]hconst}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj )}(hunsignedh]hunsigned}(hjBhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj )}(hlongh]hlong}(hjBhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(hsrc2h]hsrc2}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj4Bubj)}(hconst unsigned long *src3h](j)}(hjh]hconst}(hj.ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*Cubj2)}(h h]h }(hj;ChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*Cubj )}(hunsignedh]hunsigned}(hjIChhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*Cubj2)}(h h]h }(hjWChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*Cubj )}(hlongh]hlong}(hjeChhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*Cubj2)}(h h]h }(hjsChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*Cubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*Cubj)}(hsrc3h]hsrc3}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*Cubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj4Bubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hjChhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjCubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubj )}(hinth]hint}(hjChhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjCubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubj)}(hnbitsh]hnbits}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj4Bubeh}(h]h ]h"]h$]h&]jjuh1jhjAhhhj BhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjAhhhj BhMubah}(h]jAah ](jjeh"]h$]h&]jj)jhuh1jhj BhMhjAhhubj)}(hhh]h)}(h7Check whether the or of two bitmaps is equal to a thirdh]h7Check whether the or of two bitmaps is equal to a third}(hj DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjDhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhj BhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!Djj!Djjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const unsigned long *src1`` Pointer to bitmap 1 ``const unsigned long *src2`` Pointer to bitmap 2 will be or'ed with bitmap 1 ``const unsigned long *src3`` Pointer to bitmap 3. Compare to the result of ***src1** | ***src2** ``unsigned int nbits`` number of bits in each of these bitmaps **Return** True if (***src1** | ***src2**) == ***src3**, false otherwiseh](h)}(h**Parameters**h]j)}(hj+Dh]h Parameters}(hj-DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)Dubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhj%Dubj )}(hhh](j)}(h2``const unsigned long *src1`` Pointer to bitmap 1 h](j)}(h``const unsigned long *src1``h]j)}(hjJDh]hconst unsigned long *src1}(hjLDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHDubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjDDubj2)}(hhh]h)}(hPointer to bitmap 1h]hPointer to bitmap 1}(hjcDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_DhMhj`Dubah}(h]h ]h"]h$]h&]uh1j1hjDDubeh}(h]h ]h"]h$]h&]uh1jhj_DhMhjADubj)}(hN``const unsigned long *src2`` Pointer to bitmap 2 will be or'ed with bitmap 1 h](j)}(h``const unsigned long *src2``h]j)}(hjDh]hconst unsigned long *src2}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhj}Dubj2)}(hhh]h)}(h/Pointer to bitmap 2 will be or'ed with bitmap 1h]h1Pointer to bitmap 2 will be or’ed with bitmap 1}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMhjDubah}(h]h ]h"]h$]h&]uh1j1hj}Dubeh}(h]h ]h"]h$]h&]uh1jhjDhMhjADubj)}(hb``const unsigned long *src3`` Pointer to bitmap 3. Compare to the result of ***src1** | ***src2** h](j)}(h``const unsigned long *src3``h]j)}(hjDh]hconst unsigned long *src3}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjDubj2)}(hhh]h)}(hCPointer to bitmap 3. Compare to the result of ***src1** | ***src2**h](h.Pointer to bitmap 3. Compare to the result of }(hjDhhhNhNubj)}(h ***src1**h]h*src1}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh | }(hjDhhhNhNubj)}(h ***src2**h]h*src2}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1hhjDhMhjDubah}(h]h ]h"]h$]h&]uh1j1hjDubeh}(h]h ]h"]h$]h&]uh1jhjDhMhjADubj)}(h?``unsigned int nbits`` number of bits in each of these bitmaps h](j)}(h``unsigned int nbits``h]j)}(hjEh]hunsigned int nbits}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjEubj2)}(hhh]h)}(h'number of bits in each of these bitmapsh]h'number of bits in each of these bitmaps}(hj.EhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*EhMhj+Eubah}(h]h ]h"]h$]h&]uh1j1hjEubeh}(h]h ]h"]h$]h&]uh1jhj*EhMhjADubeh}(h]h ]h"]h$]h&]uh1j hj%Dubh)}(h **Return**h]j)}(hjPEh]hReturn}(hjREhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNEubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhj%Dubh)}(h=True if (***src1** | ***src2**) == ***src3**, false otherwiseh](h True if (}(hjfEhhhNhNubj)}(h ***src1**h]h*src1}(hjnEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfEubh | }(hjfEhhhNhNubj)}(h ***src2**h]h*src2}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfEubh) == }(hjfEhhhNhNubj)}(h ***src3**h]h*src3}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfEubh, false otherwise}(hjfEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhj%Dubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_weight_from (C function)c.bitmap_weight_fromhNtauh1hhjhhhNhNubj)}(hhh](j)}(hdunsigned long bitmap_weight_from (const unsigned long *bitmap, unsigned int start, unsigned int end)h]j)}(hcunsigned long bitmap_weight_from(const unsigned long *bitmap, unsigned int start, unsigned int end)h](j )}(hunsignedh]hunsigned}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjEhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEhhhjEhMubj )}(hlongh]hlong}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjEhhhjEhMubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEhhhjEhMubj{)}(hbitmap_weight_fromh]j)}(hbitmap_weight_fromh]hbitmap_weight_from}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjEhhhjEhMubj)}(hC(const unsigned long *bitmap, unsigned int start, unsigned int end)h](j)}(hconst unsigned long *bitmaph](j)}(hjh]hconst}(hj$FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Fubj2)}(h h]h }(hj1FhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj Fubj )}(hunsignedh]hunsigned}(hj?FhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj Fubj2)}(h h]h }(hjMFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj Fubj )}(hlongh]hlong}(hj[FhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj Fubj2)}(h h]h }(hjiFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj Fubj)}(hjh]h*}(hjwFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Fubj)}(hbitmaph]hbitmap}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Fubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjFubj)}(hunsigned int starth](j )}(hunsignedh]hunsigned}(hjFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjFubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj )}(hinth]hint}(hjFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjFubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj)}(hstarth]hstart}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjFubj)}(hunsigned int endh](j )}(hunsignedh]hunsigned}(hjFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjFubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj )}(hinth]hint}(hj GhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjFubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj)}(hendh]hend}(hj&GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjFubeh}(h]h ]h"]h$]h&]jjuh1jhjEhhhjEhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjEhhhjEhMubah}(h]jEah ](jjeh"]h$]h&]jj)jhuh1jhjEhMhjEhhubj)}(hhh]h)}(h"Hamming weight for a memory regionh]h"Hamming weight for a memory region}(hjPGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjMGhhubah}(h]h ]h"]h$]h&]uh1jhjEhhhjEhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjhGjjhGjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const unsigned long *bitmap`` The base address ``unsigned int start`` The bitnumber to starts weighting ``unsigned int end`` the bitmap size in bits **Description** Returns the number of set bits in the region. If **start** >= **end**, return >= end.h](h)}(h**Parameters**h]j)}(hjrGh]h Parameters}(hjtGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpGubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjlGubj )}(hhh](j)}(h1``const unsigned long *bitmap`` The base address h](j)}(h``const unsigned long *bitmap``h]j)}(hjGh]hconst unsigned long *bitmap}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjGubj2)}(hhh]h)}(hThe base addressh]hThe base address}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMhjGubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhjGhMhjGubj)}(h9``unsigned int start`` The bitnumber to starts weighting h](j)}(h``unsigned int start``h]j)}(hjGh]hunsigned int start}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjGubj2)}(hhh]h)}(h!The bitnumber to starts weightingh]h!The bitnumber to starts weighting}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMhjGubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhjGhMhjGubj)}(h-``unsigned int end`` the bitmap size in bits h](j)}(h``unsigned int end``h]j)}(hjHh]hunsigned int end}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjGubj2)}(hhh]h)}(hthe bitmap size in bitsh]hthe bitmap size in bits}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhMhjHubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhjHhMhjGubeh}(h]h ]h"]h$]h&]uh1j hjlGubh)}(h**Description**h]j)}(hj>Hh]h Description}(hj@HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj= **end**, return >= end.h](h1Returns the number of set bits in the region. If }(hjTHhhhNhNubj)}(h **start**h]hstart}(hj\HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTHubh >= }(hjTHhhhNhNubj)}(h**end**h]hend}(hjnHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTHubh, return >= end.}(hjTHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjlGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_scatter (C function)c.bitmap_scatterhNtauh1hhjhhhNhNubj)}(hhh](j)}(hqvoid bitmap_scatter (unsigned long *dst, const unsigned long *src, const unsigned long *mask, unsigned int nbits)h]j)}(hpvoid bitmap_scatter(unsigned long *dst, const unsigned long *src, const unsigned long *mask, unsigned int nbits)h](j )}(hvoidh]hvoid}(hjHhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMTubj2)}(h h]h }(hjHhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHhhhjHhMTubj{)}(hbitmap_scatterh]j)}(hbitmap_scatterh]hbitmap_scatter}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjHhhhjHhMTubj)}(h](unsigned long *dst, const unsigned long *src, const unsigned long *mask, unsigned int nbits)h](j)}(hunsigned long *dsth](j )}(hunsignedh]hunsigned}(hjHhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjHhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj )}(hlongh]hlong}(hjIhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj)}(hjh]h*}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hdsth]hdst}(hj)IhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubj)}(hconst unsigned long *srch](j)}(hjh]hconst}(hjBIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Iubj2)}(h h]h }(hjOIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>Iubj )}(hunsignedh]hunsigned}(hj]IhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>Iubj2)}(h h]h }(hjkIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>Iubj )}(hlongh]hlong}(hjyIhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>Iubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>Iubj)}(hjh]h*}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Iubj)}(hsrch]hsrc}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Iubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubj)}(hconst unsigned long *maskh](j)}(hjh]hconst}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj )}(hunsignedh]hunsigned}(hjIhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj )}(hlongh]hlong}(hjIhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjIubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjh]h*}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hmaskh]hmask}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hj4JhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj0Jubj2)}(h h]h }(hjBJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0Jubj )}(hinth]hint}(hjPJhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj0Jubj2)}(h h]h }(hj^JhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0Jubj)}(hnbitsh]hnbits}(hjlJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0Jubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubeh}(h]h ]h"]h$]h&]jjuh1jhjHhhhjHhMTubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjHhhhjHhMTubah}(h]jHah ](jjeh"]h$]h&]jj)jhuh1jhjHhMThjHhhubj)}(hhh]h)}(h,Scatter a bitmap according to the given maskh]h,Scatter a bitmap according to the given mask}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMThjJhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjHhMTubeh}(h]h ](jfunctioneh"]h$]h&]jjjjJjjJjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``unsigned long *dst`` scattered bitmap ``const unsigned long *src`` gathered bitmap ``const unsigned long *mask`` mask representing bits to assign to in the scattered bitmap ``unsigned int nbits`` number of bits in each of these bitmaps **Description** Scatters bitmap with sequential bits according to the given **mask**. **Example** If **src** bitmap = 0x005a, with **mask** = 0x1313, **dst** will be 0x0302. Or in binary form **src** **mask** **dst** 0000000001011010 0001001100010011 0000001100000010 (Bits 0, 1, 2, 3, 4, 5 are copied to the bits 0, 1, 4, 8, 9, 12) A more 'visual' description of the operation:: src: 0000000001011010 |||||| +------+||||| | +----+|||| | |+----+||| | || +-+|| | || | || mask: ...v..vv...v..vv ...0..11...0..10 dst: 0000001100000010 A relationship exists between bitmap_scatter() and bitmap_gather(). See bitmap_gather() for the bitmap gather detailed operations. TL;DR: bitmap_gather() can be seen as the 'reverse' bitmap_scatter() operation.h](h)}(h**Parameters**h]j)}(hjJh]h Parameters}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMXhjJubj )}(hhh](j)}(h(``unsigned long *dst`` scattered bitmap h](j)}(h``unsigned long *dst``h]j)}(hjJh]hunsigned long *dst}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMUhjJubj2)}(hhh]h)}(hscattered bitmaph]hscattered bitmap}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMUhjJubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjJhMUhjJubj)}(h-``const unsigned long *src`` gathered bitmap h](j)}(h``const unsigned long *src``h]j)}(hjKh]hconst unsigned long *src}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMVhj Kubj2)}(hhh]h)}(hgathered bitmaph]hgathered bitmap}(hj)KhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%KhMVhj&Kubah}(h]h ]h"]h$]h&]uh1j1hj Kubeh}(h]h ]h"]h$]h&]uh1jhj%KhMVhjJubj)}(hZ``const unsigned long *mask`` mask representing bits to assign to in the scattered bitmap h](j)}(h``const unsigned long *mask``h]j)}(hjIKh]hconst unsigned long *mask}(hjKKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGKubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMWhjCKubj2)}(hhh]h)}(h;mask representing bits to assign to in the scattered bitmaph]h;mask representing bits to assign to in the scattered bitmap}(hjbKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^KhMWhj_Kubah}(h]h ]h"]h$]h&]uh1j1hjCKubeh}(h]h ]h"]h$]h&]uh1jhj^KhMWhjJubj)}(h?``unsigned int nbits`` number of bits in each of these bitmaps h](j)}(h``unsigned int nbits``h]j)}(hjKh]hunsigned int nbits}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMXhj|Kubj2)}(hhh]h)}(h'number of bits in each of these bitmapsh]h'number of bits in each of these bitmaps}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMXhjKubah}(h]h ]h"]h$]h&]uh1j1hj|Kubeh}(h]h ]h"]h$]h&]uh1jhjKhMXhjJubeh}(h]h ]h"]h$]h&]uh1j hjJubh)}(h**Description**h]j)}(hjKh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMZhjJubh)}(hEScatters bitmap with sequential bits according to the given **mask**.h](h 0000000001011010 0001001100010011 0000001100000010}(hjQLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM^hjJubh)}(h@(Bits 0, 1, 2, 3, 4, 5 are copied to the bits 0, 1, 4, 8, 9, 12)h]h@(Bits 0, 1, 2, 3, 4, 5 are copied to the bits 0, 1, 4, 8, 9, 12)}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMbhjJubh)}(h.A more 'visual' description of the operation::h]h1A more ‘visual’ description of the operation:}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMdhjJubj7C)}(hsrc: 0000000001011010 |||||| +------+||||| | +----+|||| | |+----+||| | || +-+|| | || | || mask: ...v..vv...v..vv ...0..11...0..10 dst: 0000001100000010h]hsrc: 0000000001011010 |||||| +------+||||| | +----+|||| | |+----+||| | || +-+|| | || | || mask: ...v..vv...v..vv ...0..11...0..10 dst: 0000001100000010}hjLsbah}(h]h ]h"]h$]h&]jjuh1j6ChZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMfhjJubh)}(hA relationship exists between bitmap_scatter() and bitmap_gather(). See bitmap_gather() for the bitmap gather detailed operations. TL;DR: bitmap_gather() can be seen as the 'reverse' bitmap_scatter() operation.h]hA relationship exists between bitmap_scatter() and bitmap_gather(). See bitmap_gather() for the bitmap gather detailed operations. TL;DR: bitmap_gather() can be seen as the ‘reverse’ bitmap_scatter() operation.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMqhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_gather (C function)c.bitmap_gatherhNtauh1hhjhhhNhNubj)}(hhh](j)}(hpvoid bitmap_gather (unsigned long *dst, const unsigned long *src, const unsigned long *mask, unsigned int nbits)h]j)}(hovoid bitmap_gather(unsigned long *dst, const unsigned long *src, const unsigned long *mask, unsigned int nbits)h](j )}(hvoidh]hvoid}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLhhhjMhMubj{)}(h bitmap_gatherh]j)}(h bitmap_gatherh]h bitmap_gather}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjLhhhjMhMubj)}(h](unsigned long *dst, const unsigned long *src, const unsigned long *mask, unsigned int nbits)h](j)}(hunsigned long *dsth](j )}(hunsignedh]hunsigned}(hj/MhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+Mubj2)}(h h]h }(hj=MhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+Mubj )}(hlongh]hlong}(hjKMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+Mubj2)}(h h]h }(hjYMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+Mubj)}(hjh]h*}(hjgMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+Mubj)}(hdsth]hdst}(hjtMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+Mubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'Mubj)}(hconst unsigned long *srch](j)}(hjh]hconst}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj )}(hunsignedh]hunsigned}(hjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj )}(hlongh]hlong}(hjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj)}(hjh]h*}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(hsrch]hsrc}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'Mubj)}(hconst unsigned long *maskh](j)}(hjh]hconst}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj )}(hunsignedh]hunsigned}(hj!NhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjNubj2)}(h h]h }(hj/NhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj )}(hlongh]hlong}(hj=NhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjNubj2)}(h h]h }(hjKNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj)}(hjh]h*}(hjYNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj)}(hmaskh]hmask}(hjfNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'Mubj)}(hunsigned int nbitsh](j )}(hunsignedh]hunsigned}(hjNhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj{Nubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{Nubj )}(hinth]hint}(hjNhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj{Nubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{Nubj)}(hnbitsh]hnbits}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{Nubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'Mubeh}(h]h ]h"]h$]h&]jjuh1jhjLhhhjMhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjLhhhjMhMubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1jhjMhMhjLhhubj)}(hhh]h)}(h'Gather a bitmap according to given maskh]h'Gather a bitmap according to given mask}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNhhubah}(h]h ]h"]h$]h&]uh1jhjLhhhjMhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjNjjNjjjuh1jhhhjhNhNubj)}(hXV**Parameters** ``unsigned long *dst`` gathered bitmap ``const unsigned long *src`` scattered bitmap ``const unsigned long *mask`` mask representing bits to extract from in the scattered bitmap ``unsigned int nbits`` number of bits in each of these bitmaps **Description** Gathers bitmap with sparse bits according to the given **mask**. **Example** If **src** bitmap = 0x0302, with **mask** = 0x1313, **dst** will be 0x001a. Or in binary form **src** **mask** **dst** 0000001100000010 0001001100010011 0000000000011010 (Bits 0, 1, 4, 8, 9, 12 are copied to the bits 0, 1, 2, 3, 4, 5) A more 'visual' description of the operation:: mask: ...v..vv...v..vv src: 0000001100000010 ^ ^^ ^ 0 | || | 10 | || > 010 | |+--> 1010 | +--> 11010 +----> 011010 dst: 0000000000011010 A relationship exists between bitmap_gather() and bitmap_scatter(). See bitmap_scatter() for the bitmap scatter detailed operations. TL;DR: bitmap_scatter() can be seen as the 'reverse' bitmap_gather() operation. Suppose scattered computed using bitmap_scatter(scattered, src, mask, n). The operation bitmap_gather(result, scattered, mask, n) leads to a result equal or equivalent to src. The result can be 'equivalent' because bitmap_scatter() and bitmap_gather() are not bijective. The result and src values are equivalent in that sense that a call to bitmap_scatter(res, src, mask, n) and a call to bitmap_scatter(res, result, mask, n) will lead to the same res value.h](h)}(h**Parameters**h]j)}(hjOh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubj )}(hhh](j)}(h'``unsigned long *dst`` gathered bitmap h](j)}(h``unsigned long *dst``h]j)}(hj"Oh]hunsigned long *dst}(hj$OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Oubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjOubj2)}(hhh]h)}(hgathered bitmaph]hgathered bitmap}(hj;OhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7OhMhj8Oubah}(h]h ]h"]h$]h&]uh1j1hjOubeh}(h]h ]h"]h$]h&]uh1jhj7OhMhjOubj)}(h.``const unsigned long *src`` scattered bitmap h](j)}(h``const unsigned long *src``h]j)}(hj[Oh]hconst unsigned long *src}(hj]OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYOubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjUOubj2)}(hhh]h)}(hscattered bitmaph]hscattered bitmap}(hjtOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjpOhMhjqOubah}(h]h ]h"]h$]h&]uh1j1hjUOubeh}(h]h ]h"]h$]h&]uh1jhjpOhMhjOubj)}(h]``const unsigned long *mask`` mask representing bits to extract from in the scattered bitmap h](j)}(h``const unsigned long *mask``h]j)}(hjOh]hconst unsigned long *mask}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjOubj2)}(hhh]h)}(h>mask representing bits to extract from in the scattered bitmaph]h>mask representing bits to extract from in the scattered bitmap}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjOubah}(h]h ]h"]h$]h&]uh1j1hjOubeh}(h]h ]h"]h$]h&]uh1jhjOhMhjOubj)}(h?``unsigned int nbits`` number of bits in each of these bitmaps h](j)}(h``unsigned int nbits``h]j)}(hjOh]hunsigned int nbits}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjOubj2)}(hhh]h)}(h'number of bits in each of these bitmapsh]h'number of bits in each of these bitmaps}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjOubah}(h]h ]h"]h$]h&]uh1j1hjOubeh}(h]h ]h"]h$]h&]uh1jhjOhMhjOubeh}(h]h ]h"]h$]h&]uh1j hjNubh)}(h**Description**h]j)}(hjPh]h Description}(hj PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubh)}(h@Gathers bitmap with sparse bits according to the given **mask**.h](h7Gathers bitmap with sparse bits according to the given }(hjPhhhNhNubj)}(h**mask**h]hmask}(hj&PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubh)}(h **Example**h]j)}(hjAPh]hExample}(hjCPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?Pubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubh)}(hKIf **src** bitmap = 0x0302, with **mask** = 0x1313, **dst** will be 0x001a.h](hIf }(hjWPhhhNhNubj)}(h**src**h]hsrc}(hj_PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWPubh bitmap = 0x0302, with }(hjWPhhhNhNubj)}(h**mask**h]hmask}(hjqPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWPubh = 0x1313, }(hjWPhhhNhNubj)}(h**dst**h]hdst}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWPubh will be 0x001a.}(hjWPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubh)}(hOr in binary form **src** **mask** **dst** 0000001100000010 0001001100010011 0000000000011010h](hOr in binary form }(hjPhhhNhNubj)}(h**src**h]hsrc}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh }(hjPhhhNhNubj)}(h**mask**h]hmask}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh }(hjPhhhNhNubj)}(h**dst**h]hdst}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh> 0000001100000010 0001001100010011 0000000000011010}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubh)}(h@(Bits 0, 1, 4, 8, 9, 12 are copied to the bits 0, 1, 2, 3, 4, 5)h]h@(Bits 0, 1, 4, 8, 9, 12 are copied to the bits 0, 1, 2, 3, 4, 5)}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubh)}(h.A more 'visual' description of the operation::h]h1A more ‘visual’ description of the operation:}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubj7C)}(hmask: ...v..vv...v..vv src: 0000001100000010 ^ ^^ ^ 0 | || | 10 | || > 010 | |+--> 1010 | +--> 11010 +----> 011010 dst: 0000000000011010h]hmask: ...v..vv...v..vv src: 0000001100000010 ^ ^^ ^ 0 | || | 10 | || > 010 | |+--> 1010 | +--> 11010 +----> 011010 dst: 0000000000011010}hjPsbah}(h]h ]h"]h$]h&]jjuh1j6ChZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubh)}(hA relationship exists between bitmap_gather() and bitmap_scatter(). See bitmap_scatter() for the bitmap scatter detailed operations. TL;DR: bitmap_scatter() can be seen as the 'reverse' bitmap_gather() operation.h]hA relationship exists between bitmap_gather() and bitmap_scatter(). See bitmap_scatter() for the bitmap scatter detailed operations. TL;DR: bitmap_scatter() can be seen as the ‘reverse’ bitmap_gather() operation.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubh)}(hSuppose scattered computed using bitmap_scatter(scattered, src, mask, n). The operation bitmap_gather(result, scattered, mask, n) leads to a result equal or equivalent to src.h]hSuppose scattered computed using bitmap_scatter(scattered, src, mask, n). The operation bitmap_gather(result, scattered, mask, n) leads to a result equal or equivalent to src.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubh)}(hXThe result can be 'equivalent' because bitmap_scatter() and bitmap_gather() are not bijective. The result and src values are equivalent in that sense that a call to bitmap_scatter(res, src, mask, n) and a call to bitmap_scatter(res, result, mask, n) will lead to the same res value.h]hXThe result can be ‘equivalent’ because bitmap_scatter() and bitmap_gather() are not bijective. The result and src values are equivalent in that sense that a call to bitmap_scatter(res, src, mask, n) and a call to bitmap_scatter(res, result, mask, n) will lead to the same res value.}(hj,QhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "bitmap_release_region (C function)c.bitmap_release_regionhNtauh1hhjhhhNhNubj)}(hhh](j)}(hOvoid bitmap_release_region (unsigned long *bitmap, unsigned int pos, int order)h]j)}(hNvoid bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order)h](j )}(hvoidh]hvoid}(hj[QhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWQhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMubj2)}(h h]h }(hjjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWQhhhjiQhMubj{)}(hbitmap_release_regionh]j)}(hbitmap_release_regionh]hbitmap_release_region}(hj|QhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxQubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjWQhhhjiQhMubj)}(h4(unsigned long *bitmap, unsigned int pos, int order)h](j)}(hunsigned long *bitmaph](j )}(hunsignedh]hunsigned}(hjQhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj )}(hlongh]hlong}(hjQhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hjh]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(hbitmaph]hbitmap}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubj)}(hunsigned int posh](j )}(hunsignedh]hunsigned}(hjQhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj )}(hinth]hint}(hjRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjQubj2)}(h h]h }(hj RhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hposh]hpos}(hj.RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubj)}(h int orderh](j )}(hinth]hint}(hjGRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjCRubj2)}(h h]h }(hjURhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCRubj)}(horderh]horder}(hjcRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCRubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubeh}(h]h ]h"]h$]h&]jjuh1jhjWQhhhjiQhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjSQhhhjiQhMubah}(h]jNQah ](jjeh"]h$]h&]jj)jhuh1jhjiQhMhjPQhhubj)}(hhh]h)}(hrelease allocated bitmap regionh]hrelease allocated bitmap region}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjRhhubah}(h]h ]h"]h$]h&]uh1jhjPQhhhjiQhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjRjjRjjjuh1jhhhjhNhNubj)}(hXg**Parameters** ``unsigned long *bitmap`` array of unsigned longs corresponding to the bitmap ``unsigned int pos`` beginning of bit region to release ``int order`` region size (log base 2 of number of bits) to release **Description** This is the complement to __bitmap_find_free_region() and releases the found region (by clearing it in the bitmap).h](h)}(h**Parameters**h]j)}(hjRh]h Parameters}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjRubj )}(hhh](j)}(hN``unsigned long *bitmap`` array of unsigned longs corresponding to the bitmap h](j)}(h``unsigned long *bitmap``h]j)}(hjRh]hunsigned long *bitmap}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjRubj2)}(hhh]h)}(h3array of unsigned longs corresponding to the bitmaph]h3array of unsigned longs corresponding to the bitmap}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhjRubah}(h]h ]h"]h$]h&]uh1j1hjRubeh}(h]h ]h"]h$]h&]uh1jhjRhMhjRubj)}(h8``unsigned int pos`` beginning of bit region to release h](j)}(h``unsigned int pos``h]j)}(hjSh]hunsigned int pos}(hj ShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjSubj2)}(hhh]h)}(h"beginning of bit region to releaseh]h"beginning of bit region to release}(hj ShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjSubah}(h]h ]h"]h$]h&]uh1j1hjSubeh}(h]h ]h"]h$]h&]uh1jhjShMhjRubj)}(hD``int order`` region size (log base 2 of number of bits) to release h](j)}(h ``int order``h]j)}(hj@Sh]h int order}(hjBShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>Subah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhj:Subj2)}(hhh]h)}(h5region size (log base 2 of number of bits) to releaseh]h5region size (log base 2 of number of bits) to release}(hjYShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUShMhjVSubah}(h]h ]h"]h$]h&]uh1j1hj:Subeh}(h]h ]h"]h$]h&]uh1jhjUShMhjRubeh}(h]h ]h"]h$]h&]uh1j hjRubh)}(h**Description**h]j)}(hj{Sh]h Description}(hj}ShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjySubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjRubh)}(hsThis is the complement to __bitmap_find_free_region() and releases the found region (by clearing it in the bitmap).h]hsThis is the complement to __bitmap_find_free_region() and releases the found region (by clearing it in the bitmap).}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #bitmap_allocate_region (C function)c.bitmap_allocate_regionhNtauh1hhjhhhNhNubj)}(hhh](j)}(hOint bitmap_allocate_region (unsigned long *bitmap, unsigned int pos, int order)h]j)}(hNint bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order)h](j )}(hinth]hint}(hjShhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjShhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjShhhjShMubj{)}(hbitmap_allocate_regionh]j)}(hbitmap_allocate_regionh]hbitmap_allocate_region}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjShhhjShMubj)}(h4(unsigned long *bitmap, unsigned int pos, int order)h](j)}(hunsigned long *bitmaph](j )}(hunsignedh]hunsigned}(hjShhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjSubj2)}(h h]h }(hj ThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj )}(hlongh]hlong}(hjThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjSubj2)}(h h]h }(hj'ThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hjh]h*}(hj5ThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj)}(hbitmaph]hbitmap}(hjBThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubj)}(hunsigned int posh](j )}(hunsignedh]hunsigned}(hj[ThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWTubj2)}(h h]h }(hjiThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWTubj )}(hinth]hint}(hjwThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWTubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWTubj)}(hposh]hpos}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubj)}(h int orderh](j )}(hinth]hint}(hjThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjTubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(horderh]horder}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubeh}(h]h ]h"]h$]h&]jjuh1jhjShhhjShMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjShhhjShMubah}(h]jSah ](jjeh"]h$]h&]jj)jhuh1jhjShMhjShhubj)}(hhh]h)}(hallocate bitmap regionh]hallocate bitmap region}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjThhubah}(h]h ]h"]h$]h&]uh1jhjShhhjShMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj Ujj Ujjjuh1jhhhjhNhNubj)}(hX**Parameters** ``unsigned long *bitmap`` array of unsigned longs corresponding to the bitmap ``unsigned int pos`` beginning of bit region to allocate ``int order`` region size (log base 2 of number of bits) to allocate **Description** Allocate (set bits in) a specified region of a bitmap. **Return** 0 on success, or ``-EBUSY`` if specified region wasn't free (not all bits were zero).h](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjUubj )}(hhh](j)}(hN``unsigned long *bitmap`` array of unsigned longs corresponding to the bitmap h](j)}(h``unsigned long *bitmap``h]j)}(hj3Uh]hunsigned long *bitmap}(hj5UhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1Uubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhj-Uubj2)}(hhh]h)}(h3array of unsigned longs corresponding to the bitmaph]h3array of unsigned longs corresponding to the bitmap}(hjLUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHUhMhjIUubah}(h]h ]h"]h$]h&]uh1j1hj-Uubeh}(h]h ]h"]h$]h&]uh1jhjHUhMhj*Uubj)}(h9``unsigned int pos`` beginning of bit region to allocate h](j)}(h``unsigned int pos``h]j)}(hjlUh]hunsigned int pos}(hjnUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjUubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjfUubj2)}(hhh]h)}(h#beginning of bit region to allocateh]h#beginning of bit region to allocate}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhMhjUubah}(h]h ]h"]h$]h&]uh1j1hjfUubeh}(h]h ]h"]h$]h&]uh1jhjUhMhj*Uubj)}(hE``int order`` region size (log base 2 of number of bits) to allocate h](j)}(h ``int order``h]j)}(hjUh]h int order}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjUubj2)}(hhh]h)}(h6region size (log base 2 of number of bits) to allocateh]h6region size (log base 2 of number of bits) to allocate}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhMhjUubah}(h]h ]h"]h$]h&]uh1j1hjUubeh}(h]h ]h"]h$]h&]uh1jhjUhMhj*Uubeh}(h]h ]h"]h$]h&]uh1j hjUubh)}(h**Description**h]j)}(hjUh]h Description}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjUubh)}(h6Allocate (set bits in) a specified region of a bitmap.h]h6Allocate (set bits in) a specified region of a bitmap.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjUubh)}(h **Return**h]j)}(hjVh]hReturn}(hj VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjUubh)}(hU0 on success, or ``-EBUSY`` if specified region wasn't free (not all bits were zero).h](h0 on success, or }(hjVhhhNhNubj)}(h ``-EBUSY``h]h-EBUSY}(hj%VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh< if specified region wasn’t free (not all bits were zero).}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $bitmap_find_free_region (C function)c.bitmap_find_free_regionhNtauh1hhjhhhNhNubj)}(hhh](j)}(hQint bitmap_find_free_region (unsigned long *bitmap, unsigned int bits, int order)h]j)}(hPint bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order)h](j )}(hinth]hint}(hj^VhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZVhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMubj2)}(h h]h }(hjmVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZVhhhjlVhMubj{)}(hbitmap_find_free_regionh]j)}(hbitmap_find_free_regionh]hbitmap_find_free_region}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{Vubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjZVhhhjlVhMubj)}(h5(unsigned long *bitmap, unsigned int bits, int order)h](j)}(hunsigned long *bitmaph](j )}(hunsignedh]hunsigned}(hjVhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjVubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubj )}(hlongh]hlong}(hjVhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjVubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubj)}(hjh]h*}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj)}(hbitmaph]hbitmap}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjVubj)}(hunsigned int bitsh](j )}(hunsignedh]hunsigned}(hjVhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjVubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubj )}(hinth]hint}(hjWhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjVubj2)}(h h]h }(hj#WhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubj)}(hbitsh]hbits}(hj1WhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjVubj)}(h int orderh](j )}(hinth]hint}(hjJWhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjFWubj2)}(h h]h }(hjXWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFWubj)}(horderh]horder}(hjfWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjVubeh}(h]h ]h"]h$]h&]jjuh1jhjZVhhhjlVhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjVVhhhjlVhMubah}(h]jQVah ](jjeh"]h$]h&]jj)jhuh1jhjlVhMhjSVhhubj)}(hhh]h)}(h$find a contiguous aligned mem regionh]h$find a contiguous aligned mem region}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjWhhubah}(h]h ]h"]h$]h&]uh1jhjSVhhhjlVhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjWjjWjjjuh1jhhhjhNhNubj)}(hX1**Parameters** ``unsigned long *bitmap`` array of unsigned longs corresponding to the bitmap ``unsigned int bits`` number of bits in the bitmap ``int order`` region size (log base 2 of number of bits) to find **Description** Find a region of free (zero) bits in a **bitmap** of **bits** bits and allocate them (set them to one). Only consider regions of length a power (**order**) of two, aligned to that power of two, which makes the search algorithm much faster. **Return** the bit offset in bitmap of the allocated region, or -errno on failure.h](h)}(h**Parameters**h]j)}(hjWh]h Parameters}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjWubj )}(hhh](j)}(hN``unsigned long *bitmap`` array of unsigned longs corresponding to the bitmap h](j)}(h``unsigned long *bitmap``h]j)}(hjWh]hunsigned long *bitmap}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjWubj2)}(hhh]h)}(h3array of unsigned longs corresponding to the bitmaph]h3array of unsigned longs corresponding to the bitmap}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMhjWubah}(h]h ]h"]h$]h&]uh1j1hjWubeh}(h]h ]h"]h$]h&]uh1jhjWhMhjWubj)}(h3``unsigned int bits`` number of bits in the bitmap h](j)}(h``unsigned int bits``h]j)}(hj Xh]hunsigned int bits}(hj XhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjXubj2)}(hhh]h)}(hnumber of bits in the bitmaph]hnumber of bits in the bitmap}(hj#XhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMhj Xubah}(h]h ]h"]h$]h&]uh1j1hjXubeh}(h]h ]h"]h$]h&]uh1jhjXhMhjWubj)}(hA``int order`` region size (log base 2 of number of bits) to find h](j)}(h ``int order``h]j)}(hjCXh]h int order}(hjEXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAXubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhj=Xubj2)}(hhh]h)}(h2region size (log base 2 of number of bits) to findh]h2region size (log base 2 of number of bits) to find}(hj\XhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXXhMhjYXubah}(h]h ]h"]h$]h&]uh1j1hj=Xubeh}(h]h ]h"]h$]h&]uh1jhjXXhMhjWubeh}(h]h ]h"]h$]h&]uh1j hjWubh)}(h**Description**h]j)}(hj~Xh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|Xubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjWubh)}(hFind a region of free (zero) bits in a **bitmap** of **bits** bits and allocate them (set them to one). Only consider regions of length a power (**order**) of two, aligned to that power of two, which makes the search algorithm much faster.h](h'Find a region of free (zero) bits in a }(hjXhhhNhNubj)}(h **bitmap**h]hbitmap}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh of }(hjXhhhNhNubj)}(h**bits**h]hbits}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubhU bits and allocate them (set them to one). Only consider regions of length a power (}(hjXhhhNhNubj)}(h **order**h]horder}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubhU) of two, aligned to that power of two, which makes the search algorithm much faster.}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjWubh)}(h **Return**h]j)}(hjXh]hReturn}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjWubh)}(hGthe bit offset in bitmap of the allocated region, or -errno on failure.h]hGthe bit offset in bitmap of the allocated region, or -errno on failure.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j BITMAP_FROM_U64 (C macro)c.BITMAP_FROM_U64hNtauh1hhjhhhNhNubj)}(hhh](j)}(hBITMAP_FROM_U64h]j)}(hBITMAP_FROM_U64h]j{)}(hBITMAP_FROM_U64h]j)}(hjYh]hBITMAP_FROM_U64}(hj$YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Yubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjYhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjYhhhj7YhMubah}(h]jYah ](jjeh"]h$]h&]jj)jhuh1jhj7YhMhjYhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjYhhhj7YhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjPYjjPYjjjuh1jhhhjhNhNubh)}(h``BITMAP_FROM_U64 (n)``h]j)}(hjVYh]hBITMAP_FROM_U64 (n)}(hjXYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTYubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjhhubj)}(h7Represent u64 value in the format suitable for bitmap. h]h)}(h6Represent u64 value in the format suitable for bitmap.h]h6Represent u64 value in the format suitable for bitmap.}(hjpYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjlYubah}(h]h ]h"]h$]h&]uh1jhj~YhMhjhhubj)}(hX**Parameters** ``n`` u64 value **Description** Linux bitmaps are internally arrays of unsigned longs, i.e. 32-bit integers in 32-bit environment, and 64-bit integers in 64-bit one. There are four combinations of endianness and length of the word in linux ABIs: LE64, BE64, LE32 and BE32. On 64-bit kernels 64-bit LE and BE numbers are naturally ordered in bitmaps and therefore don't require any special handling. On 32-bit kernels 32-bit LE ABI orders lo word of 64-bit number in memory prior to hi, and 32-bit BE orders hi word prior to lo. The bitmap on the other hand is represented as an array of 32-bit words and the position of bit N may therefore be calculated as: word #(N/32) and bit #(N``32``) in that word. For example, bit #42 is located at 10th position of 2nd word. It matches 32-bit LE ABI, and we can simply let the compiler store 64-bit values in memory as it usually does. But for BE we need to swap hi and lo words manually. With all that, the macro BITMAP_FROM_U64() does explicit reordering of hi and lo parts of u64. For LE32 it does nothing, and for BE environment it swaps hi and lo words, as is expected by bitmap.h](h)}(h**Parameters**h]j)}(hjYh]h Parameters}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjYubj )}(hhh]j)}(h``n`` u64 value h](j)}(h``n``h]j)}(hjYh]hn}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjYubj2)}(hhh]h)}(h u64 valueh]h u64 value}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMhjYubah}(h]h ]h"]h$]h&]uh1j1hjYubeh}(h]h ]h"]h$]h&]uh1jhjYhMhjYubah}(h]h ]h"]h$]h&]uh1j hjYubh)}(h**Description**h]j)}(hjYh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjYubh)}(hLinux bitmaps are internally arrays of unsigned longs, i.e. 32-bit integers in 32-bit environment, and 64-bit integers in 64-bit one.h]hLinux bitmaps are internally arrays of unsigned longs, i.e. 32-bit integers in 32-bit environment, and 64-bit integers in 64-bit one.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjYubh)}(hjThere are four combinations of endianness and length of the word in linux ABIs: LE64, BE64, LE32 and BE32.h]hjThere are four combinations of endianness and length of the word in linux ABIs: LE64, BE64, LE32 and BE32.}(hj ZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM hjYubh)}(h}On 64-bit kernels 64-bit LE and BE numbers are naturally ordered in bitmaps and therefore don't require any special handling.h]hOn 64-bit kernels 64-bit LE and BE numbers are naturally ordered in bitmaps and therefore don’t require any special handling.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM hjYubh)}(hXOn 32-bit kernels 32-bit LE ABI orders lo word of 64-bit number in memory prior to hi, and 32-bit BE orders hi word prior to lo. The bitmap on the other hand is represented as an array of 32-bit words and the position of bit N may therefore be calculated as: word #(N/32) and bit #(N``32``) in that word. For example, bit #42 is located at 10th position of 2nd word. It matches 32-bit LE ABI, and we can simply let the compiler store 64-bit values in memory as it usually does. But for BE we need to swap hi and lo words manually.h]hXOn 32-bit kernels 32-bit LE ABI orders lo word of 64-bit number in memory prior to hi, and 32-bit BE orders hi word prior to lo. The bitmap on the other hand is represented as an array of 32-bit words and the position of bit N may therefore be calculated as: word #(N/32) and bit #(N``32``) in that word. For example, bit #42 is located at 10th position of 2nd word. It matches 32-bit LE ABI, and we can simply let the compiler store 64-bit values in memory as it usually does. But for BE we need to swap hi and lo words manually.}(hj(ZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjYubh)}(hWith all that, the macro BITMAP_FROM_U64() does explicit reordering of hi and lo parts of u64. For LE32 it does nothing, and for BE environment it swaps hi and lo words, as is expected by bitmap.h]hWith all that, the macro BITMAP_FROM_U64() does explicit reordering of hi and lo parts of u64. For LE32 it does nothing, and for BE environment it swaps hi and lo words, as is expected by bitmap.}(hj7ZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMhjYubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_from_u64 (C function)c.bitmap_from_u64hNtauh1hhjhhhNhNubj)}(hhh](j)}(h3void bitmap_from_u64 (unsigned long *dst, u64 mask)h]j)}(h2void bitmap_from_u64(unsigned long *dst, u64 mask)h](j )}(hvoidh]hvoid}(hjfZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjbZhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM%ubj2)}(h h]h }(hjuZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbZhhhjtZhM%ubj{)}(hbitmap_from_u64h]j)}(hbitmap_from_u64h]hbitmap_from_u64}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjbZhhhjtZhM%ubj)}(h(unsigned long *dst, u64 mask)h](j)}(hunsigned long *dsth](j )}(hunsignedh]hunsigned}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj )}(hlongh]hlong}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hjh]h*}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hdsth]hdst}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hu64 maskh](h)}(hhh]j)}(hu64h]hu64}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj[modnameN classnameNj] j` )}jc ]jf )}jY jZsbc.bitmap_from_u64asbuh1hhjZubj2)}(h h]h }(hj$[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hmaskh]hmask}(hj2[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubeh}(h]h ]h"]h$]h&]jjuh1jhjbZhhhjtZhM%ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj^ZhhhjtZhM%ubah}(h]jYZah ](jjeh"]h$]h&]jj)jhuh1jhjtZhM%hj[Zhhubj)}(hhh]h)}(h Check and swap words within u64.h]h Check and swap words within u64.}(hj\[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM%hjY[hhubah}(h]h ]h"]h$]h&]uh1jhj[ZhhhjtZhM%ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjt[jjt[jjjuh1jhhhjhNhNubj)}(hXE**Parameters** ``unsigned long *dst`` destination bitmap ``u64 mask`` source bitmap **Description** In 32-bit Big Endian kernel, when using ``(u32 *)(:c:type:`val`)[*]`` to read u64 mask, we will get the wrong word. That is ``(u32 *)(:c:type:`val`)[0]`` gets the upper 32 bits, but we expect the lower 32-bits of u64.h](h)}(h**Parameters**h]j)}(hj~[h]h Parameters}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|[ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM)hjx[ubj )}(hhh](j)}(h*``unsigned long *dst`` destination bitmap h](j)}(h``unsigned long *dst``h]j)}(hj[h]hunsigned long *dst}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM'hj[ubj2)}(hhh]h)}(hdestination bitmaph]hdestination bitmap}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hM'hj[ubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhj[hM'hj[ubj)}(h``u64 mask`` source bitmap h](j)}(h ``u64 mask``h]j)}(hj[h]hu64 mask}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM&hj[ubj2)}(hhh]h)}(h source bitmaph]h source bitmap}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hM&hj[ubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhj[hM&hj[ubeh}(h]h ]h"]h$]h&]uh1j hjx[ubh)}(h**Description**h]j)}(hj\h]h Description}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM(hjx[ubh)}(hIn 32-bit Big Endian kernel, when using ``(u32 *)(:c:type:`val`)[*]`` to read u64 mask, we will get the wrong word. That is ``(u32 *)(:c:type:`val`)[0]`` gets the upper 32 bits, but we expect the lower 32-bits of u64.h](h(In 32-bit Big Endian kernel, when using }(hj'\hhhNhNubj)}(h``(u32 *)(:c:type:`val`)[*]``h]h(u32 *)(:c:type:`val`)[*]}(hj/\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'\ubh7 to read u64 mask, we will get the wrong word. That is }(hj'\hhhNhNubj)}(h``(u32 *)(:c:type:`val`)[0]``h]h(u32 *)(:c:type:`val`)[0]}(hjA\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'\ubh@ gets the upper 32 bits, but we expect the lower 32-bits of u64.}(hj'\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM(hjx[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_read (C function) c.bitmap_readhNtauh1hhjhhhNhNubj)}(hhh](j)}(h^unsigned long bitmap_read (const unsigned long *map, unsigned long start, unsigned long nbits)h]j)}(h]unsigned long bitmap_read(const unsigned long *map, unsigned long start, unsigned long nbits)h](j )}(hunsignedh]hunsigned}(hjz\hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjv\hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM4ubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjv\hhhj\hM4ubj )}(hlongh]hlong}(hj\hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjv\hhhj\hM4ubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjv\hhhj\hM4ubj{)}(h bitmap_readh]j)}(h bitmap_readh]h bitmap_read}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjv\hhhj\hM4ubj)}(hD(const unsigned long *map, unsigned long start, unsigned long nbits)h](j)}(hconst unsigned long *maph](j)}(hjh]hconst}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj )}(hunsignedh]hunsigned}(hj\hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj )}(hlongh]hlong}(hj ]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj)}(hjh]h*}(hj&]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hmaph]hmap}(hj3]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubj)}(hunsigned long starth](j )}(hunsignedh]hunsigned}(hjL]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjH]ubj2)}(h h]h }(hjZ]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjH]ubj )}(hlongh]hlong}(hjh]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjH]ubj2)}(h h]h }(hjv]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjH]ubj)}(hstarth]hstart}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubj)}(hunsigned long nbitsh](j )}(hunsignedh]hunsigned}(hj]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj )}(hlongh]hlong}(hj]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hnbitsh]hnbits}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubeh}(h]h ]h"]h$]h&]jjuh1jhjv\hhhj\hM4ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjr\hhhj\hM4ubah}(h]jm\ah ](jjeh"]h$]h&]jj)jhuh1jhj\hM4hjo\hhubj)}(hhh]h)}(h-read a value of n-bits from the memory regionh]h-read a value of n-bits from the memory region}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM4hj]hhubah}(h]h ]h"]h$]h&]uh1jhjo\hhhj\hM4ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj^jj^jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const unsigned long *map`` address to the bitmap memory region ``unsigned long start`` bit offset of the n-bit value ``unsigned long nbits`` size of value in bits, nonzero, up to BITS_PER_LONG **Return** value of **nbits** bits located at the **start** bit offset within the **map** memory region. For **nbits** = 0 and **nbits** > BITS_PER_LONG the return value is undefined.h](h)}(h**Parameters**h]j)}(hj!^h]h Parameters}(hj#^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM8hj^ubj )}(hhh](j)}(hA``const unsigned long *map`` address to the bitmap memory region h](j)}(h``const unsigned long *map``h]j)}(hj@^h]hconst unsigned long *map}(hjB^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>^ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM5hj:^ubj2)}(hhh]h)}(h#address to the bitmap memory regionh]h#address to the bitmap memory region}(hjY^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU^hM5hjV^ubah}(h]h ]h"]h$]h&]uh1j1hj:^ubeh}(h]h ]h"]h$]h&]uh1jhjU^hM5hj7^ubj)}(h6``unsigned long start`` bit offset of the n-bit value h](j)}(h``unsigned long start``h]j)}(hjy^h]hunsigned long start}(hj{^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw^ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM6hjs^ubj2)}(hhh]h)}(hbit offset of the n-bit valueh]hbit offset of the n-bit value}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM6hj^ubah}(h]h ]h"]h$]h&]uh1j1hjs^ubeh}(h]h ]h"]h$]h&]uh1jhj^hM6hj7^ubj)}(hL``unsigned long nbits`` size of value in bits, nonzero, up to BITS_PER_LONG h](j)}(h``unsigned long nbits``h]j)}(hj^h]hunsigned long nbits}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM7hj^ubj2)}(hhh]h)}(h3size of value in bits, nonzero, up to BITS_PER_LONGh]h3size of value in bits, nonzero, up to BITS_PER_LONG}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM7hj^ubah}(h]h ]h"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]uh1jhj^hM7hj7^ubeh}(h]h ]h"]h$]h&]uh1j hj^ubh)}(h **Return**h]j)}(hj^h]hReturn}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM9hj^ubh)}(hvalue of **nbits** bits located at the **start** bit offset within the **map** memory region. For **nbits** = 0 and **nbits** > BITS_PER_LONG the return value is undefined.h](h value of }(hj_hhhNhNubj)}(h **nbits**h]hnbits}(hj _hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh bits located at the }(hj_hhhNhNubj)}(h **start**h]hstart}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh bit offset within the }(hj_hhhNhNubj)}(h**map**h]hmap}(hj/_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh memory region. For }(hj_hhhNhNubj)}(h **nbits**h]hnbits}(hjA_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh = 0 and }(hj_hhhNhNubj)}(h **nbits**h]hnbits}(hjS_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh/ > BITS_PER_LONG the return value is undefined.}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM9hj^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bitmap_write (C function)c.bitmap_writehNtauh1hhjhhhNhNubj)}(hhh](j)}(hevoid bitmap_write (unsigned long *map, unsigned long value, unsigned long start, unsigned long nbits)h]j)}(hdvoid bitmap_write(unsigned long *map, unsigned long value, unsigned long start, unsigned long nbits)h](j )}(hvoidh]hvoid}(hj_hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj_hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMQubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_hhhj_hMQubj{)}(h bitmap_writeh]j)}(h bitmap_writeh]h bitmap_write}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj_hhhj_hMQubj)}(hS(unsigned long *map, unsigned long value, unsigned long start, unsigned long nbits)h](j)}(hunsigned long *maph](j )}(hunsignedh]hunsigned}(hj_hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj_ubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubj )}(hlongh]hlong}(hj_hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj_ubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubj)}(hjh]h*}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hmaph]hmap}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubj)}(hunsigned long valueh](j )}(hunsignedh]hunsigned}(hj'`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#`ubj2)}(h h]h }(hj5`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#`ubj )}(hlongh]hlong}(hjC`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#`ubj2)}(h h]h }(hjQ`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#`ubj)}(hvalueh]hvalue}(hj_`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubj)}(hunsigned long starth](j )}(hunsignedh]hunsigned}(hjx`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjt`ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjt`ubj )}(hlongh]hlong}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjt`ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjt`ubj)}(hstarth]hstart}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubj)}(hunsigned long nbitsh](j )}(hunsignedh]hunsigned}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj`ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubj )}(hlongh]hlong}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj`ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubj)}(hnbitsh]hnbits}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubeh}(h]h ]h"]h$]h&]jjuh1jhj_hhhj_hMQubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj_hhhj_hMQubah}(h]j_ah ](jjeh"]h$]h&]jj)jhuh1jhj_hMQhj_hhubj)}(hhh]h)}(h(write n-bit value within a memory regionh]h(write n-bit value within a memory region}(hj+ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMQhj(ahhubah}(h]h ]h"]h$]h&]uh1jhj_hhhj_hMQubeh}(h]h ](jfunctioneh"]h$]h&]jjjjCajjCajjjuh1jhhhjhNhNubj)}(hXG**Parameters** ``unsigned long *map`` address to the bitmap memory region ``unsigned long value`` value to write, clamped to nbits ``unsigned long start`` bit offset of the n-bit value ``unsigned long nbits`` size of value in bits, nonzero, up to BITS_PER_LONG. **Description** bitmap_write() behaves as-if implemented as **nbits** calls of __assign_bit(), i.e. bits beyond **nbits** are ignored: for (bit = 0; bit < nbits; bit++) __assign_bit(start + bit, bitmap, val & BIT(bit)); For **nbits** == 0 and **nbits** > BITS_PER_LONG no writes are performed.h](h)}(h**Parameters**h]j)}(hjMah]h Parameters}(hjOahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKaubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMUhjGaubj )}(hhh](j)}(h;``unsigned long *map`` address to the bitmap memory region h](j)}(h``unsigned long *map``h]j)}(hjlah]hunsigned long *map}(hjnahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjaubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMRhjfaubj2)}(hhh]h)}(h#address to the bitmap memory regionh]h#address to the bitmap memory region}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMRhjaubah}(h]h ]h"]h$]h&]uh1j1hjfaubeh}(h]h ]h"]h$]h&]uh1jhjahMRhjcaubj)}(h9``unsigned long value`` value to write, clamped to nbits h](j)}(h``unsigned long value``h]j)}(hjah]hunsigned long value}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMShjaubj2)}(hhh]h)}(h value to write, clamped to nbitsh]h value to write, clamped to nbits}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMShjaubah}(h]h ]h"]h$]h&]uh1j1hjaubeh}(h]h ]h"]h$]h&]uh1jhjahMShjcaubj)}(h6``unsigned long start`` bit offset of the n-bit value h](j)}(h``unsigned long start``h]j)}(hjah]hunsigned long start}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMThjaubj2)}(hhh]h)}(hbit offset of the n-bit valueh]hbit offset of the n-bit value}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMThjaubah}(h]h ]h"]h$]h&]uh1j1hjaubeh}(h]h ]h"]h$]h&]uh1jhjahMThjcaubj)}(hM``unsigned long nbits`` size of value in bits, nonzero, up to BITS_PER_LONG. h](j)}(h``unsigned long nbits``h]j)}(hjbh]hunsigned long nbits}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMUhjbubj2)}(hhh]h)}(h4size of value in bits, nonzero, up to BITS_PER_LONG.h]h4size of value in bits, nonzero, up to BITS_PER_LONG.}(hj0bhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,bhMUhj-bubah}(h]h ]h"]h$]h&]uh1j1hjbubeh}(h]h ]h"]h$]h&]uh1jhj,bhMUhjcaubeh}(h]h ]h"]h$]h&]uh1j hjGaubh)}(h**Description**h]j)}(hjRbh]h Description}(hjTbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPbubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMWhjGaubh)}(hvbitmap_write() behaves as-if implemented as **nbits** calls of __assign_bit(), i.e. bits beyond **nbits** are ignored:h](h,bitmap_write() behaves as-if implemented as }(hjhbhhhNhNubj)}(h **nbits**h]hnbits}(hjpbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhbubh+ calls of __assign_bit(), i.e. bits beyond }(hjhbhhhNhNubj)}(h **nbits**h]hnbits}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhbubh are ignored:}(hjhbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMVhjGaubj)}(h]for (bit = 0; bit < nbits; bit++) __assign_bit(start + bit, bitmap, val & BIT(bit)); h]j )}(hhh]j)}(hUfor (bit = 0; bit < nbits; bit++) __assign_bit(start + bit, bitmap, val & BIT(bit)); h](j)}(h!for (bit = 0; bit < nbits; bit++)h]h!for (bit = 0; bit < nbits; bit++)}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMZhjbubj2)}(hhh]h)}(h2__assign_bit(start + bit, bitmap, val & BIT(bit));h]h2__assign_bit(start + bit, bitmap, val & BIT(bit));}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMZhjbubah}(h]h ]h"]h$]h&]uh1j1hjbubeh}(h]h ]h"]h$]h&]uh1jhjbhMZhjbubah}(h]h ]h"]h$]h&]uh1j hjbubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhMYhjGaubh)}(hIFor **nbits** == 0 and **nbits** > BITS_PER_LONG no writes are performed.h](hFor }(hjbhhhNhNubj)}(h **nbits**h]hnbits}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh == 0 and }(hjbhhhNhNubj)}(h **nbits**h]hnbits}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh) > BITS_PER_LONG no writes are performed.}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:84: ./include/linux/bitmap.hhM\hjGaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]bitmap-operationsah ]h"]bitmap operationsah$]h&]uh1hhjhhhhhK@ubh)}(hhh](h)}(hCommand-line Parsingh]hCommand-line Parsing}(hj$chhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!chhhhhKXubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j get_option (C function) c.get_optionhNtauh1hhj!chhhNhNubj)}(hhh](j)}(h&int get_option (char **str, int *pint)h]j)}(h%int get_option(char **str, int *pint)h](j )}(hinth]hint}(hjKchhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjGchhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK$ubj2)}(h h]h }(hjZchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGchhhjYchK$ubj{)}(h get_optionh]j)}(h get_optionh]h get_option}(hjlchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhcubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjGchhhjYchK$ubj)}(h(char **str, int *pint)h](j)}(h char **strh](j )}(hcharh]hchar}(hjchhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjcubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hjh]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hjh]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hstrh]hstr}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubj)}(h int *pinth](j )}(hinth]hint}(hjchhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjcubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hjh]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hpinth]hpint}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubeh}(h]h ]h"]h$]h&]jjuh1jhjGchhhjYchK$ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjCchhhjYchK$ubah}(h]j>cah ](jjeh"]h$]h&]jj)jhuh1jhjYchK$hj@chhubj)}(hhh]h)}(h#Parse integer from an option stringh]h#Parse integer from an option string}(hj*dhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK$hj'dhhubah}(h]h ]h"]h$]h&]uh1jhj@chhhjYchK$ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjBdjjBdjjjuh1jhhhj!chNhNubj)}(hXT**Parameters** ``char **str`` option string ``int *pint`` (optional output) integer value parsed from **str** **Description** Read an int from an option string; if available accept a subsequent comma as well. When **pint** is NULL the function can be used as a validator of the current option in the string. Leading hyphen without integer is no integer case, but we consume it for the sake of simplification. **Return** 0 - no int in string 1 - int found, no subsequent comma 2 - int found including a subsequent comma 3 - hyphen found to denote a rangeh](h)}(h**Parameters**h]j)}(hjLdh]h Parameters}(hjNdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJdubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK(hjFdubj )}(hhh](j)}(h``char **str`` option string h](j)}(h``char **str``h]j)}(hjkdh]h char **str}(hjmdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjidubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK%hjedubj2)}(hhh]h)}(h option stringh]h option string}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhK%hjdubah}(h]h ]h"]h$]h&]uh1j1hjedubeh}(h]h ]h"]h$]h&]uh1jhjdhK%hjbdubj)}(hB``int *pint`` (optional output) integer value parsed from **str** h](j)}(h ``int *pint``h]j)}(hjdh]h int *pint}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK&hjdubj2)}(hhh]h)}(h3(optional output) integer value parsed from **str**h](h,(optional output) integer value parsed from }(hjdhhhNhNubj)}(h**str**h]hstr}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1hhjdhK&hjdubah}(h]h ]h"]h$]h&]uh1j1hjdubeh}(h]h ]h"]h$]h&]uh1jhjdhK&hjbdubeh}(h]h ]h"]h$]h&]uh1j hjFdubh)}(h**Description**h]j)}(hjdh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK(hjFdubj)}(hXRead an int from an option string; if available accept a subsequent comma as well. When **pint** is NULL the function can be used as a validator of the current option in the string. Leading hyphen without integer is no integer case, but we consume it for the sake of simplification. h](h)}(hRRead an int from an option string; if available accept a subsequent comma as well.h]hRRead an int from an option string; if available accept a subsequent comma as well.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK'hjeubh)}(hbWhen **pint** is NULL the function can be used as a validator of the current option in the string.h](hWhen }(hjehhhNhNubj)}(h**pint**h]hpint}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubhU is NULL the function can be used as a validator of the current option in the string.}(hjehhhNhNubeh}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK*hjeubh)}(hdLeading hyphen without integer is no integer case, but we consume it for the sake of simplification.h]hdLeading hyphen without integer is no integer case, but we consume it for the sake of simplification.}(hj7ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK.hjeubeh}(h]h ]h"]h$]h&]uh1jhjehK'hjFdubh)}(h **Return**h]j)}(hjNeh]hReturn}(hjPehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLeubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK1hjFdubh)}(h0 - no int in string 1 - int found, no subsequent comma 2 - int found including a subsequent comma 3 - hyphen found to denote a rangeh]h0 - no int in string 1 - int found, no subsequent comma 2 - int found including a subsequent comma 3 - hyphen found to denote a range}(hjdehhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK.hjFdubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj!chhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j get_options (C function) c.get_optionshNtauh1hhj!chhhNhNubj)}(hhh](j)}(h:char * get_options (const char *str, int nints, int *ints)h]j)}(h8char *get_options(const char *str, int nints, int *ints)h](j )}(hcharh]hchar}(hjehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjehhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKSubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjehhhjehKSubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjehhhjehKSubj{)}(h get_optionsh]j)}(h get_optionsh]h get_options}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjehhhjehKSubj)}(h'(const char *str, int nints, int *ints)h](j)}(hconst char *strh](j)}(hjh]hconst}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjeubj )}(hcharh]hchar}(hjehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjeubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjeubj)}(hjh]h*}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(hstrh]hstr}(hj!fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjeubj)}(h int nintsh](j )}(hinth]hint}(hj:fhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj6fubj2)}(h h]h }(hjHfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6fubj)}(hnintsh]hnints}(hjVfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6fubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjeubj)}(h int *intsh](j )}(hinth]hint}(hjofhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjkfubj2)}(h h]h }(hj}fhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkfubj)}(hjh]h*}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkfubj)}(hintsh]hints}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkfubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjeubeh}(h]h ]h"]h$]h&]jjuh1jhjehhhjehKSubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjehhhjehKSubah}(h]jeah ](jjeh"]h$]h&]jj)jhuh1jhjehKShjehhubj)}(hhh]h)}(h&Parse a string into a list of integersh]h&Parse a string into a list of integers}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKShjfhhubah}(h]h ]h"]h$]h&]uh1jhjehhhjehKSubeh}(h]h ](jfunctioneh"]h$]h&]jjjjfjjfjjjuh1jhhhj!chNhNubj)}(hX**Parameters** ``const char *str`` String to be parsed ``int nints`` size of integer array ``int *ints`` integer array (must have room for at least one element) **Description** This function parses a string containing a comma-separated list of integers, a hyphen-separated range of _positive_ integers, or a combination of both. The parse halts when the array is full, or when no more numbers can be retrieved from the string. When **nints** is 0, the function just validates the given **str** and returns the amount of parseable integers as described below. The first element is filled by the number of collected integers in the range. The rest is what was parsed from the **str**. Return value is the character in the string which caused the parse to end (typically a null terminator, if **str** is completely parseable).h](h)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKWhjfubj )}(hhh](j)}(h(``const char *str`` String to be parsed h](j)}(h``const char *str``h]j)}(hjgh]hconst char *str}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKThjfubj2)}(hhh]h)}(hString to be parsedh]hString to be parsed}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghKThjgubah}(h]h ]h"]h$]h&]uh1j1hjfubeh}(h]h ]h"]h$]h&]uh1jhjghKThjfubj)}(h$``int nints`` size of integer array h](j)}(h ``int nints``h]j)}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:gubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKUhj6gubj2)}(hhh]h)}(hsize of integer arrayh]hsize of integer array}(hjUghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQghKUhjRgubah}(h]h ]h"]h$]h&]uh1j1hj6gubeh}(h]h ]h"]h$]h&]uh1jhjQghKUhjfubj)}(hF``int *ints`` integer array (must have room for at least one element) h](j)}(h ``int *ints``h]j)}(hjugh]h int *ints}(hjwghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsgubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKVhjogubj2)}(hhh]h)}(h7integer array (must have room for at least one element)h]h7integer array (must have room for at least one element)}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghKVhjgubah}(h]h ]h"]h$]h&]uh1j1hjogubeh}(h]h ]h"]h$]h&]uh1jhjghKVhjfubeh}(h]h ]h"]h$]h&]uh1j hjfubh)}(h**Description**h]j)}(hjgh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKXhjfubj)}(hXThis function parses a string containing a comma-separated list of integers, a hyphen-separated range of _positive_ integers, or a combination of both. The parse halts when the array is full, or when no more numbers can be retrieved from the string. When **nints** is 0, the function just validates the given **str** and returns the amount of parseable integers as described below. The first element is filled by the number of collected integers in the range. The rest is what was parsed from the **str**. Return value is the character in the string which caused the parse to end (typically a null terminator, if **str** is completely parseable).h](h)}(hThis function parses a string containing a comma-separated list of integers, a hyphen-separated range of _positive_ integers, or a combination of both. The parse halts when the array is full, or when no more numbers can be retrieved from the string.h]hThis function parses a string containing a comma-separated list of integers, a hyphen-separated range of _positive_ integers, or a combination of both. The parse halts when the array is full, or when no more numbers can be retrieved from the string.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKWhjgubh)}(hWhen **nints** is 0, the function just validates the given **str** and returns the amount of parseable integers as described below.h](hWhen }(hjghhhNhNubj)}(h **nints**h]hnints}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubh- is 0, the function just validates the given }(hjghhhNhNubj)}(h**str**h]hstr}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubhA and returns the amount of parseable integers as described below.}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chK]hjgubh)}(h{The first element is filled by the number of collected integers in the range. The rest is what was parsed from the **str**.h](hsThe first element is filled by the number of collected integers in the range. The rest is what was parsed from the }(hj hhhhNhNubj)}(h**str**h]hstr}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hubh.}(hj hhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKahjgubh)}(hReturn value is the character in the string which caused the parse to end (typically a null terminator, if **str** is completely parseable).h](hkReturn value is the character in the string which caused the parse to end (typically a null terminator, if }(hj-hhhhNhNubj)}(h**str**h]hstr}(hj5hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-hubh is completely parseable).}(hj-hhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKdhjgubeh}(h]h ]h"]h$]h&]uh1jhjghKWhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj!chhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memparse (C function) c.memparsehNtauh1hhj!chhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjphhhhjhhKubj )}(hlongh]hlong}(hjhhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjphhhhjhhKubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjphhhhjhhKubj )}(hlongh]hlong}(hjhhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjphhhhjhhKubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjphhhhjhhKubj{)}(hmemparseh]j)}(hmemparseh]hmemparse}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjphhhhjhhKubj)}(h (const char *ptr, char **retptr)h](j)}(hconst char *ptrh](j)}(hjh]hconst}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhubj )}(hcharh]hchar}(hjihhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhubj)}(hjh]h*}(hj ihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj)}(hptrh]hptr}(hj-ihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubj)}(h char **retptrh](j )}(hcharh]hchar}(hjFihhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBiubj2)}(h h]h }(hjTihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBiubj)}(hjh]h*}(hjbihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBiubj)}(hjh]h*}(hjoihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBiubj)}(hretptrh]hretptr}(hj|ihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBiubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubeh}(h]h ]h"]h$]h&]jjuh1jhjphhhhjhhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjlhhhhjhhKubah}(h]jghah ](jjeh"]h$]h&]jj)jhuh1jhjhhKhjihhhubj)}(hhh]h)}(h.parse a string with mem suffixes into a numberh]h.parse a string with mem suffixes into a number}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKhjihhubah}(h]h ]h"]h$]h&]uh1jhjihhhhjhhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjijjijjjuh1jhhhj!chNhNubj)}(hX**Parameters** ``const char *ptr`` Where parse begins ``char **retptr`` (output) Optional pointer to next char after parse completes **Description** Parses a string into a number. The number stored at **ptr** is potentially suffixed with K, M, G, T, P, E. **Return** The value as recognized by simple_strtoull() multiplied by the value as specified by suffix, if any.h](h)}(h**Parameters**h]j)}(hjih]h Parameters}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKhjiubj )}(hhh](j)}(h'``const char *ptr`` Where parse begins h](j)}(h``const char *ptr``h]j)}(hjih]hconst char *ptr}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKhjiubj2)}(hhh]h)}(hWhere parse beginsh]hWhere parse begins}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihKhjiubah}(h]h ]h"]h$]h&]uh1j1hjiubeh}(h]h ]h"]h$]h&]uh1jhjihKhjiubj)}(hO``char **retptr`` (output) Optional pointer to next char after parse completes h](j)}(h``char **retptr``h]j)}(hj jh]h char **retptr}(hj"jhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKhjjubj2)}(hhh]h)}(h<(output) Optional pointer to next char after parse completesh]h<(output) Optional pointer to next char after parse completes}(hj9jhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5jhKhj6jubah}(h]h ]h"]h$]h&]uh1j1hjjubeh}(h]h ]h"]h$]h&]uh1jhj5jhKhjiubeh}(h]h ]h"]h$]h&]uh1j hjiubh)}(h**Description**h]j)}(hj[jh]h Description}(hj]jhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYjubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKhjiubj)}(hlParses a string into a number. The number stored at **ptr** is potentially suffixed with K, M, G, T, P, E. h]h)}(hkParses a string into a number. The number stored at **ptr** is potentially suffixed with K, M, G, T, P, E.h](h5Parses a string into a number. The number stored at }(hjujhhhNhNubj)}(h**ptr**h]hptr}(hj}jhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjujubh/ is potentially suffixed with K, M, G, T, P, E.}(hjujhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKhjqjubah}(h]h ]h"]h$]h&]uh1jhjjhKhjiubh)}(h **Return**h]j)}(hjjh]hReturn}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKhjiubh)}(hdThe value as recognized by simple_strtoull() multiplied by the value as specified by suffix, if any.h]hdThe value as recognized by simple_strtoull() multiplied by the value as specified by suffix, if any.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:90: ./lib/cmdline.chKhjiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj!chhhNhNubeh}(h]command-line-parsingah ]h"]command-line parsingah$]h&]uh1hhjhhhhhKXubh)}(hhh](h)}(hError Pointersh]hError Pointers}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhhhhhK^ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j IS_ERR_VALUE (C macro)c.IS_ERR_VALUEhNtauh1hhjjhhhNhNubj)}(hhh](j)}(h IS_ERR_VALUEh]j)}(h IS_ERR_VALUEh]j{)}(h IS_ERR_VALUEh]j)}(hjjh]h IS_ERR_VALUE}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjjhhhjkhKubah}(h]jjah ](jjeh"]h$]h&]jj)jhuh1jhjkhKhjjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjjhhhjkhKubeh}(h]h ](jmacroeh"]h$]h&]jjjj,kjj,kjjjuh1jhhhjjhNhNubh)}(h``IS_ERR_VALUE (x)``h]j)}(hj2kh]hIS_ERR_VALUE (x)}(hj4khhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0kubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKhjjhhubj)}(hDetect an error pointer. h]h)}(hDetect an error pointer.h]hDetect an error pointer.}(hjLkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKhjHkubah}(h]h ]h"]h$]h&]uh1jhjZkhKhjjhhubj)}(h**Parameters** ``x`` The pointer to check. **Description** Like IS_ERR(), but does not generate a compiler warning if result is unused.h](h)}(h**Parameters**h]j)}(hjgkh]h Parameters}(hjikhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjekubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKhjakubj )}(hhh]j)}(h``x`` The pointer to check. h](j)}(h``x``h]j)}(hjkh]hx}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKhjkubj2)}(hhh]h)}(hThe pointer to check.h]hThe pointer to check.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhKhjkubah}(h]h ]h"]h$]h&]uh1j1hjkubeh}(h]h ]h"]h$]h&]uh1jhjkhKhj}kubah}(h]h ]h"]h$]h&]uh1j hjakubh)}(h**Description**h]j)}(hjkh]h Description}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKhjakubh)}(hLLike IS_ERR(), but does not generate a compiler warning if result is unused.h]hLLike IS_ERR(), but does not generate a compiler warning if result is unused.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKhjakubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ERR_PTR (C function) c.ERR_PTRhNtauh1hhjjhhhNhNubj)}(hhh](j)}(hvoid * ERR_PTR (long error)h]j)}(hvoid *ERR_PTR(long error)h](j )}(hvoidh]hvoid}(hjlhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjlhhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlhhhjlhKubj)}(hjh]h*}(hj#lhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhjlhKubj{)}(hERR_PTRh]j)}(hERR_PTRh]hERR_PTR}(hj4lhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0lubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjlhhhjlhKubj)}(h (long error)h]j)}(h long errorh](j )}(hlongh]hlong}(hjPlhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLlubj2)}(h h]h }(hj^lhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLlubj)}(herrorh]herror}(hjllhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHlubah}(h]h ]h"]h$]h&]jjuh1jhjlhhhjlhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjkhhhjlhKubah}(h]jkah ](jjeh"]h$]h&]jj)jhuh1jhjlhKhjkhhubj)}(hhh]h)}(hCreate an error pointer.h]hCreate an error pointer.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKhjlhhubah}(h]h ]h"]h$]h&]uh1jhjkhhhjlhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjljjljjjuh1jhhhjjhNhNubj)}(hX**Parameters** ``long error`` A negative error code. **Description** Encodes **error** into a pointer value. Users should consider the result opaque and not assume anything about how the error is encoded. **Return** A pointer with **error** encoded within its value.h](h)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK#hjlubj )}(hhh]j)}(h&``long error`` A negative error code. h](j)}(h``long error``h]j)}(hjlh]h long error}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK hjlubj2)}(hhh]h)}(hA negative error code.h]hA negative error code.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhK hjlubah}(h]h ]h"]h$]h&]uh1j1hjlubeh}(h]h ]h"]h$]h&]uh1jhjlhK hjlubah}(h]h ]h"]h$]h&]uh1j hjlubh)}(h**Description**h]j)}(hjmh]h Description}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK"hjlubh)}(hEncodes **error** into a pointer value. Users should consider the result opaque and not assume anything about how the error is encoded.h](hEncodes }(hj(mhhhNhNubj)}(h **error**h]herror}(hj0mhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(mubhv into a pointer value. Users should consider the result opaque and not assume anything about how the error is encoded.}(hj(mhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK!hjlubh)}(h **Return**h]j)}(hjKmh]hReturn}(hjMmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjImubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK$hjlubh)}(h2A pointer with **error** encoded within its value.h](hA pointer with }(hjamhhhNhNubj)}(h **error**h]herror}(hjimhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjamubh encoded within its value.}(hjamhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK%hjlubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j INIT_ERR_PTR (C macro)c.INIT_ERR_PTRhNtauh1hhjjhhhNhNubj)}(hhh](j)}(h INIT_ERR_PTRh]j)}(h INIT_ERR_PTRh]j{)}(h INIT_ERR_PTRh]j)}(hjmh]h INIT_ERR_PTR}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjmhhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK-ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjmhhhjmhK-ubah}(h]jmah ](jjeh"]h$]h&]jj)jhuh1jhjmhK-hjmhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjmhhhjmhK-ubeh}(h]h ](jmacroeh"]h$]h&]jjjjmjjmjjjuh1jhhhjjhNhNubh)}(h``INIT_ERR_PTR (error)``h]j)}(hjmh]hINIT_ERR_PTR (error)}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK/hjjhhubj)}(hInit a const error pointer. h]h)}(hInit a const error pointer.h]hInit a const error pointer.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK-hjmubah}(h]h ]h"]h$]h&]uh1jhjnhK-hjjhhubj)}(h**Parameters** ``error`` A negative error code. **Description** Like ERR_PTR(), but usable to initialize static variables.h](h)}(h**Parameters**h]j)}(hj nh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj nubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK1hjnubj )}(hhh]j)}(h!``error`` A negative error code. h](j)}(h ``error``h]j)}(hj,nh]herror}(hj.nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*nubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK.hj&nubj2)}(hhh]h)}(hA negative error code.h]hA negative error code.}(hjEnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAnhK.hjBnubah}(h]h ]h"]h$]h&]uh1j1hj&nubeh}(h]h ]h"]h$]h&]uh1jhjAnhK.hj#nubah}(h]h ]h"]h$]h&]uh1j hjnubh)}(h**Description**h]j)}(hjgnh]h Description}(hjinhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjenubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK0hjnubh)}(h:Like ERR_PTR(), but usable to initialize static variables.h]h:Like ERR_PTR(), but usable to initialize static variables.}(hj}nhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK/hjnubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j PTR_ERR (C function) c.PTR_ERRhNtauh1hhjjhhhNhNubj)}(hhh](j)}(h&long PTR_ERR (__force const void *ptr)h]j)}(h%long PTR_ERR(__force const void *ptr)h](j )}(hlongh]hlong}(hjnhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnhhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK;ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnhhhjnhK;ubj{)}(hPTR_ERRh]j)}(hPTR_ERRh]hPTR_ERR}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnhhhjnhK;ubj)}(h(__force const void *ptr)h]j)}(h__force const void *ptrh](h__force}(hjnhhhNhNubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubj)}(hjh]hconst}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubj )}(hvoidh]hvoid}(hjohhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnubj2)}(h h]h }(hj$ohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubj)}(hjh]h*}(hj2ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(hptrh]hptr}(hj?ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnubah}(h]h ]h"]h$]h&]jjuh1jhjnhhhjnhK;ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjnhhhjnhK;ubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1jhjnhK;hjnhhubj)}(hhh]h)}(h-Extract the error code from an error pointer.h]h-Extract the error code from an error pointer.}(hjiohhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK;hjfohhubah}(h]h ]h"]h$]h&]uh1jhjnhhhjnhK;ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjojjojjjuh1jhhhjjhNhNubj)}(hk**Parameters** ``__force const void *ptr`` An error pointer. **Return** The error code within **ptr**.h](h)}(h**Parameters**h]j)}(hjoh]h Parameters}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK?hjoubj )}(hhh]j)}(h.``__force const void *ptr`` An error pointer. h](j)}(h``__force const void *ptr``h]j)}(hjoh]h__force const void *ptr}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKhjoubh)}(hThe error code within **ptr**.h](hThe error code within }(hjohhhNhNubj)}(h**ptr**h]hptr}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK=hjoubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j IS_ERR (C function)c.IS_ERRhNtauh1hhjjhhhNhNubj)}(hhh](j)}(h%bool IS_ERR (__force const void *ptr)h]j)}(h$bool IS_ERR(__force const void *ptr)h](j )}(hj8h]hbool}(hjah"]h$]h&]uh1j1hj8phhhjIphKHubj{)}(hIS_ERRh]j)}(hIS_ERRh]hIS_ERR}(hj\phhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXpubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj8phhhjIphKHubj)}(h(__force const void *ptr)h]j)}(h__force const void *ptrh](h__force}(hjtphhhNhNubj2)}(h h]h }(hj|phhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtpubj)}(hjh]hconst}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtpubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtpubj )}(hvoidh]hvoid}(hjphhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjtpubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtpubj)}(hjh]h*}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtpubj)}(hptrh]hptr}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtpubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjppubah}(h]h ]h"]h$]h&]jjuh1jhj8phhhjIphKHubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj4phhhjIphKHubah}(h]j/pah ](jjeh"]h$]h&]jj)jhuh1jhjIphKHhj1phhubj)}(hhh]h)}(hDetect an error pointer.h]hDetect an error pointer.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKHhjphhubah}(h]h ]h"]h$]h&]uh1jhj1phhhjIphKHubeh}(h]h ](jfunctioneh"]h$]h&]jjjjqjjqjjjuh1jhhhjjhNhNubj)}(h**Parameters** ``__force const void *ptr`` The pointer to check. **Return** true if **ptr** is an error pointer, false otherwise.h](h)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKLhjqubj )}(hhh]j)}(h2``__force const void *ptr`` The pointer to check. h](j)}(h``__force const void *ptr``h]j)}(hj9qh]h__force const void *ptr}(hj;qhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7qubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKIhj3qubj2)}(hhh]h)}(hThe pointer to check.h]hThe pointer to check.}(hjRqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNqhKIhjOqubah}(h]h ]h"]h$]h&]uh1j1hj3qubeh}(h]h ]h"]h$]h&]uh1jhjNqhKIhj0qubah}(h]h ]h"]h$]h&]uh1j hjqubh)}(h **Return**h]j)}(hjtqh]hReturn}(hjvqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrqubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKKhjqubh)}(h5true if **ptr** is an error pointer, false otherwise.h](htrue if }(hjqhhhNhNubj)}(h**ptr**h]hptr}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh& is an error pointer, false otherwise.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKJhjqubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j IS_ERR_OR_NULL (C function)c.IS_ERR_OR_NULLhNtauh1hhjjhhhNhNubj)}(hhh](j)}(h-bool IS_ERR_OR_NULL (__force const void *ptr)h]j)}(h,bool IS_ERR_OR_NULL(__force const void *ptr)h](j )}(hj8h]hbool}(hjqhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjqhhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKUubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqhhhjqhKUubj{)}(hIS_ERR_OR_NULLh]j)}(hIS_ERR_OR_NULLh]hIS_ERR_OR_NULL}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjqhhhjqhKUubj)}(h(__force const void *ptr)h]j)}(h__force const void *ptrh](h__force}(hjrhhhNhNubj2)}(h h]h }(hj rhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hjh]hconst}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj2)}(h h]h }(hj&rhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj )}(hvoidh]hvoid}(hj4rhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjBrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hjh]h*}(hjPrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hptrh]hptr}(hj]rhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjqubah}(h]h ]h"]h$]h&]jjuh1jhjqhhhjqhKUubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjqhhhjqhKUubah}(h]jqah ](jjeh"]h$]h&]jj)jhuh1jhjqhKUhjqhhubj)}(hhh]h)}(h*Detect an error pointer or a null pointer.h]h*Detect an error pointer or a null pointer.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKUhjrhhubah}(h]h ]h"]h$]h&]uh1jhjqhhhjqhKUubeh}(h]h ](jfunctioneh"]h$]h&]jjjjrjjrjjjuh1jhhhjjhNhNubj)}(h**Parameters** ``__force const void *ptr`` The pointer to check. **Description** Like IS_ERR(), but also returns true for a null pointer.h](h)}(h**Parameters**h]j)}(hjrh]h Parameters}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKYhjrubj )}(hhh]j)}(h2``__force const void *ptr`` The pointer to check. h](j)}(h``__force const void *ptr``h]j)}(hjrh]h__force const void *ptr}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKVhjrubj2)}(hhh]h)}(hThe pointer to check.h]hThe pointer to check.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhKVhjrubah}(h]h ]h"]h$]h&]uh1j1hjrubeh}(h]h ]h"]h$]h&]uh1jhjrhKVhjrubah}(h]h ]h"]h$]h&]uh1j hjrubh)}(h**Description**h]j)}(hjsh]h Description}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKXhjrubh)}(h8Like IS_ERR(), but also returns true for a null pointer.h]h8Like IS_ERR(), but also returns true for a null pointer.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKWhjrubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ERR_CAST (C function) c.ERR_CASThNtauh1hhjjhhhNhNubj)}(hhh](j)}(h)void * ERR_CAST (__force const void *ptr)h]j)}(h'void *ERR_CAST(__force const void *ptr)h](j )}(hvoidh]hvoid}(hjHshhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjDshhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK`ubj2)}(h h]h }(hjWshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDshhhjVshK`ubj)}(hjh]h*}(hjeshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDshhhjVshK`ubj{)}(hERR_CASTh]j)}(hERR_CASTh]hERR_CAST}(hjvshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrsubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjDshhhjVshK`ubj)}(h(__force const void *ptr)h]j)}(h__force const void *ptrh](h__force}(hjshhhNhNubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjsubj)}(hjh]hconst}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjsubj )}(hvoidh]hvoid}(hjshhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjsubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjsubj)}(hjh]h*}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj)}(hptrh]hptr}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjsubah}(h]h ]h"]h$]h&]jjuh1jhjDshhhjVshK`ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj@shhhjVshK`ubah}(h]j;sah ](jjeh"]h$]h&]jj)jhuh1jhjVshK`hj=shhubj)}(hhh]h)}(h?Explicitly cast an error-valued pointer to another pointer typeh]h?Explicitly cast an error-valued pointer to another pointer type}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK`hjthhubah}(h]h ]h"]h$]h&]uh1jhj=shhhjVshK`ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj*tjj*tjjjuh1jhhhjjhNhNubj)}(h**Parameters** ``__force const void *ptr`` The pointer to cast. **Description** Explicitly cast an error-valued pointer to another pointer type in such a way as to make it clear that's what's going on.h](h)}(h**Parameters**h]j)}(hj4th]h Parameters}(hj6thhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2tubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKdhj.tubj )}(hhh]j)}(h1``__force const void *ptr`` The pointer to cast. h](j)}(h``__force const void *ptr``h]j)}(hjSth]h__force const void *ptr}(hjUthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQtubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKahjMtubj2)}(hhh]h)}(hThe pointer to cast.h]hThe pointer to cast.}(hjlthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhthKahjitubah}(h]h ]h"]h$]h&]uh1j1hjMtubeh}(h]h ]h"]h$]h&]uh1jhjhthKahjJtubah}(h]h ]h"]h$]h&]uh1j hj.tubh)}(h**Description**h]j)}(hjth]h Description}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKchj.tubh)}(hyExplicitly cast an error-valued pointer to another pointer type in such a way as to make it clear that's what's going on.h]h}Explicitly cast an error-valued pointer to another pointer type in such a way as to make it clear that’s what’s going on.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKbhj.tubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j PTR_ERR_OR_ZERO (C function)c.PTR_ERR_OR_ZEROhNtauh1hhjjhhhNhNubj)}(hhh](j)}(h-int PTR_ERR_OR_ZERO (__force const void *ptr)h]j)}(h,int PTR_ERR_OR_ZERO(__force const void *ptr)h](j )}(hinth]hint}(hjthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjthhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKmubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjthhhjthKmubj{)}(hPTR_ERR_OR_ZEROh]j)}(hPTR_ERR_OR_ZEROh]hPTR_ERR_OR_ZERO}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjthhhjthKmubj)}(h(__force const void *ptr)h]j)}(h__force const void *ptrh](h__force}(hj uhhhNhNubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj uubj)}(hjh]hconst}(hj"uhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj uubj2)}(h h]h }(hj/uhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj uubj )}(hvoidh]hvoid}(hj=uhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj uubj2)}(h h]h }(hjKuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj uubj)}(hjh]h*}(hjYuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj uubj)}(hptrh]hptr}(hjfuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj uubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjuubah}(h]h ]h"]h$]h&]jjuh1jhjthhhjthKmubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjthhhjthKmubah}(h]jtah ](jjeh"]h$]h&]jj)jhuh1jhjthKmhjthhubj)}(hhh]h)}(h4Extract the error code from a pointer if it has one.h]h4Extract the error code from a pointer if it has one.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKmhjuhhubah}(h]h ]h"]h$]h&]uh1jhjthhhjthKmubeh}(h]h ](jfunctioneh"]h$]h&]jjjjujjujjjuh1jhhhjjhNhNubj)}(hX**Parameters** ``__force const void *ptr`` A potential error pointer. **Description** Convenience function that can be used inside a function that returns an error code to propagate errors received as error pointers. For example, ``return PTR_ERR_OR_ZERO(ptr);`` replaces: .. code-block:: c if (IS_ERR(ptr)) return PTR_ERR(ptr); else return 0; **Return** The error code within **ptr** if it is an error pointer; 0 otherwise.h](h)}(h**Parameters**h]j)}(hjuh]h Parameters}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKqhjuubj )}(hhh]j)}(h7``__force const void *ptr`` A potential error pointer. h](j)}(h``__force const void *ptr``h]j)}(hjuh]h__force const void *ptr}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKnhjuubj2)}(hhh]h)}(hA potential error pointer.h]hA potential error pointer.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhKnhjuubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjuhKnhjuubah}(h]h ]h"]h$]h&]uh1j hjuubh)}(h**Description**h]j)}(hj vh]h Description}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj vubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKphjuubh)}(hConvenience function that can be used inside a function that returns an error code to propagate errors received as error pointers. For example, ``return PTR_ERR_OR_ZERO(ptr);`` replaces:h](hConvenience function that can be used inside a function that returns an error code to propagate errors received as error pointers. For example, }(hj"vhhhNhNubj)}(h ``return PTR_ERR_OR_ZERO(ptr);``h]hreturn PTR_ERR_OR_ZERO(ptr);}(hj*vhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"vubh replaces:}(hj"vhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKohjuubj7C)}(hDif (IS_ERR(ptr)) return PTR_ERR(ptr); else return 0;h]hDif (IS_ERR(ptr)) return PTR_ERR(ptr); else return 0;}hjCvsbah}(h]h ]h"]h$]h&]jjforcelanguagejhighlight_args}uh1j6ChW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKshjuubh)}(h **Return**h]j)}(hjXvh]hReturn}(hjZvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVvubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhKzhjuubh)}(hEThe error code within **ptr** if it is an error pointer; 0 otherwise.h](hThe error code within }(hjnvhhhNhNubj)}(h**ptr**h]hptr}(hjvvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnvubh( if it is an error pointer; 0 otherwise.}(hjnvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:96: ./include/linux/err.hhK{hjuubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjjhhhNhNubeh}(h]error-pointersah ]h"]error pointersah$]h&]uh1hhjhhhhhK^ubh)}(hhh](h)}(hSortingh]hSorting}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhhhhhKdubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j sort_r (C function)c.sort_rhNtauh1hhjvhhhNhNubj)}(hhh](j)}(hsvoid sort_r (void *base, size_t num, size_t size, cmp_r_func_t cmp_func, swap_r_func_t swap_func, const void *priv)h]j)}(hrvoid sort_r(void *base, size_t num, size_t size, cmp_r_func_t cmp_func, swap_r_func_t swap_func, const void *priv)h](j )}(hvoidh]hvoid}(hjvhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjvhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvhhhjvhMubj{)}(hsort_rh]j)}(hsort_rh]hsort_r}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjvhhhjvhMubj)}(hg(void *base, size_t num, size_t size, cmp_r_func_t cmp_func, swap_r_func_t swap_func, const void *priv)h](j)}(h void *baseh](j )}(hvoidh]hvoid}(hjwhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjwubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubj)}(hjh]h*}(hj!whhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hbaseh]hbase}(hj.whhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubj)}(h size_t numh](h)}(hhh]j)}(hsize_th]hsize_t}(hjJwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGwubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjLwmodnameN classnameNj] j` )}jc ]jf )}jY jvsbc.sort_rasbuh1hhjCwubj2)}(h h]h }(hjjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCwubj)}(hnumh]hnum}(hjxwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjwmodnameN classnameNj] j` )}jc ]jfwc.sort_rasbuh1hhjwubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubj)}(hsizeh]hsize}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubj)}(hcmp_r_func_t cmp_funch](h)}(hhh]j)}(h cmp_r_func_th]h cmp_r_func_t}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjwmodnameN classnameNj] j` )}jc ]jfwc.sort_rasbuh1hhjwubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubj)}(hcmp_funch]hcmp_func}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubj)}(hswap_r_func_t swap_funch](h)}(hhh]j)}(h swap_r_func_th]h swap_r_func_t}(hj$xhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!xubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj&xmodnameN classnameNj] j` )}jc ]jfwc.sort_rasbuh1hhjxubj2)}(h h]h }(hjBxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubj)}(h swap_funch]h swap_func}(hjPxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubj)}(hconst void *privh](j)}(hjh]hconst}(hjixhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjexubj2)}(h h]h }(hjvxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjexubj )}(hvoidh]hvoid}(hjxhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjexubj2)}(h h]h }(hjxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjexubj)}(hjh]h*}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjexubj)}(hprivh]hpriv}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjexubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubeh}(h]h ]h"]h$]h&]jjuh1jhjvhhhjvhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjvhhhjvhMubah}(h]jvah ](jjeh"]h$]h&]jj)jhuh1jhjvhMhjvhhubj)}(hhh]h)}(hsort an array of elementsh]hsort an array of elements}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMhjxhhubah}(h]h ]h"]h$]h&]uh1jhjvhhhjvhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjxjjxjjjuh1jhhhjvhNhNubj)}(hX`**Parameters** ``void *base`` pointer to data to sort ``size_t num`` number of elements ``size_t size`` size of each element ``cmp_r_func_t cmp_func`` pointer to comparison function ``swap_r_func_t swap_func`` pointer to swap function or NULL ``const void *priv`` third argument passed to comparison function **Description** This function does a heapsort on the given array. You may provide a swap_func function if you need to do something more than a memory copy (e.g. fix up pointers or auxiliary data), but the built-in swap avoids a slow retpoline and so is significantly faster. The comparison function must adhere to specific mathematical properties to ensure correct and stable sorting: - Antisymmetry: cmp_func(a, b) must return the opposite sign of cmp_func(b, a). - Transitivity: if cmp_func(a, b) <= 0 and cmp_func(b, c) <= 0, then cmp_func(a, c) <= 0. Sorting time is O(n log n) both on average and worst-case. While quicksort is slightly faster on average, it suffers from exploitable O(n*n) worst-case behavior and extra memory requirements that make it less suitable for kernel use.h](h)}(h**Parameters**h]j)}(hjxh]h Parameters}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMhjxubj )}(hhh](j)}(h'``void *base`` pointer to data to sort h](j)}(h``void *base``h]j)}(hjyh]h void *base}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMhjyubj2)}(hhh]h)}(hpointer to data to sorth]hpointer to data to sort}(hj1yhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-yhMhj.yubah}(h]h ]h"]h$]h&]uh1j1hjyubeh}(h]h ]h"]h$]h&]uh1jhj-yhMhjyubj)}(h"``size_t num`` number of elements h](j)}(h``size_t num``h]j)}(hjQyh]h size_t num}(hjSyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOyubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMhjKyubj2)}(hhh]h)}(hnumber of elementsh]hnumber of elements}(hjjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfyhMhjgyubah}(h]h ]h"]h$]h&]uh1j1hjKyubeh}(h]h ]h"]h$]h&]uh1jhjfyhMhjyubj)}(h%``size_t size`` size of each element h](j)}(h``size_t size``h]j)}(hjyh]h size_t size}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMhjyubj2)}(hhh]h)}(hsize of each elementh]hsize of each element}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhMhjyubah}(h]h ]h"]h$]h&]uh1j1hjyubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjyubj)}(h9``cmp_r_func_t cmp_func`` pointer to comparison function h](j)}(h``cmp_r_func_t cmp_func``h]j)}(hjyh]hcmp_r_func_t cmp_func}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMhjyubj2)}(hhh]h)}(hpointer to comparison functionh]hpointer to comparison function}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhMhjyubah}(h]h ]h"]h$]h&]uh1j1hjyubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjyubj)}(h=``swap_r_func_t swap_func`` pointer to swap function or NULL h](j)}(h``swap_r_func_t swap_func``h]j)}(hjyh]hswap_r_func_t swap_func}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMhjyubj2)}(hhh]h)}(h pointer to swap function or NULLh]h pointer to swap function or NULL}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhMhjzubah}(h]h ]h"]h$]h&]uh1j1hjyubeh}(h]h ]h"]h$]h&]uh1jhjzhMhjyubj)}(hB``const void *priv`` third argument passed to comparison function h](j)}(h``const void *priv``h]j)}(hj5zh]hconst void *priv}(hj7zhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3zubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMhj/zubj2)}(hhh]h)}(h,third argument passed to comparison functionh]h,third argument passed to comparison function}(hjNzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJzhMhjKzubah}(h]h ]h"]h$]h&]uh1j1hj/zubeh}(h]h ]h"]h$]h&]uh1jhjJzhMhjyubeh}(h]h ]h"]h$]h&]uh1j hjxubh)}(h**Description**h]j)}(hjpzh]h Description}(hjrzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnzubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMhjxubh)}(hXThis function does a heapsort on the given array. You may provide a swap_func function if you need to do something more than a memory copy (e.g. fix up pointers or auxiliary data), but the built-in swap avoids a slow retpoline and so is significantly faster.h]hXThis function does a heapsort on the given array. You may provide a swap_func function if you need to do something more than a memory copy (e.g. fix up pointers or auxiliary data), but the built-in swap avoids a slow retpoline and so is significantly faster.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMhjxubh)}(hXThe comparison function must adhere to specific mathematical properties to ensure correct and stable sorting: - Antisymmetry: cmp_func(a, b) must return the opposite sign of cmp_func(b, a). - Transitivity: if cmp_func(a, b) <= 0 and cmp_func(b, c) <= 0, then cmp_func(a, c) <= 0.h]hXThe comparison function must adhere to specific mathematical properties to ensure correct and stable sorting: - Antisymmetry: cmp_func(a, b) must return the opposite sign of cmp_func(b, a). - Transitivity: if cmp_func(a, b) <= 0 and cmp_func(b, c) <= 0, then cmp_func(a, c) <= 0.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM"hjxubh)}(hSorting time is O(n log n) both on average and worst-case. While quicksort is slightly faster on average, it suffers from exploitable O(n*n) worst-case behavior and extra memory requirements that make it less suitable for kernel use.h]hSorting time is O(n log n) both on average and worst-case. While quicksort is slightly faster on average, it suffers from exploitable O(n*n) worst-case behavior and extra memory requirements that make it less suitable for kernel use.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM)hjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjvhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j sort_r_nonatomic (C function)c.sort_r_nonatomichNtauh1hhjvhhhNhNubj)}(hhh](j)}(h}void sort_r_nonatomic (void *base, size_t num, size_t size, cmp_r_func_t cmp_func, swap_r_func_t swap_func, const void *priv)h]j)}(h|void sort_r_nonatomic(void *base, size_t num, size_t size, cmp_r_func_t cmp_func, swap_r_func_t swap_func, const void *priv)h](j )}(hvoidh]hvoid}(hjzhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjzhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM9ubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjzhhhjzhM9ubj{)}(hsort_r_nonatomich]j)}(hsort_r_nonatomich]hsort_r_nonatomic}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjzhhhjzhM9ubj)}(hg(void *base, size_t num, size_t size, cmp_r_func_t cmp_func, swap_r_func_t swap_func, const void *priv)h](j)}(h void *baseh](j )}(hvoidh]hvoid}(hj{hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj {ubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj {ubj)}(hjh]h*}(hj,{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj {ubj)}(hbaseh]hbase}(hj9{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj {ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubj)}(h size_t numh](h)}(hhh]j)}(hsize_th]hsize_t}(hjU{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR{ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjW{modnameN classnameNj] j` )}jc ]jf )}jY jzsbc.sort_r_nonatomicasbuh1hhjN{ubj2)}(h h]h }(hju{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjN{ubj)}(hnumh]hnum}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{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&] refdomainjreftypejY reftargetj{modnameN classnameNj] j` )}jc ]jq{c.sort_r_nonatomicasbuh1hhj{ubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubj)}(hsizeh]hsize}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubj)}(hcmp_r_func_t cmp_funch](h)}(hhh]j)}(h cmp_r_func_th]h cmp_r_func_t}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj{modnameN classnameNj] j` )}jc ]jq{c.sort_r_nonatomicasbuh1hhj{ubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubj)}(hcmp_funch]hcmp_func}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubj)}(hswap_r_func_t swap_funch](h)}(hhh]j)}(h swap_r_func_th]h swap_r_func_t}(hj/|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,|ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj1|modnameN classnameNj] j` )}jc ]jq{c.sort_r_nonatomicasbuh1hhj(|ubj2)}(h h]h }(hjM|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(|ubj)}(h swap_funch]h swap_func}(hj[|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(|ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubj)}(hconst void *privh](j)}(hjh]hconst}(hjt|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp|ubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjp|ubj )}(hvoidh]hvoid}(hj|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjp|ubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjp|ubj)}(hjh]h*}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp|ubj)}(hprivh]hpriv}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp|ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubeh}(h]h ]h"]h$]h&]jjuh1jhjzhhhjzhM9ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjzhhhjzhM9ubah}(h]jzah ](jjeh"]h$]h&]jj)jhuh1jhjzhM9hjzhhubj)}(hhh]h)}(h,sort an array of elements, with cond_reschedh]h,sort an array of elements, with cond_resched}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM9hj|hhubah}(h]h ]h"]h$]h&]uh1jhjzhhhjzhM9ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj|jj|jjjuh1jhhhjvhNhNubj)}(hX**Parameters** ``void *base`` pointer to data to sort ``size_t num`` number of elements ``size_t size`` size of each element ``cmp_r_func_t cmp_func`` pointer to comparison function ``swap_r_func_t swap_func`` pointer to swap function or NULL ``const void *priv`` third argument passed to comparison function **Description** Same as sort_r, but preferred for larger arrays as it does a periodic cond_resched().h](h)}(h**Parameters**h]j)}(hj}h]h Parameters}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM=hj|ubj )}(hhh](j)}(h'``void *base`` pointer to data to sort h](j)}(h``void *base``h]j)}(hj#}h]h void *base}(hj%}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!}ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM:hj}ubj2)}(hhh]h)}(hpointer to data to sorth]hpointer to data to sort}(hj<}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8}hM:hj9}ubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhj8}hM:hj}ubj)}(h"``size_t num`` number of elements h](j)}(h``size_t num``h]j)}(hj\}h]h size_t num}(hj^}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ}ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM;hjV}ubj2)}(hhh]h)}(hnumber of elementsh]hnumber of elements}(hju}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjq}hM;hjr}ubah}(h]h ]h"]h$]h&]uh1j1hjV}ubeh}(h]h ]h"]h$]h&]uh1jhjq}hM;hj}ubj)}(h%``size_t size`` size of each element h](j)}(h``size_t size``h]j)}(hj}h]h size_t size}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM<hj}ubj2)}(hhh]h)}(hsize of each elementh]hsize of each element}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hM<hj}ubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhj}hM<hj}ubj)}(h9``cmp_r_func_t cmp_func`` pointer to comparison function h](j)}(h``cmp_r_func_t cmp_func``h]j)}(hj}h]hcmp_r_func_t cmp_func}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM=hj}ubj2)}(hhh]h)}(hpointer to comparison functionh]hpointer to comparison function}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hM=hj}ubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhj}hM=hj}ubj)}(h=``swap_r_func_t swap_func`` pointer to swap function or NULL h](j)}(h``swap_r_func_t swap_func``h]j)}(hj~h]hswap_r_func_t swap_func}(hj ~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM>hj~ubj2)}(hhh]h)}(h pointer to swap function or NULLh]h pointer to swap function or NULL}(hj ~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hM>hj~ubah}(h]h ]h"]h$]h&]uh1j1hj~ubeh}(h]h ]h"]h$]h&]uh1jhj~hM>hj}ubj)}(hB``const void *priv`` third argument passed to comparison function h](j)}(h``const void *priv``h]j)}(hj@~h]hconst void *priv}(hjB~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>~ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM?hj:~ubj2)}(hhh]h)}(h,third argument passed to comparison functionh]h,third argument passed to comparison function}(hjY~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU~hM?hjV~ubah}(h]h ]h"]h$]h&]uh1j1hj:~ubeh}(h]h ]h"]h$]h&]uh1jhjU~hM?hj}ubeh}(h]h ]h"]h$]h&]uh1j hj|ubh)}(h**Description**h]j)}(hj{~h]h Description}(hj}~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjy~ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chMAhj|ubh)}(hUSame as sort_r, but preferred for larger arrays as it does a periodic cond_resched().h]hUSame as sort_r, but preferred for larger arrays as it does a periodic cond_resched().}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:102: ./lib/sort.chM@hj|ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjvhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j list_sort (C function) c.list_sorthNtauh1hhjvhhhNhNubj)}(hhh](j)}(hHvoid list_sort (void *priv, struct list_head *head, list_cmp_func_t cmp)h]j)}(hGvoid list_sort(void *priv, struct list_head *head, list_cmp_func_t cmp)h](j )}(hvoidh]hvoid}(hj~hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~hhhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKYubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~hhhj~hKYubj{)}(h list_sorth]j)}(h list_sorth]h list_sort}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj~hhhj~hKYubj)}(h9(void *priv, struct list_head *head, list_cmp_func_t cmp)h](j)}(h void *privh](j )}(hvoidh]hvoid}(hj~hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj)}(hprivh]hpriv}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~ubj)}(hstruct list_head *headh](j)}(hstructh]hstruct}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;ubh)}(hhh]j)}(h list_headh]h list_head}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj`modnameN classnameNj] j` )}jc ]jf )}jY j~sb c.list_sortasbuh1hhj;ubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(hheadh]hhead}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~ubj)}(hlist_cmp_func_t cmph](h)}(hhh]j)}(hlist_cmp_func_th]hlist_cmp_func_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jz c.list_sortasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcmph]hcmp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~ubeh}(h]h ]h"]h$]h&]jjuh1jhj~hhhj~hKYubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj~hhhj~hKYubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhj~hKYhj~hhubj)}(hhh]h)}(h sort a listh]h sort a list}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKYhjhhubah}(h]h ]h"]h$]h&]uh1jhj~hhhj~hKYubeh}(h]h ](jfunctioneh"]h$]h&]jjjj#jj#jjjuh1jhhhjvhNhNubj)}(hX**Parameters** ``void *priv`` private data, opaque to list_sort(), passed to **cmp** ``struct list_head *head`` the list to sort ``list_cmp_func_t cmp`` the elements comparison function **Description** The comparison function **cmp** must return > 0 if **a** should sort after **b** ("**a** > **b**" if you want an ascending sort), and <= 0 if **a** should sort before **b** *or* their original order should be preserved. It is always called with the element that came first in the input in **a**, and list_sort is a stable sort, so it is not necessary to distinguish the **a** < **b** and **a** == **b** cases. The comparison function must adhere to specific mathematical properties to ensure correct and stable sorting: - Antisymmetry: cmp(**a**, **b**) must return the opposite sign of cmp(**b**, **a**). - Transitivity: if cmp(**a**, **b**) <= 0 and cmp(**b**, **c**) <= 0, then cmp(**a**, **c**) <= 0. This is compatible with two styles of **cmp** function: - The traditional style which returns <0 / =0 / >0, or - Returning a boolean 0/1. The latter offers a chance to save a few cycles in the comparison (which is used by e.g. plug_ctx_cmp() in block/blk-mq.c). A good way to write a multi-word comparison is:: if (a->high != b->high) return a->high > b->high; if (a->middle != b->middle) return a->middle > b->middle; return a->low > b->low; This mergesort is as eager as possible while always performing at least 2:1 balanced merges. Given two pending sublists of size 2^k, they are merged to a size-2^(k+1) list as soon as we have 2^k following elements. Thus, it will avoid cache thrashing as long as 3*2^k elements can fit into the cache. Not quite as good as a fully-eager bottom-up mergesort, but it does use 0.2*n fewer comparisons, so is faster in the common case that everything fits into L1. The merging is controlled by "count", the number of elements in the pending lists. This is beautifully simple code, but rather subtle. Each time we increment "count", we set one bit (bit k) and clear bits k-1 .. 0. Each time this happens (except the very first time for each bit, when count increments to 2^k), we merge two lists of size 2^k into one list of size 2^(k+1). This merge happens exactly when the count reaches an odd multiple of 2^k, which is when we have 2^k elements pending in smaller lists, so it's safe to merge away two lists of size 2^k. After this happens twice, we have created two lists of size 2^(k+1), which will be merged into a list of size 2^(k+2) before we create a third list of size 2^(k+1), so there are never more than two pending. The number of pending lists of size 2^k is determined by the state of bit k of "count" plus two extra pieces of information: - The state of bit k-1 (when k == 0, consider bit -1 always set), and - Whether the higher-order bits are zero or non-zero (i.e. is count >= 2^(k+1)). There are six states we distinguish. "x" represents some arbitrary bits, and "y" represents some arbitrary non-zero bits: 0: 00x: 0 pending of size 2^k; x pending of sizes < 2^k 1: 01x: 0 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k 2: x10x: 0 pending of size 2^k; 2^k + x pending of sizes < 2^k 3: x11x: 1 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k 4: y00x: 1 pending of size 2^k; 2^k + x pending of sizes < 2^k 5: y01x: 2 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k (merge and loop back to state 2) We gain lists of size 2^k in the 2->3 and 4->5 transitions (because bit k-1 is set while the more significant bits are non-zero) and merge them away in the 5->2 transition. Note in particular that just before the 5->2 transition, all lower-order bits are 11 (state 3), so there is one list of each smaller size. When we reach the end of the input, we merge all the pending lists, from smallest to largest. If you work through cases 2 to 5 above, you can see that the number of elements we merge with a list of size 2^k varies from 2^(k-1) (cases 3 and 5 when x == 0) to 2^(k+1) - 1 (second merge of case 5 when x == 2^(k-1) - 1).h](h)}(h**Parameters**h]j)}(hj-h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chK]hj'ubj )}(hhh](j)}(hF``void *priv`` private data, opaque to list_sort(), passed to **cmp** h](j)}(h``void *priv``h]j)}(hjLh]h void *priv}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKZhjFubj2)}(hhh]h)}(h6private data, opaque to list_sort(), passed to **cmp**h](h/private data, opaque to list_sort(), passed to }(hjehhhNhNubj)}(h**cmp**h]hcmp}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1hhjahKZhjbubah}(h]h ]h"]h$]h&]uh1j1hjFubeh}(h]h ]h"]h$]h&]uh1jhjahKZhjCubj)}(h,``struct list_head *head`` the list to sort h](j)}(h``struct list_head *head``h]j)}(hjh]hstruct list_head *head}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chK[hjubj2)}(hhh]h)}(hthe list to sorth]hthe list to sort}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK[hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK[hjCubj)}(h9``list_cmp_func_t cmp`` the elements comparison function h](j)}(h``list_cmp_func_t cmp``h]j)}(hj̀h]hlist_cmp_func_t cmp}(hj΀hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjʀubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chK\hjƀubj2)}(hhh]h)}(h the elements comparison functionh]h the elements comparison function}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK\hjubah}(h]h ]h"]h$]h&]uh1j1hjƀubeh}(h]h ]h"]h$]h&]uh1jhjhK\hjCubeh}(h]h ]h"]h$]h&]uh1j hj'ubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chK^hj'ubh)}(hXThe comparison function **cmp** must return > 0 if **a** should sort after **b** ("**a** > **b**" if you want an ascending sort), and <= 0 if **a** should sort before **b** *or* their original order should be preserved. It is always called with the element that came first in the input in **a**, and list_sort is a stable sort, so it is not necessary to distinguish the **a** < **b** and **a** == **b** cases.h](hThe comparison function }(hjhhhNhNubj)}(h**cmp**h]hcmp}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh must return > 0 if }(hjhhhNhNubj)}(h**a**h]ha}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh should sort after }(hjhhhNhNubj)}(h**b**h]hb}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh (”}(hjhhhNhNubj)}(h**a**h]ha}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh > }(hjhhhNhNubj)}(h**b**h]hb}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh0” if you want an ascending sort), and <= 0 if }(hjhhhNhNubj)}(h**a**h]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh should sort before }(hjhhhNhNubj)}(h**b**h]hb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh }(hjhhhNhNubhemphasis)}(h*or*h]hor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhq their original order should be preserved. It is always called with the element that came first in the input in }(hjhhhNhNubj)}(h**a**h]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhL, and list_sort is a stable sort, so it is not necessary to distinguish the }(hjhhhNhNubj)}(h**a**h]ha}(hjɁhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh < }(hjhhhNhNubj)}(h**b**h]hb}(hjہhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**a**h]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh == }(hjhhhNhNubj)}(h**b**h]hb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh cases.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chK]hj'ubh)}(hX&The comparison function must adhere to specific mathematical properties to ensure correct and stable sorting: - Antisymmetry: cmp(**a**, **b**) must return the opposite sign of cmp(**b**, **a**). - Transitivity: if cmp(**a**, **b**) <= 0 and cmp(**b**, **c**) <= 0, then cmp(**a**, **c**) <= 0.h](hThe comparison function must adhere to specific mathematical properties to ensure correct and stable sorting: - Antisymmetry: cmp(}(hjhhhNhNubj)}(h**a**h]ha}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(h**b**h]hb}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh') must return the opposite sign of cmp(}(hjhhhNhNubj)}(h**b**h]hb}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }hjsbj)}(h**a**h]ha}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh). - Transitivity: if cmp(}(hjhhhNhNubj)}(h**a**h]ha}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }hjsbj)}(h**b**h]hb}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) <= 0 and cmp(}(hjhhhNhNubj)}(h**b**h]hb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }hjsbj)}(h**c**h]hc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) <= 0, then cmp(}(hjhhhNhNubj)}(h**a**h]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }hjsbj)}(h**c**h]hc}(hj‚hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) <= 0.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKdhj'ubh)}(hXThis is compatible with two styles of **cmp** function: - The traditional style which returns <0 / =0 / >0, or - Returning a boolean 0/1. The latter offers a chance to save a few cycles in the comparison (which is used by e.g. plug_ctx_cmp() in block/blk-mq.c).h](h&This is compatible with two styles of }(hjۂhhhNhNubj)}(h**cmp**h]hcmp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjۂubh function: - The traditional style which returns <0 / =0 / >0, or - Returning a boolean 0/1. The latter offers a chance to save a few cycles in the comparison (which is used by e.g. plug_ctx_cmp() in block/blk-mq.c).}(hjۂhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKkhj'ubh)}(h0A good way to write a multi-word comparison is::h]h/A good way to write a multi-word comparison is:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKqhj'ubj7C)}(hif (a->high != b->high) return a->high > b->high; if (a->middle != b->middle) return a->middle > b->middle; return a->low > b->low;h]hif (a->high != b->high) return a->high > b->high; if (a->middle != b->middle) return a->middle > b->middle; return a->low > b->low;}hj sbah}(h]h ]h"]h$]h&]jjuh1j6ChT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKshj'ubh)}(hThis mergesort is as eager as possible while always performing at least 2:1 balanced merges. Given two pending sublists of size 2^k, they are merged to a size-2^(k+1) list as soon as we have 2^k following elements.h]hThis mergesort is as eager as possible while always performing at least 2:1 balanced merges. Given two pending sublists of size 2^k, they are merged to a size-2^(k+1) list as soon as we have 2^k following elements.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKzhj'ubh)}(hThus, it will avoid cache thrashing as long as 3*2^k elements can fit into the cache. Not quite as good as a fully-eager bottom-up mergesort, but it does use 0.2*n fewer comparisons, so is faster in the common case that everything fits into L1.h]hThus, it will avoid cache thrashing as long as 3*2^k elements can fit into the cache. Not quite as good as a fully-eager bottom-up mergesort, but it does use 0.2*n fewer comparisons, so is faster in the common case that everything fits into L1.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chK~hj'ubh)}(hThe merging is controlled by "count", the number of elements in the pending lists. This is beautifully simple code, but rather subtle.h]hThe merging is controlled by “count”, the number of elements in the pending lists. This is beautifully simple code, but rather subtle.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKhj'ubh)}(hEach time we increment "count", we set one bit (bit k) and clear bits k-1 .. 0. Each time this happens (except the very first time for each bit, when count increments to 2^k), we merge two lists of size 2^k into one list of size 2^(k+1).h]hEach time we increment “count”, we set one bit (bit k) and clear bits k-1 .. 0. Each time this happens (except the very first time for each bit, when count increments to 2^k), we merge two lists of size 2^k into one list of size 2^(k+1).}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKhj'ubh)}(hThis merge happens exactly when the count reaches an odd multiple of 2^k, which is when we have 2^k elements pending in smaller lists, so it's safe to merge away two lists of size 2^k.h]hThis merge happens exactly when the count reaches an odd multiple of 2^k, which is when we have 2^k elements pending in smaller lists, so it’s safe to merge away two lists of size 2^k.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKhj'ubh)}(hAfter this happens twice, we have created two lists of size 2^(k+1), which will be merged into a list of size 2^(k+2) before we create a third list of size 2^(k+1), so there are never more than two pending.h]hAfter this happens twice, we have created two lists of size 2^(k+1), which will be merged into a list of size 2^(k+2) before we create a third list of size 2^(k+1), so there are never more than two pending.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKhj'ubh)}(h|The number of pending lists of size 2^k is determined by the state of bit k of "count" plus two extra pieces of information:h]hThe number of pending lists of size 2^k is determined by the state of bit k of “count” plus two extra pieces of information:}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKhj'ubj)}(hhh](j)}(hCThe state of bit k-1 (when k == 0, consider bit -1 always set), andh]h)}(hjh]hCThe state of bit k-1 (when k == 0, consider bit -1 always set), and}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hOWhether the higher-order bits are zero or non-zero (i.e. is count >= 2^(k+1)). h]h)}(hNWhether the higher-order bits are zero or non-zero (i.e. is count >= 2^(k+1)).h]hNWhether the higher-order bits are zero or non-zero (i.e. is count >= 2^(k+1)).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhKhj'ubh)}(hX-There are six states we distinguish. "x" represents some arbitrary bits, and "y" represents some arbitrary non-zero bits: 0: 00x: 0 pending of size 2^k; x pending of sizes < 2^k 1: 01x: 0 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k 2: x10x: 0 pending of size 2^k; 2^k + x pending of sizes < 2^k 3: x11x: 1 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k 4: y00x: 1 pending of size 2^k; 2^k + x pending of sizes < 2^k 5: y01x: 2 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k (merge and loop back to state 2)h]hX5There are six states we distinguish. “x” represents some arbitrary bits, and “y” represents some arbitrary non-zero bits: 0: 00x: 0 pending of size 2^k; x pending of sizes < 2^k 1: 01x: 0 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k 2: x10x: 0 pending of size 2^k; 2^k + x pending of sizes < 2^k 3: x11x: 1 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k 4: y00x: 1 pending of size 2^k; 2^k + x pending of sizes < 2^k 5: y01x: 2 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k (merge and loop back to state 2)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKhj'ubh)}(hX8We gain lists of size 2^k in the 2->3 and 4->5 transitions (because bit k-1 is set while the more significant bits are non-zero) and merge them away in the 5->2 transition. Note in particular that just before the 5->2 transition, all lower-order bits are 11 (state 3), so there is one list of each smaller size.h]hX8We gain lists of size 2^k in the 2->3 and 4->5 transitions (because bit k-1 is set while the more significant bits are non-zero) and merge them away in the 5->2 transition. Note in particular that just before the 5->2 transition, all lower-order bits are 11 (state 3), so there is one list of each smaller size.}(hj̃hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKhj'ubh)}(hX>When we reach the end of the input, we merge all the pending lists, from smallest to largest. If you work through cases 2 to 5 above, you can see that the number of elements we merge with a list of size 2^k varies from 2^(k-1) (cases 3 and 5 when x == 0) to 2^(k+1) - 1 (second merge of case 5 when x == 2^(k-1) - 1).h]hX>When we reach the end of the input, we merge all the pending lists, from smallest to largest. If you work through cases 2 to 5 above, you can see that the number of elements we merge with a list of size 2^k varies from 2^(k-1) (cases 3 and 5 when x == 0) to 2^(k+1) - 1 (second merge of case 5 when x == 2^(k-1) - 1).}(hjۃhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:105: ./lib/list_sort.chKhj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjvhhhNhNubeh}(h]sortingah ]h"]sortingah$]h&]uh1hhjhhhhhKdubh)}(hhh](h)}(hText Searchingh]hText Searching}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKmubh)}(h INTRODUCTIONh]h INTRODUCTION}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:111: ./lib/textsearch.chK hjhhubj)}(hThe textsearch infrastructure provides text searching facilities for both linear and non-linear data. Individual search algorithms are implemented in modules and chosen by the user. h]h)}(hThe textsearch infrastructure provides text searching facilities for both linear and non-linear data. Individual search algorithms are implemented in modules and chosen by the user.h]hThe textsearch infrastructure provides text searching facilities for both linear and non-linear data. Individual search algorithms are implemented in modules and chosen by the user.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:111: ./lib/textsearch.chKhjubah}(h]h ]h"]h$]h&]uh1jhj+hKhjhhubh)}(h ARCHITECTUREh]h ARCHITECTURE}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:111: ./lib/textsearch.chKhjhhubj7C)}(hX User +----------------+ | finish()|<--------------(6)-----------------+ |get_next_block()|<--------------(5)---------------+ | | | Algorithm | | | | +------------------------------+ | | | init() find() destroy() | | | +------------------------------+ | | Core API ^ ^ ^ | | +---------------+ (2) (4) (8) | (1)|----->| prepare() |---+ | | | (3)|----->| find()/next() |-----------+ | | (7)|----->| destroy() |----------------------+ +----------------+ +---------------+ (1) User configures a search by calling textsearch_prepare() specifying the search parameters such as the pattern and algorithm name. (2) Core requests the algorithm to allocate and initialize a search configuration according to the specified parameters. (3) User starts the search(es) by calling textsearch_find() or textsearch_next() to fetch subsequent occurrences. A state variable is provided to the algorithm to store persistent variables. (4) Core eventually resets the search offset and forwards the find() request to the algorithm. (5) Algorithm calls get_next_block() provided by the user continuously to fetch the data to be searched in block by block. (6) Algorithm invokes finish() after the last call to get_next_block to clean up any leftovers from get_next_block. (Optional) (7) User destroys the configuration by calling textsearch_destroy(). (8) Core notifies the algorithm to destroy algorithm specific allocations. (Optional)h]hX User +----------------+ | finish()|<--------------(6)-----------------+ |get_next_block()|<--------------(5)---------------+ | | | Algorithm | | | | +------------------------------+ | | | init() find() destroy() | | | +------------------------------+ | | Core API ^ ^ ^ | | +---------------+ (2) (4) (8) | (1)|----->| prepare() |---+ | | | (3)|----->| find()/next() |-----------+ | | (7)|----->| destroy() |----------------------+ +----------------+ +---------------+ (1) User configures a search by calling textsearch_prepare() specifying the search parameters such as the pattern and algorithm name. (2) Core requests the algorithm to allocate and initialize a search configuration according to the specified parameters. (3) User starts the search(es) by calling textsearch_find() or textsearch_next() to fetch subsequent occurrences. A state variable is provided to the algorithm to store persistent variables. (4) Core eventually resets the search offset and forwards the find() request to the algorithm. (5) Algorithm calls get_next_block() provided by the user continuously to fetch the data to be searched in block by block. (6) Algorithm invokes finish() after the last call to get_next_block to clean up any leftovers from get_next_block. (Optional) (7) User destroys the configuration by calling textsearch_destroy(). (8) Core notifies the algorithm to destroy algorithm specific allocations. (Optional)}hjAsbah}(h]h ]h"]h$]h&]jjjQvjRvnonejSv}uh1j6ChU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:111: ./lib/textsearch.chKhjhhubh)}(hUSAGEh]hUSAGE}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:111: ./lib/textsearch.chK6hjhhubj)}(hXBefore a search can be performed, a configuration must be created by calling textsearch_prepare() specifying the searching algorithm, the pattern to look for and flags. As a flag, you can set TS_IGNORECASE to perform case insensitive matching. But it might slow down performance of algorithm, so you should use it at own your risk. The returned configuration may then be used for an arbitrary amount of times and even in parallel as long as a separate struct ts_state variable is provided to every instance. The actual search is performed by either calling textsearch_find_continuous() for linear data or by providing an own get_next_block() implementation and calling textsearch_find(). Both functions return the position of the first occurrence of the pattern or UINT_MAX if no match was found. Subsequent occurrences can be found by calling textsearch_next() regardless of the linearity of the data. Once you're done using a configuration it must be given back via textsearch_destroy. h](h)}(hXBefore a search can be performed, a configuration must be created by calling textsearch_prepare() specifying the searching algorithm, the pattern to look for and flags. As a flag, you can set TS_IGNORECASE to perform case insensitive matching. But it might slow down performance of algorithm, so you should use it at own your risk. The returned configuration may then be used for an arbitrary amount of times and even in parallel as long as a separate struct ts_state variable is provided to every instance.h]hXBefore a search can be performed, a configuration must be created by calling textsearch_prepare() specifying the searching algorithm, the pattern to look for and flags. As a flag, you can set TS_IGNORECASE to perform case insensitive matching. But it might slow down performance of algorithm, so you should use it at own your risk. The returned configuration may then be used for an arbitrary amount of times and even in parallel as long as a separate struct ts_state variable is provided to every instance.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:111: ./lib/textsearch.chK8hjaubh)}(hXThe actual search is performed by either calling textsearch_find_continuous() for linear data or by providing an own get_next_block() implementation and calling textsearch_find(). Both functions return the position of the first occurrence of the pattern or UINT_MAX if no match was found. Subsequent occurrences can be found by calling textsearch_next() regardless of the linearity of the data.h]hXThe actual search is performed by either calling textsearch_find_continuous() for linear data or by providing an own get_next_block() implementation and calling textsearch_find(). Both functions return the position of the first occurrence of the pattern or UINT_MAX if no match was found. Subsequent occurrences can be found by calling textsearch_next() regardless of the linearity of the data.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:111: ./lib/textsearch.chKAhjaubh)}(hTOnce you're done using a configuration it must be given back via textsearch_destroy.h]hVOnce you’re done using a configuration it must be given back via textsearch_destroy.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:111: ./lib/textsearch.chKIhjaubeh}(h]h ]h"]h$]h&]uh1jhjshK8hjhhubh)}(h EXAMPLE::h]hEXAMPLE:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:111: ./lib/textsearch.chKLhjhhubj7C)}(hXint pos; struct ts_config *conf; struct ts_state state; const char *pattern = "chicken"; const char *example = "We dance the funky chicken"; conf = textsearch_prepare("kmp", pattern, strlen(pattern), GFP_KERNEL, TS_AUTOLOAD); if (IS_ERR(conf)) { err = PTR_ERR(conf); goto errout; } pos = textsearch_find_continuous(conf, &state, example, strlen(example)); if (pos != UINT_MAX) panic("Oh my god, dancing chickens at %d\n", pos); textsearch_destroy(conf);h]hXint pos; struct ts_config *conf; struct ts_state state; const char *pattern = "chicken"; const char *example = "We dance the funky chicken"; conf = textsearch_prepare("kmp", pattern, strlen(pattern), GFP_KERNEL, TS_AUTOLOAD); if (IS_ERR(conf)) { err = PTR_ERR(conf); goto errout; } pos = textsearch_find_continuous(conf, &state, example, strlen(example)); if (pos != UINT_MAX) panic("Oh my god, dancing chickens at %d\n", pos); textsearch_destroy(conf);}hjsbah}(h]h ]h"]h$]h&]jjuh1j6ChU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:111: ./lib/textsearch.chKNhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  textsearch_register (C function)c.textsearch_registerhNtauh1hhjhhhNhNubj)}(hhh](j)}(h,int textsearch_register (struct ts_ops *ops)h]j)}(h+int textsearch_register(struct ts_ops *ops)h](j )}(hinth]hint}(hjτhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj˄hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKubj2)}(h h]h }(hjބhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj˄hhhj݄hKubj{)}(htextsearch_registerh]j)}(htextsearch_registerh]htextsearch_register}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj˄hhhj݄hKubj)}(h(struct ts_ops *ops)h]j)}(hstruct ts_ops *opsh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hts_opsh]hts_ops}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj,modnameN classnameNj] j` )}jc ]jf )}jY jsbc.textsearch_registerasbuh1hhjubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hopsh]hops}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhj˄hhhj݄hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjDŽhhhj݄hKubah}(h]j„ah ](jjeh"]h$]h&]jj)jhuh1jhj݄hKhjĄhhubj)}(hhh]h)}(hregister a textsearch moduleh]hregister a textsearch module}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjĄhhhj݄hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct ts_ops *ops`` operations lookup table **Description** This function must be called by textsearch modules to announce their presence. The specified &**ops** must have ``name`` set to a unique identifier and the callbacks find(), init(), get_pattern(), and get_pattern_len() must be implemented. Returns 0 or -EEXISTS if another module has already registered with same name.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjubj )}(hhh]j)}(h/``struct ts_ops *ops`` operations lookup table h](j)}(h``struct ts_ops *ops``h]j)}(hjЅh]hstruct ts_ops *ops}(hj҅hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj΅ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjʅubj2)}(hhh]h)}(hoperations lookup tableh]hoperations lookup table}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjʅubeh}(h]h ]h"]h$]h&]uh1jhjhKhjDžubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjubh)}(hThis function must be called by textsearch modules to announce their presence. The specified &**ops** must have ``name`` set to a unique identifier and the callbacks find(), init(), get_pattern(), and get_pattern_len() must be implemented.h](hpThis function must be called by textsearch modules to announce their presence. The specified &**ops** must have }(hj!hhhNhNubj)}(h``name``h]hname}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubhw set to a unique identifier and the callbacks find(), init(), get_pattern(), and get_pattern_len() must be implemented.}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjubh)}(hNReturns 0 or -EEXISTS if another module has already registered with same name.h]hNReturns 0 or -EEXISTS if another module has already registered with same name.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "textsearch_unregister (C function)c.textsearch_unregisterhNtauh1hhjhhhNhNubj)}(hhh](j)}(h.int textsearch_unregister (struct ts_ops *ops)h]j)}(h-int textsearch_unregister(struct ts_ops *ops)h](j )}(hinth]hint}(hjqhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjmhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjmhhhjhKubj{)}(htextsearch_unregisterh]j)}(htextsearch_unregisterh]htextsearch_unregister}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjmhhhjhKubj)}(h(struct ts_ops *ops)h]j)}(hstruct ts_ops *opsh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hts_opsh]hts_ops}(hj̆hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɆubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjΆmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.textsearch_unregisterasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hopsh]hops}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjmhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjihhhjhKubah}(h]jdah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjfhhubj)}(hhh]h)}(hunregister a textsearch moduleh]hunregister a textsearch module}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhj.hhubah}(h]h ]h"]h$]h&]uh1jhjfhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjIjjIjjjuh1jhhhjhNhNubj)}(hXu**Parameters** ``struct ts_ops *ops`` operations lookup table **Description** This function must be called by textsearch modules to announce their disappearance for examples when the module gets unloaded. The :c:type:`ops` parameter must be the same as the one during the registration. Returns 0 on success or -ENOENT if no matching textsearch registration was found.h](h)}(h**Parameters**h]j)}(hjSh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjMubj )}(hhh]j)}(h/``struct ts_ops *ops`` operations lookup table h](j)}(h``struct ts_ops *ops``h]j)}(hjrh]hstruct ts_ops *ops}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjlubj2)}(hhh]h)}(hoperations lookup tableh]hoperations lookup table}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjlubeh}(h]h ]h"]h$]h&]uh1jhjhKhjiubah}(h]h ]h"]h$]h&]uh1j hjMubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjMubh)}(hThis function must be called by textsearch modules to announce their disappearance for examples when the module gets unloaded. The :c:type:`ops` parameter must be the same as the one during the registration.h](hThis function must be called by textsearch modules to announce their disappearance for examples when the module gets unloaded. The }(hjÇhhhNhNubh)}(h :c:type:`ops`h]j)}(hj͇h]hops}(hjχhhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1jhjˇubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] j` )}jc ]sb reftargetopsuh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjÇubh? parameter must be the same as the one during the registration.}(hjÇhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjMubh)}(hQReturns 0 on success or -ENOENT if no matching textsearch registration was found.h]hQReturns 0 on success or -ENOENT if no matching textsearch registration was found.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'textsearch_find_continuous (C function)c.textsearch_find_continuoushNtauh1hhjhhhNhNubj)}(hhh](j)}(h|unsigned int textsearch_find_continuous (struct ts_config *conf, struct ts_state *state, const void *data, unsigned int len)h]j)}(h{unsigned int textsearch_find_continuous(struct ts_config *conf, struct ts_state *state, const void *data, unsigned int len)h](j )}(hunsignedh]hunsigned}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj%hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%hhhj7hKubj )}(hinth]hint}(hjFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj%hhhj7hKubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%hhhj7hKubj{)}(htextsearch_find_continuoush]j)}(htextsearch_find_continuoush]htextsearch_find_continuous}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj%hhhj7hKubj)}(hT(struct ts_config *conf, struct ts_state *state, const void *data, unsigned int len)h](j)}(hstruct ts_config *confh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubh)}(hhh]j)}(h ts_configh]h ts_config}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jhsbc.textsearch_find_continuousasbuh1hhj~ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubj)}(hjh]h*}(hjΈhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj)}(hconfh]hconf}(hjۈhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjzubj)}(hstruct ts_state *stateh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hts_stateh]hts_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.textsearch_find_continuousasbuh1hhjubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hstateh]hstate}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjzubj)}(hconst void *datah](j)}(hjh]hconst}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubj )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj`ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hdatah]hdata}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjzubj)}(hunsigned int lenh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjωhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hj݉hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjzubeh}(h]h ]h"]h$]h&]jjuh1jhj%hhhj7hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj!hhhj7hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj7hKhjhhubj)}(hhh]h)}(h*search a pattern in continuous/linear datah]h*search a pattern in continuous/linear data}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj7hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj;jj;jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct ts_config *conf`` search configuration ``struct ts_state *state`` search state ``const void *data`` data to search in ``unsigned int len`` length of data **Description** A simplified version of textsearch_find() for continuous/linear data. Call textsearch_next() to retrieve subsequent matches. Returns the position of first occurrence of the pattern or ``UINT_MAX`` if no occurrence was found.h](h)}(h**Parameters**h]j)}(hjEh]h Parameters}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhj?ubj )}(hhh](j)}(h0``struct ts_config *conf`` search configuration h](j)}(h``struct ts_config *conf``h]j)}(hjdh]hstruct ts_config *conf}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhj^ubj2)}(hhh]h)}(hsearch configurationh]hsearch configuration}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhKhjzubah}(h]h ]h"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhKhj[ubj)}(h(``struct ts_state *state`` search state h](j)}(h``struct ts_state *state``h]j)}(hjh]hstruct ts_state *state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjubj2)}(hhh]h)}(h search stateh]h search state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj[ubj)}(h'``const void *data`` data to search in h](j)}(h``const void *data``h]j)}(hj֊h]hconst void *data}(hj؊hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԊubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjЊubj2)}(hhh]h)}(hdata to search inh]hdata to search in}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjЊubeh}(h]h ]h"]h$]h&]uh1jhjhKhj[ubj)}(h$``unsigned int len`` length of data h](j)}(h``unsigned int len``h]j)}(hjh]hunsigned int len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhj ubj2)}(hhh]h)}(hlength of datah]hlength of data}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hKhj%ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj$hKhj[ubeh}(h]h ]h"]h$]h&]uh1j hj?ubh)}(h**Description**h]j)}(hjJh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhj?ubh)}(h|A simplified version of textsearch_find() for continuous/linear data. Call textsearch_next() to retrieve subsequent matches.h]h|A simplified version of textsearch_find() for continuous/linear data. Call textsearch_next() to retrieve subsequent matches.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhj?ubh)}(hcReturns the position of first occurrence of the pattern or ``UINT_MAX`` if no occurrence was found.h](h;Returns the position of first occurrence of the pattern or }(hjohhhNhNubj)}(h ``UINT_MAX``h]hUINT_MAX}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh if no occurrence was found.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j textsearch_prepare (C function)c.textsearch_preparehNtauh1hhjhhhNhNubj)}(hhh](j)}(hzstruct ts_config * textsearch_prepare (const char *algo, const void *pattern, unsigned int len, gfp_t gfp_mask, int flags)h]j)}(hxstruct ts_config *textsearch_prepare(const char *algo, const void *pattern, unsigned int len, gfp_t gfp_mask, int flags)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubh)}(hhh]j)}(h ts_configh]h ts_config}(hjϋhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj̋ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjыmodnameN classnameNj] j` )}jc ]jf )}jY textsearch_preparesbc.textsearch_prepareasbuh1hhjhhhjhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj{)}(htextsearch_prepareh]j)}(hjh]htextsearch_prepare}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(hT(const char *algo, const void *pattern, unsigned int len, gfp_t gfp_mask, int flags)h](j)}(hconst char *algoh](j)}(hjh]hconst}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj )}(hcharh]hchar}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&ubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj)}(hjh]h*}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(halgoh]halgo}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubj)}(hconst void *patternh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpatternh]hpattern}(hjˌhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubj)}(hunsigned int lenh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubj)}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj:modnameN classnameNj] j` )}jc ]jc.textsearch_prepareasbuh1hhj1ubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1ubj)}(hgfp_maskh]hgfp_mask}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubj)}(h int flagsh](j )}(hinth]hint}(hj}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjyubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(hPrepare a searchh]hPrepare a search}(hjÍhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjۍjjۍjjjuh1jhhhjhNhNubj)}(hXZ**Parameters** ``const char *algo`` name of search algorithm ``const void *pattern`` pattern data ``unsigned int len`` length of pattern ``gfp_t gfp_mask`` allocation mask ``int flags`` search flags **Description** Looks up the search algorithm module and creates a new textsearch configuration for the specified pattern. **Note** The format of the pattern may not be compatible between the various search algorithms. Returns a new textsearch configuration according to the specified parameters or a ERR_PTR(). If a zero length pattern is passed, this function returns EINVAL.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjߍubj )}(hhh](j)}(h.``const char *algo`` name of search algorithm h](j)}(h``const char *algo``h]j)}(hjh]hconst char *algo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjubj2)}(hhh]h)}(hname of search algorithmh]hname of search algorithm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h%``const void *pattern`` pattern data h](j)}(h``const void *pattern``h]j)}(hj=h]hconst void *pattern}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhj7ubj2)}(hhh]h)}(h pattern datah]h pattern data}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhKhjSubah}(h]h ]h"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhKhjubj)}(h'``unsigned int len`` length of pattern h](j)}(h``unsigned int len``h]j)}(hjvh]hunsigned int len}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjpubj2)}(hhh]h)}(hlength of patternh]hlength of pattern}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h#``gfp_t gfp_mask`` allocation mask h](j)}(h``gfp_t gfp_mask``h]j)}(hjh]hgfp_t gfp_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjubj2)}(hhh]h)}(hallocation maskh]hallocation mask}(hjȎhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjĎhKhjŎubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjĎhKhjubj)}(h``int flags`` search flags h](j)}(h ``int flags``h]j)}(hjh]h int flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjubj2)}(hhh]h)}(h search flagsh]h search flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1j hjߍubh)}(h**Description**h]j)}(hj#h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjߍubh)}(hjLooks up the search algorithm module and creates a new textsearch configuration for the specified pattern.h]hjLooks up the search algorithm module and creates a new textsearch configuration for the specified pattern.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjߍubh)}(h**Note**h]j)}(hjJh]hNote}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chKhjߍubj )}(hhh]j)}(hWThe format of the pattern may not be compatible between the various search algorithms. h](j)}(h7The format of the pattern may not be compatible betweenh]h7The format of the pattern may not be compatible between}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chMhjcubj2)}(hhh]h)}(hthe various search algorithms.h]hthe various search algorithms.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhMhjvubah}(h]h ]h"]h$]h&]uh1j1hjcubeh}(h]h ]h"]h$]h&]uh1jhjuhMhj`ubah}(h]h ]h"]h$]h&]uh1j hjߍubh)}(hReturns a new textsearch configuration according to the specified parameters or a ERR_PTR(). If a zero length pattern is passed, this function returns EINVAL.h]hReturns a new textsearch configuration according to the specified parameters or a ERR_PTR(). If a zero length pattern is passed, this function returns EINVAL.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chMhjߍubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j textsearch_destroy (C function)c.textsearch_destroyhNtauh1hhjhhhNhNubj)}(hhh](j)}(h0void textsearch_destroy (struct ts_config *conf)h]j)}(h/void textsearch_destroy(struct ts_config *conf)h](j )}(hvoidh]hvoid}(hjȏhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjďhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chM3ubj2)}(h h]h }(hj׏hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjďhhhj֏hM3ubj{)}(htextsearch_destroyh]j)}(htextsearch_destroyh]htextsearch_destroy}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjďhhhj֏hM3ubj)}(h(struct ts_config *conf)h]j)}(hstruct ts_config *confh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h ts_configh]h ts_config}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj%modnameN classnameNj] j` )}jc ]jf )}jY jsbc.textsearch_destroyasbuh1hhjubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hconfh]hconf}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjďhhhj֏hM3ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj֏hM3ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj֏hM3hjhhubj)}(hhh]h)}(hdestroy a search configurationh]hdestroy a search configuration}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chM3hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj֏hM3ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct ts_config *conf`` search configuration **Description** Releases all references of the configuration and frees up the memory.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chM7hjubj )}(hhh]j)}(h0``struct ts_config *conf`` search configuration h](j)}(h``struct ts_config *conf``h]j)}(hjɐh]hstruct ts_config *conf}(hjːhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjǐubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chM4hjÐubj2)}(hhh]h)}(hsearch configurationh]hsearch configuration}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjސhM4hjߐubah}(h]h ]h"]h$]h&]uh1j1hjÐubeh}(h]h ]h"]h$]h&]uh1jhjސhM4hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chM6hjubh)}(hEReleases all references of the configuration and frees up the memory.h]hEReleases all references of the configuration and frees up the memory.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:114: ./lib/textsearch.chM5hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j textsearch_next (C function)c.textsearch_nexthNtauh1hhjhhhNhNubj)}(hhh](j)}(hMunsigned int textsearch_next (struct ts_config *conf, struct ts_state *state)h]j)}(hLunsigned int textsearch_next(struct ts_config *conf, struct ts_state *state)h](j )}(hunsignedh]hunsigned}(hjIhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjEhhh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhK_ubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEhhhjWhK_ubj )}(hinth]hint}(hjfhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjEhhhjWhK_ubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEhhhjWhK_ubj{)}(htextsearch_nexth]j)}(htextsearch_nexth]htextsearch_next}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjEhhhjWhK_ubj)}(h0(struct ts_config *conf, struct ts_state *state)h](j)}(hstruct ts_config *confh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h ts_configh]h ts_config}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj‘modnameN classnameNj] j` )}jc ]jf )}jY jsbc.textsearch_nextasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hconfh]hconf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct ts_state *stateh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hts_stateh]hts_state}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj4modnameN classnameNj] j` )}jc ]jܑc.textsearch_nextasbuh1hhjubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hstateh]hstate}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjEhhhjWhK_ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjAhhhjWhK_ubah}(h]j<ah ](jjeh"]h$]h&]jj)jhuh1jhjWhK_hj>hhubj)}(hhh]h)}(h continue searching for a patternh]h continue searching for a pattern}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhK_hjhhubah}(h]h ]h"]h$]h&]uh1jhj>hhhjWhK_ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXy**Parameters** ``struct ts_config *conf`` search configuration ``struct ts_state *state`` search state **Description** Continues a search looking for more occurrences of the pattern. textsearch_find() must be called to find the first occurrence in order to reset the state. Returns the position of the next occurrence of the pattern or UINT_MAX if not match was found.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKchjubj )}(hhh](j)}(h0``struct ts_config *conf`` search configuration h](j)}(h``struct ts_config *conf``h]j)}(hj֒h]hstruct ts_config *conf}(hjؒhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԒubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhK`hjВubj2)}(hhh]h)}(hsearch configurationh]hsearch configuration}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK`hjubah}(h]h ]h"]h$]h&]uh1j1hjВubeh}(h]h ]h"]h$]h&]uh1jhjhK`hj͒ubj)}(h(``struct ts_state *state`` search state h](j)}(h``struct ts_state *state``h]j)}(hjh]hstruct ts_state *state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKahj ubj2)}(hhh]h)}(h search stateh]h search state}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hKahj%ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj$hKahj͒ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjJh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKchjubh)}(hContinues a search looking for more occurrences of the pattern. textsearch_find() must be called to find the first occurrence in order to reset the state.h]hContinues a search looking for more occurrences of the pattern. textsearch_find() must be called to find the first occurrence in order to reset the state.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKbhjubh)}(h^Returns the position of the next occurrence of the pattern or UINT_MAX if not match was found.h]h^Returns the position of the next occurrence of the pattern or UINT_MAX if not match was found.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKfhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j textsearch_find (C function)c.textsearch_findhNtauh1hhjhhhNhNubj)}(hhh](j)}(hMunsigned int textsearch_find (struct ts_config *conf, struct ts_state *state)h]j)}(hLunsigned int textsearch_find(struct ts_config *conf, struct ts_state *state)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKvubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKvubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhKvubj2)}(h h]h }(hjɓhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKvubj{)}(htextsearch_findh]j)}(htextsearch_findh]htextsearch_find}(hjۓhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjדubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKvubj)}(h0(struct ts_config *conf, struct ts_state *state)h](j)}(hstruct ts_config *confh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h ts_configh]h ts_config}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jݓsbc.textsearch_findasbuh1hhjubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hconfh]hconf}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct ts_state *stateh](j)}(hjAh]hstruct}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjeubh)}(hhh]j)}(hts_stateh]hts_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j1c.textsearch_findasbuh1hhjeubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjeubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(hstateh]hstate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKvubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKvubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKvhjhhubj)}(hhh]h)}(hstart searching for a patternh]hstart searching for a pattern}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKvhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKvubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct ts_config *conf`` search configuration ``struct ts_state *state`` search state **Description** Returns the position of first occurrence of the pattern or UINT_MAX if no match was found.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKzhjubj )}(hhh](j)}(h0``struct ts_config *conf`` search configuration h](j)}(h``struct ts_config *conf``h]j)}(hj+h]hstruct ts_config *conf}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKwhj%ubj2)}(hhh]h)}(hsearch configurationh]hsearch configuration}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hKwhjAubah}(h]h ]h"]h$]h&]uh1j1hj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hKwhj"ubj)}(h(``struct ts_state *state`` search state h](j)}(h``struct ts_state *state``h]j)}(hjdh]hstruct ts_state *state}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKxhj^ubj2)}(hhh]h)}(h search stateh]h search state}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhKxhjzubah}(h]h ]h"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhKxhj"ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKzhjubh)}(hZReturns the position of first occurrence of the pattern or UINT_MAX if no match was found.h]hZReturns the position of first occurrence of the pattern or UINT_MAX if no match was found.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKyhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #textsearch_get_pattern (C function)c.textsearch_get_patternhNtauh1hhjhhhNhNubj)}(hhh](j)}(h6void * textsearch_get_pattern (struct ts_config *conf)h]j)}(h4void *textsearch_get_pattern(struct ts_config *conf)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj{)}(htextsearch_get_pattern(h]j)}(htextsearch_get_patternh]htextsearch_get_pattern}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(struct ts_config *conf)h]j)}(hstruct ts_config *confh](j)}(hjAh]hstruct}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubh)}(hhh]j)}(h ts_configh]h ts_config}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjNmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.textsearch_get_patternasbuh1hhj*ubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj)}(hjh]h*}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hconfh]hconf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj&ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjܕhhhjhKubah}(h]jוah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjٕhhubj)}(hhh]h)}(hreturn head of the patternh]hreturn head of the pattern}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjٕhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjɖjjɖjjjuh1jhhhjhNhNubj)}(hA**Parameters** ``struct ts_config *conf`` search configurationh](h)}(h**Parameters**h]j)}(hjӖh]h Parameters}(hjՖhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjіubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKhj͖ubj )}(hhh]j)}(h/``struct ts_config *conf`` search configurationh](j)}(h``struct ts_config *conf``h]j)}(hjh]hstruct ts_config *conf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKhjubj2)}(hhh]h)}(hsearch configurationh]hsearch configuration}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hj͖ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'textsearch_get_pattern_len (C function)c.textsearch_get_pattern_lenhNtauh1hhjhhhNhNubj)}(hhh](j)}(h@unsigned int textsearch_get_pattern_len (struct ts_config *conf)h]j)}(h?unsigned int textsearch_get_pattern_len(struct ts_config *conf)h](j )}(hunsignedh]hunsigned}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHhhh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHhhhjZhKubj )}(hinth]hint}(hjihhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHhhhjZhKubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHhhhjZhKubj{)}(htextsearch_get_pattern_lenh]j)}(htextsearch_get_pattern_lenh]htextsearch_get_pattern_len}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjHhhhjZhKubj)}(h(struct ts_config *conf)h]j)}(hstruct ts_config *confh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h ts_configh]h ts_config}(hj×hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjŗmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.textsearch_get_pattern_lenasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hconfh]hconf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjHhhhjZhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjDhhhjZhKubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1jhjZhKhjAhhubj)}(hhh]h)}(hreturn length of the patternh]hreturn length of the pattern}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKhj%hhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjZhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj@jj@jjjuh1jhhhjhNhNubj)}(hA**Parameters** ``struct ts_config *conf`` search configurationh](h)}(h**Parameters**h]j)}(hjJh]h Parameters}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKhjDubj )}(hhh]j)}(h/``struct ts_config *conf`` search configurationh](j)}(h``struct ts_config *conf``h]j)}(hjih]hstruct ts_config *conf}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKhjcubj2)}(hhh]h)}(hsearch configurationh]hsearch configuration}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:117: ./include/linux/textsearch.hhKhjubah}(h]h ]h"]h$]h&]uh1j1hjcubeh}(h]h ]h"]h$]h&]uh1jhj~hKhj`ubah}(h]h ]h"]h$]h&]uh1j hjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]text-searchingah ]h"]text searchingah$]h&]uh1hhjhhhhhKmubeh}(h]basic-kernel-library-functionsah ]h"]basic kernel library functionsah$]h&]uh1hhhhhhhhK/ubh)}(hhh](h)}(hCRC and Math Functions in Linuxh]hCRC and Math Functions in Linux}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKzubh)}(hhh](h)}(hArithmetic Overflow Checkingh]hArithmetic Overflow Checking}(hjΘhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj˘hhhhhK}ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j check_add_overflow (C macro)c.check_add_overflowhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hcheck_add_overflowh]j)}(hcheck_add_overflowh]j{)}(hcheck_add_overflowh]j)}(hjh]hcheck_add_overflow}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhK3ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj hK3ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hK3hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj hK3ubeh}(h]h ](jmacroeh"]h$]h&]jjjj%jj%jjjuh1jhhhj˘hNhNubh)}(h ``check_add_overflow (a, b, d)``h]j)}(hj+h]hcheck_add_overflow (a, b, d)}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhK5hj˘hhubj)}(h*Calculate addition with overflow checking h]h)}(h)Calculate addition with overflow checkingh]h)Calculate addition with overflow checking}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhK3hjAubah}(h]h ]h"]h$]h&]uh1jhjShK3hj˘hhubj)}(h**Parameters** ``a`` first addend ``b`` second addend ``d`` pointer to store sum **Description** Returns true on wrap-around, false otherwise. ***d** holds the results of the attempted addition, regardless of whether wrap-around occurred.h](h)}(h**Parameters**h]j)}(hj`h]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhK7hjZubj )}(hhh](j)}(h``a`` first addend h](j)}(h``a``h]j)}(hjh]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhK4hjyubj2)}(hhh]h)}(h first addendh]h first addend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK4hjubah}(h]h ]h"]h$]h&]uh1j1hjyubeh}(h]h ]h"]h$]h&]uh1jhjhK4hjvubj)}(h``b`` second addend h](j)}(h``b``h]j)}(hjh]hb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhK5hjubj2)}(hhh]h)}(h second addendh]h second addend}(hjљhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj͙hK5hjΙubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj͙hK5hjvubj)}(h``d`` pointer to store sum h](j)}(h``d``h]j)}(hjh]hd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhK6hjubj2)}(hhh]h)}(hpointer to store sumh]hpointer to store sum}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK6hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK6hjvubeh}(h]h ]h"]h$]h&]uh1j hjZubh)}(h**Description**h]j)}(hj,h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhK8hjZubh)}(h-Returns true on wrap-around, false otherwise.h]h-Returns true on wrap-around, false otherwise.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhK7hjZubh)}(h_***d** holds the results of the attempted addition, regardless of whether wrap-around occurred.h](j)}(h***d**h]h*d}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubhY holds the results of the attempted addition, regardless of whether wrap-around occurred.}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhK9hjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j wrapping_add (C macro)c.wrapping_addhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h wrapping_addh]j)}(h wrapping_addh]j{)}(h wrapping_addh]j)}(hjh]h wrapping_add}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKAubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKAubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKAhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhKAubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h``wrapping_add (type, a, b)``h]j)}(hjĚh]hwrapping_add (type, a, b)}(hjƚhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjšubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKChj˘hhubj)}(h*Intentionally perform a wrapping addition h]h)}(h)Intentionally perform a wrapping additionh]h)Intentionally perform a wrapping addition}(hjޚhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKAhjښubah}(h]h ]h"]h$]h&]uh1jhjhKAhj˘hhubj)}(h**Parameters** ``type`` type for result of calculation ``a`` first addend ``b`` second addend **Description** Return the potentially wrapped-around addition without tripping any wrap-around sanitizers that may be enabled.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKEhjubj )}(hhh](j)}(h(``type`` type for result of calculation h](j)}(h``type``h]j)}(hjh]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKBhjubj2)}(hhh]h)}(htype for result of calculationh]htype for result of calculation}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hKBhj.ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj-hKBhjubj)}(h``a`` first addend h](j)}(h``a``h]j)}(hjQh]ha}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKChjKubj2)}(hhh]h)}(h first addendh]h first addend}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhKChjgubah}(h]h ]h"]h$]h&]uh1j1hjKubeh}(h]h ]h"]h$]h&]uh1jhjfhKChjubj)}(h``b`` second addend h](j)}(h``b``h]j)}(hjh]hb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKDhjubj2)}(hhh]h)}(h second addendh]h second addend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKDhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKDhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjśh]h Description}(hjǛhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÛubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKFhjubh)}(hoReturn the potentially wrapped-around addition without tripping any wrap-around sanitizers that may be enabled.h]hoReturn the potentially wrapped-around addition without tripping any wrap-around sanitizers that may be enabled.}(hjۛhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKEhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j wrapping_assign_add (C macro)c.wrapping_assign_addhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hwrapping_assign_addh]j)}(hwrapping_assign_addh]j{)}(hwrapping_assign_addh]j)}(hjh]hwrapping_assign_add}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKQubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj!hKQubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj!hKQhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj!hKQubeh}(h]h ](jmacroeh"]h$]h&]jjjj:jj:jjjuh1jhhhj˘hNhNubh)}(h%``wrapping_assign_add (var, offset)``h]j)}(hj@h]h!wrapping_assign_add (var, offset)}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKShj˘hhubj)}(h6Intentionally perform a wrapping increment assignment h]h)}(h5Intentionally perform a wrapping increment assignmenth]h5Intentionally perform a wrapping increment assignment}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKQhjVubah}(h]h ]h"]h$]h&]uh1jhjhhKQhj˘hhubj)}(hX **Parameters** ``var`` variable to be incremented ``offset`` amount to add **Description** Increments **var** by **offset** with wrap-around. Returns the resulting value of **var**. Will not trip any wrap-around sanitizers. Returns the new value of **var**.h](h)}(h**Parameters**h]j)}(hjuh]h Parameters}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKUhjoubj )}(hhh](j)}(h#``var`` variable to be incremented h](j)}(h``var``h]j)}(hjh]hvar}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKRhjubj2)}(hhh]h)}(hvariable to be incrementedh]hvariable to be incremented}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKRhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKRhjubj)}(h``offset`` amount to add h](j)}(h ``offset``h]j)}(hj͜h]hoffset}(hjϜhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj˜ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKShjǜubj2)}(hhh]h)}(h amount to addh]h amount to add}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKShjubah}(h]h ]h"]h$]h&]uh1j1hjǜubeh}(h]h ]h"]h$]h&]uh1jhjhKShjubeh}(h]h ]h"]h$]h&]uh1j hjoubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKUhjoubh)}(hIncrements **var** by **offset** with wrap-around. Returns the resulting value of **var**. Will not trip any wrap-around sanitizers.h](h Increments }(hjhhhNhNubj)}(h**var**h]hvar}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh by }(hjhhhNhNubj)}(h **offset**h]hoffset}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 with wrap-around. Returns the resulting value of }(hjhhhNhNubj)}(h**var**h]hvar}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+. Will not trip any wrap-around sanitizers.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKThjoubh)}(h!Returns the new value of **var**.h](hReturns the new value of }(hjchhhNhNubj)}(h**var**h]hvar}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubh.}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKWhjoubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j check_sub_overflow (C macro)c.check_sub_overflowhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hcheck_sub_overflowh]j)}(hcheck_sub_overflowh]j{)}(hcheck_sub_overflowh]j)}(hjh]hcheck_sub_overflow}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKaubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKaubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKahjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhKaubeh}(h]h ](jmacroeh"]h$]h&]jjjjԝjjԝjjjuh1jhhhj˘hNhNubh)}(h ``check_sub_overflow (a, b, d)``h]j)}(hjڝh]hcheck_sub_overflow (a, b, d)}(hjܝhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj؝ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKchj˘hhubj)}(h-Calculate subtraction with overflow checking h]h)}(h,Calculate subtraction with overflow checkingh]h,Calculate subtraction with overflow checking}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKahjubah}(h]h ]h"]h$]h&]uh1jhjhKahj˘hhubj)}(hX2**Parameters** ``a`` minuend; value to subtract from ``b`` subtrahend; value to subtract from **a** ``d`` pointer to store difference **Description** Returns true on wrap-around, false otherwise. ***d** holds the results of the attempted subtraction, regardless of whether wrap-around occurred.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKehj ubj )}(hhh](j)}(h&``a`` minuend; value to subtract from h](j)}(h``a``h]j)}(hj.h]ha}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKbhj(ubj2)}(hhh]h)}(hminuend; value to subtract fromh]hminuend; value to subtract from}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChKbhjDubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhjChKbhj%ubj)}(h/``b`` subtrahend; value to subtract from **a** h](j)}(h``b``h]j)}(hjgh]hb}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKchjaubj2)}(hhh]h)}(h(subtrahend; value to subtract from **a**h](h#subtrahend; value to subtract from }(hjhhhNhNubj)}(h**a**h]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhj|hKchj}ubah}(h]h ]h"]h$]h&]uh1j1hjaubeh}(h]h ]h"]h$]h&]uh1jhj|hKchj%ubj)}(h"``d`` pointer to store difference h](j)}(h``d``h]j)}(hjh]hd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKdhjubj2)}(hhh]h)}(hpointer to store differenceh]hpointer to store difference}(hjǞhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjÞhKdhjĞubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjÞhKdhj%ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKfhj ubh)}(h-Returns true on wrap-around, false otherwise.h]h-Returns true on wrap-around, false otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKehj ubh)}(hb***d** holds the results of the attempted subtraction, regardless of whether wrap-around occurred.h](j)}(h***d**h]h*d}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh\ holds the results of the attempted subtraction, regardless of whether wrap-around occurred.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKghj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j wrapping_sub (C macro)c.wrapping_subhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h wrapping_subh]j)}(h wrapping_subh]j{)}(h wrapping_subh]j)}(hjEh]h wrapping_sub}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjGhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKoubah}(h]h ]h"]h$]h&]jjjuh1jjjhjChhhjbhKoubah}(h]j>ah ](jjeh"]h$]h&]jj)jhuh1jhjbhKohj@hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj@hhhjbhKoubeh}(h]h ](jmacroeh"]h$]h&]jjjj{jj{jjjuh1jhhhj˘hNhNubh)}(h``wrapping_sub (type, a, b)``h]j)}(hjh]hwrapping_sub (type, a, b)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKqhj˘hhubj)}(h-Intentionally perform a wrapping subtraction h]h)}(h,Intentionally perform a wrapping subtractionh]h,Intentionally perform a wrapping subtraction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKohjubah}(h]h ]h"]h$]h&]uh1jhjhKohj˘hhubj)}(hX**Parameters** ``type`` type for result of calculation ``a`` minuend; value to subtract from ``b`` subtrahend; value to subtract from **a** **Description** Return the potentially wrapped-around subtraction without tripping any wrap-around sanitizers that may be enabled.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKshjubj )}(hhh](j)}(h(``type`` type for result of calculation h](j)}(h``type``h]j)}(hj՟h]htype}(hjןhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӟubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKphjϟubj2)}(hhh]h)}(htype for result of calculationh]htype for result of calculation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKphjubah}(h]h ]h"]h$]h&]uh1j1hjϟubeh}(h]h ]h"]h$]h&]uh1jhjhKphj̟ubj)}(h&``a`` minuend; value to subtract from h](j)}(h``a``h]j)}(hjh]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKqhjubj2)}(hhh]h)}(hminuend; value to subtract fromh]hminuend; value to subtract from}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hKqhj$ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj#hKqhj̟ubj)}(h/``b`` subtrahend; value to subtract from **a** h](j)}(h``b``h]j)}(hjGh]hb}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKrhjAubj2)}(hhh]h)}(h(subtrahend; value to subtract from **a**h](h#subtrahend; value to subtract from }(hj`hhhNhNubj)}(h**a**h]ha}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1hhj\hKrhj]ubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj\hKrhj̟ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKthjubh)}(hrReturn the potentially wrapped-around subtraction without tripping any wrap-around sanitizers that may be enabled.h]hrReturn the potentially wrapped-around subtraction without tripping any wrap-around sanitizers that may be enabled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKshjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j wrapping_assign_sub (C macro)c.wrapping_assign_subhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hwrapping_assign_subh]j)}(hwrapping_assign_subh]j{)}(hwrapping_assign_subh]j)}(hjϠh]hwrapping_assign_sub}(hj٠hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjՠubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjѠhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhj͠hhhjhKubah}(h]jȠah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjʠhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjʠhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h%``wrapping_assign_sub (var, offset)``h]j)}(hj h]h!wrapping_assign_sub (var, offset)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj˘hhubj)}(h2Intentionally perform a wrapping decrement assign h]h)}(h1Intentionally perform a wrapping decrement assignh]h1Intentionally perform a wrapping decrement assign}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj!ubah}(h]h ]h"]h$]h&]uh1jhj3hKhj˘hhubj)}(hX**Parameters** ``var`` variable to be decremented ``offset`` amount to subtract **Description** Decrements **var** by **offset** with wrap-around. Returns the resulting value of **var**. Will not trip any wrap-around sanitizers. Returns the new value of **var**.h](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj:ubj )}(hhh](j)}(h#``var`` variable to be decremented h](j)}(h``var``h]j)}(hj_h]hvar}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjYubj2)}(hhh]h)}(hvariable to be decrementedh]hvariable to be decremented}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthKhjuubah}(h]h ]h"]h$]h&]uh1j1hjYubeh}(h]h ]h"]h$]h&]uh1jhjthKhjVubj)}(h``offset`` amount to subtract h](j)}(h ``offset``h]j)}(hjh]hoffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubj2)}(hhh]h)}(hamount to subtracth]hamount to subtract}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjVubeh}(h]h ]h"]h$]h&]uh1j hj:ubh)}(h**Description**h]j)}(hjӡh]h Description}(hjաhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjѡubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj:ubh)}(hDecrements **var** by **offset** with wrap-around. Returns the resulting value of **var**. Will not trip any wrap-around sanitizers.h](h Decrements }(hjhhhNhNubj)}(h**var**h]hvar}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh by }(hjhhhNhNubj)}(h **offset**h]hoffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 with wrap-around. Returns the resulting value of }(hjhhhNhNubj)}(h**var**h]hvar}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+. Will not trip any wrap-around sanitizers.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj:ubh)}(h!Returns the new value of **var**.h](hReturns the new value of }(hj.hhhNhNubj)}(h**var**h]hvar}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j check_mul_overflow (C macro)c.check_mul_overflowhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hcheck_mul_overflowh]j)}(hcheck_mul_overflowh]j{)}(hcheck_mul_overflowh]j)}(hjih]hcheck_mul_overflow}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjkhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjghhhjhKubah}(h]jbah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjdhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjdhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h ``check_mul_overflow (a, b, d)``h]j)}(hjh]hcheck_mul_overflow (a, b, d)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj˘hhubj)}(h0Calculate multiplication with overflow checking h]h)}(h/Calculate multiplication with overflow checkingh]h/Calculate multiplication with overflow checking}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj͢hKhj˘hhubj)}(hX**Parameters** ``a`` first factor ``b`` second factor ``d`` pointer to store product **Description** Returns true on wrap-around, false otherwise. ***d** holds the results of the attempted multiplication, regardless of whether wrap-around occurred.h](h)}(h**Parameters**h]j)}(hjڢh]h Parameters}(hjܢhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjآubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjԢubj )}(hhh](j)}(h``a`` first factor h](j)}(h``a``h]j)}(hjh]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubj2)}(hhh]h)}(h first factorh]h first factor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h``b`` second factor h](j)}(h``b``h]j)}(hj2h]hb}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj,ubj2)}(hhh]h)}(h second factorh]h second factor}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhKhjHubah}(h]h ]h"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]uh1jhjGhKhjubj)}(h``d`` pointer to store product h](j)}(h``d``h]j)}(hjkh]hd}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjeubj2)}(hhh]h)}(hpointer to store producth]hpointer to store product}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjeubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1j hjԢubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjԢubh)}(h-Returns true on wrap-around, false otherwise.h]h-Returns true on wrap-around, false otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjԢubh)}(he***d** holds the results of the attempted multiplication, regardless of whether wrap-around occurred.h](j)}(h***d**h]h*d}(hjϣhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjˣubh_ holds the results of the attempted multiplication, regardless of whether wrap-around occurred.}(hjˣhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjԢubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j wrapping_mul (C macro)c.wrapping_mulhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h wrapping_mulh]j)}(h wrapping_mulh]j{)}(h wrapping_mulh]j)}(hjh]h wrapping_mul}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjj8jj8jjjuh1jhhhj˘hNhNubh)}(h``wrapping_mul (type, a, b)``h]j)}(hj>h]hwrapping_mul (type, a, b)}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj˘hhubj)}(h0Intentionally perform a wrapping multiplication h]h)}(h/Intentionally perform a wrapping multiplicationh]h/Intentionally perform a wrapping multiplication}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjTubah}(h]h ]h"]h$]h&]uh1jhjfhKhj˘hhubj)}(h**Parameters** ``type`` type for result of calculation ``a`` first factor ``b`` second factor **Description** Return the potentially wrapped-around multiplication without tripping any wrap-around sanitizers that may be enabled.h](h)}(h**Parameters**h]j)}(hjsh]h Parameters}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjmubj )}(hhh](j)}(h(``type`` type for result of calculation h](j)}(h``type``h]j)}(hjh]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubj2)}(hhh]h)}(htype for result of calculationh]htype for result of calculation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h``a`` first factor h](j)}(h``a``h]j)}(hjˤh]ha}(hjͤhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɤubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjŤubj2)}(hhh]h)}(h first factorh]h first factor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjŤubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h``b`` second factor h](j)}(h``b``h]j)}(hjh]hb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubj2)}(hhh]h)}(h second factorh]h second factor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1j hjmubh)}(h**Description**h]j)}(hj?h]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjmubh)}(huReturn the potentially wrapped-around multiplication without tripping any wrap-around sanitizers that may be enabled.h]huReturn the potentially wrapped-around multiplication without tripping any wrap-around sanitizers that may be enabled.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j check_shl_overflow (C macro)c.check_shl_overflowhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hcheck_shl_overflowh]j)}(hcheck_shl_overflowh]j{)}(hcheck_shl_overflowh]j)}(hj~h]hcheck_shl_overflow}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhj|hhhjhKubah}(h]jwah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjyhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjyhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h ``check_shl_overflow (a, s, d)``h]j)}(hjh]hcheck_shl_overflow (a, s, d)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj˘hhubj)}(h2Calculate a left-shifted value and check overflow h]h)}(h1Calculate a left-shifted value and check overflowh]h1Calculate a left-shifted value and check overflow}(hjԥhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjХubah}(h]h ]h"]h$]h&]uh1jhjhKhj˘hhubj)}(hX**Parameters** ``a`` Value to be shifted ``s`` How many bits left to shift ``d`` Pointer to where to store the result **Description** Computes ***d** = (**a** << **s**) Returns true if '***d**' cannot hold the result or when '**a** << **s**' doesn't make sense. Example conditions: - '**a** << **s**' causes bits to be lost when stored in ***d**. - '**s**' is garbage (e.g. negative) or so large that the result of '**a** << **s**' is guaranteed to be 0. - '**a**' is negative. - '**a** << **s**' sets the sign bit, if any, in '***d**'. '***d**' will hold the results of the attempted shift, but is not considered "safe for use" if true is returned.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubj )}(hhh](j)}(h``a`` Value to be shifted h](j)}(h``a``h]j)}(hjh]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubj2)}(hhh]h)}(hValue to be shiftedh]hValue to be shifted}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hKhj$ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj#hKhjubj)}(h"``s`` How many bits left to shift h](j)}(h``s``h]j)}(hjGh]hs}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjAubj2)}(hhh]h)}(hHow many bits left to shifth]hHow many bits left to shift}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hKhj]ubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj\hKhjubj)}(h+``d`` Pointer to where to store the result h](j)}(h``d``h]j)}(hjh]hd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjzubj2)}(hhh]h)}(h$Pointer to where to store the resulth]h$Pointer to where to store the result}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjzubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubh)}(h"Computes ***d** = (**a** << **s**)h](h Computes }(hjѦhhhNhNubj)}(h***d**h]h*d}(hj٦hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjѦubh = (}(hjѦhhhNhNubj)}(h**a**h]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjѦubh << }(hjѦhhhNhNubj)}(h**s**h]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjѦubh)}(hjѦhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubh)}(hpReturns true if '***d**' cannot hold the result or when '**a** << **s**' doesn't make sense. Example conditions:h](hReturns true if ‘}(hjhhhNhNubj)}(h***d**h]h*d}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh&’ cannot hold the result or when ‘}(hjhhhNhNubj)}(h**a**h]ha}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh << }(hjhhhNhNubj)}(h**s**h]hs}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh-’ doesn’t make sense. Example conditions:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubj)}(hhh](j)}(h>'**a** << **s**' causes bits to be lost when stored in ***d**.h]h)}(hj`h](h‘}(hjbhhhNhNubj)}(h**a**h]ha}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh << }(hjbhhhNhNubj)}(h**s**h]hs}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh*’ causes bits to be lost when stored in }(hjbhhhNhNubj)}(h***d**h]h*d}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh.}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj^ubah}(h]h ]h"]h$]h&]uh1jhj[ubj)}(hi'**s**' is garbage (e.g. negative) or so large that the result of '**a** << **s**' is guaranteed to be 0.h]h)}(hi'**s**' is garbage (e.g. negative) or so large that the result of '**a** << **s**' is guaranteed to be 0.h](h‘}(hjhhhNhNubj)}(h**s**h]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhA’ is garbage (e.g. negative) or so large that the result of ‘}(hjhhhNhNubj)}(h**a**h]ha}(hjʧhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh << }(hjhhhNhNubj)}(h**s**h]hs}(hjܧhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh’ is guaranteed to be 0.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj[ubj)}(h'**a**' is negative.h]h)}(hjh](h‘}(hjhhhNhNubj)}(h**a**h]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh’ is negative.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj[ubj)}(h9'**a** << **s**' sets the sign bit, if any, in '***d**'. h]h)}(h8'**a** << **s**' sets the sign bit, if any, in '***d**'.h](h‘}(hj)hhhNhNubj)}(h**a**h]ha}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh << }(hj)hhhNhNubj)}(h**s**h]hs}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh%’ sets the sign bit, if any, in ‘}(hj)hhhNhNubj)}(h***d**h]h*d}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh’.}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj%ubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]jjuh1jhjhKhjubh)}(hp'***d**' will hold the results of the attempted shift, but is not considered "safe for use" if true is returned.h](h‘}(hjzhhhNhNubj)}(h***d**h]h*d}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubho’ will hold the results of the attempted shift, but is not considered “safe for use” if true is returned.}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j overflows_type (C macro)c.overflows_typehNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hoverflows_typeh]j)}(hoverflows_typeh]j{)}(hoverflows_typeh]j)}(hjh]hoverflows_type}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjҨhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjҨhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjҨhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h``overflows_type (n, T)``h]j)}(hjh]hoverflows_type (n, T)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj˘hhubj)}(hIhelper for checking the overflows between value, variables, or data type h]h)}(hHhelper for checking the overflows between value, variables, or data typeh]hHhelper for checking the overflows between value, variables, or data type}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhj˘hhubj)}(hX**Parameters** ``n`` source constant value or variable to be checked ``T`` destination variable or data type proposed to store **x** **Description** Compares the **x** expression for whether or not it can safely fit in the storage of the type in **T**. **x** and **T** can have different types. If **x** is a constant expression, this will also resolve to a constant expression. **Return** true if overflow can occur, false otherwise.h](h)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj ubj )}(hhh](j)}(h6``n`` source constant value or variable to be checked h](j)}(h``n``h]j)}(hjEh]hn}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj?ubj2)}(hhh]h)}(h/source constant value or variable to be checkedh]h/source constant value or variable to be checked}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhKhj[ubah}(h]h ]h"]h$]h&]uh1j1hj?ubeh}(h]h ]h"]h$]h&]uh1jhjZhKhj<ubj)}(h@``T`` destination variable or data type proposed to store **x** h](j)}(h``T``h]j)}(hj~h]hT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjxubj2)}(hhh]h)}(h9destination variable or data type proposed to store **x**h](h4destination variable or data type proposed to store }(hjhhhNhNubj)}(h**x**h]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjxubeh}(h]h ]h"]h$]h&]uh1jhjhKhj<ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjǩh]h Description}(hjɩhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjũubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj ubh)}(hCompares the **x** expression for whether or not it can safely fit in the storage of the type in **T**. **x** and **T** can have different types. If **x** is a constant expression, this will also resolve to a constant expression.h](h Compares the }(hjݩhhhNhNubj)}(h**x**h]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݩubhO expression for whether or not it can safely fit in the storage of the type in }(hjݩhhhNhNubj)}(h**T**h]hT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݩubh. }(hjݩhhhNhNubj)}(h**x**h]hx}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݩubh and }(hjݩhhhNhNubj)}(h**T**h]hT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݩubh can have different types. If }(hjݩhhhNhNubj)}(h**x**h]hx}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݩubhK is a constant expression, this will also resolve to a constant expression.}(hjݩhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj ubh)}(h **Return**h]j)}(hjHh]hReturn}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj ubh)}(h,true if overflow can occur, false otherwise.h]h,true if overflow can occur, false otherwise.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j range_overflows (C macro)c.range_overflowshNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hrange_overflowsh]j)}(hrange_overflowsh]j{)}(hrange_overflowsh]j)}(hjh]hrange_overflows}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h&``range_overflows (start, size, max)``h]j)}(hjêh]h"range_overflows (start, size, max)}(hjŪhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj˘hhubj)}(h"Check if a range is out of bounds h]h)}(h!Check if a range is out of boundsh]h!Check if a range is out of bounds}(hjݪhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhj٪ubah}(h]h ]h"]h$]h&]uh1jhjhKhj˘hhubj)}(hX**Parameters** ``start`` Start of the range. ``size`` Size of the range. ``max`` Exclusive upper boundary. **Description** A strict check to determine if the range [**start**, **start** + **size**) is invalid with respect to the allowable range [0, **max**). Any range starting at or beyond **max** is considered an overflow, even if **size** is 0. **Return** true if the range is out of bounds._h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubj )}(hhh](j)}(h``start`` Start of the range. h](j)}(h ``start``h]j)}(hjh]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubj2)}(hhh]h)}(hStart of the range.h]hStart of the range.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj-ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj,hKhjubj)}(h``size`` Size of the range. h](j)}(h``size``h]j)}(hjPh]hsize}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjJubj2)}(hhh]h)}(hSize of the range.h]hSize of the range.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehKhjfubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjehKhjubj)}(h"``max`` Exclusive upper boundary. h](j)}(h``max``h]j)}(hjh]hmax}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubj2)}(hhh]h)}(hExclusive upper boundary.h]hExclusive upper boundary.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjīh]h Description}(hjƫhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj«ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubh)}(hA strict check to determine if the range [**start**, **start** + **size**) is invalid with respect to the allowable range [0, **max**). Any range starting at or beyond **max** is considered an overflow, even if **size** is 0.h](h*A strict check to determine if the range [}(hjګhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjګubh, }(hjګhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjګubh + }(hjګhhhNhNubj)}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjګubh5) is invalid with respect to the allowable range [0, }(hjګhhhNhNubj)}(h**max**h]hmax}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjګubh#). Any range starting at or beyond }(hjګhhhNhNubj)}(h**max**h]hmax}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjګubh$ is considered an overflow, even if }(hjګhhhNhNubj)}(h**size**h]hsize}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjګubh is 0.}(hjګhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubh)}(h **Return**h]j)}(hjWh]hReturn}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubh)}(h#true if the range is out of bounds.h]h#true if the range is out of bounds.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j range_overflows_t (C macro)c.range_overflows_thNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hrange_overflows_th]j)}(hrange_overflows_th]j{)}(hrange_overflows_th]j)}(hjh]hrange_overflows_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjj̬jj̬jjjuh1jhhhj˘hNhNubh)}(h.``range_overflows_t (type, start, size, max)``h]j)}(hjҬh]h*range_overflows_t (type, start, size, max)}(hjԬhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjЬubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj˘hhubj)}(h"Check if a range is out of bounds h]h)}(h!Check if a range is out of boundsh]h!Check if a range is out of bounds}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj˘hhubj)}(hX**Parameters** ``type`` Data type to use. ``start`` Start of the range. ``size`` Size of the range. ``max`` Exclusive upper boundary. **Description** Same as range_overflows() but forcing the parameters to **type**. **Return** true if the range is out of bounds.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj )}(hhh](j)}(h``type`` Data type to use. h](j)}(h``type``h]j)}(hj&h]htype}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj ubj2)}(hhh]h)}(hData type to use.h]hData type to use.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj<ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj;hMhjubj)}(h``start`` Start of the range. h](j)}(h ``start``h]j)}(hj_h]hstart}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjYubj2)}(hhh]h)}(hStart of the range.h]hStart of the range.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthMhjuubah}(h]h ]h"]h$]h&]uh1j1hjYubeh}(h]h ]h"]h$]h&]uh1jhjthMhjubj)}(h``size`` Size of the range. h](j)}(h``size``h]j)}(hjh]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hSize of the range.h]hSize of the range.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h"``max`` Exclusive upper boundary. h](j)}(h``max``h]j)}(hjѭh]hmax}(hjӭhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjϭubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj˭ubj2)}(hhh]h)}(hExclusive upper boundary.h]hExclusive upper boundary.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj˭ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(hASame as range_overflows() but forcing the parameters to **type**.h](h8Same as range_overflows() but forcing the parameters to }(hj"hhhNhNubj)}(h**type**h]htype}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(h **Return**h]j)}(hjEh]hReturn}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(h#true if the range is out of bounds.h]h#true if the range is out of bounds.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j range_end_overflows (C macro)c.range_end_overflowshNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hrange_end_overflowsh]j)}(hrange_end_overflowsh]j{)}(hrange_end_overflowsh]j)}(hjh]hrange_end_overflows}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h*``range_end_overflows (start, size, max)``h]j)}(hjh]h&range_end_overflows (start, size, max)}(hj®hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj˘hhubj)}(h-Check if a range's endpoint is out of bounds h]h)}(h,Check if a range's endpoint is out of boundsh]h.Check if a range’s endpoint is out of bounds}(hjڮhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj֮ubah}(h]h ]h"]h$]h&]uh1jhjhMhj˘hhubj)}(hX**Parameters** ``start`` Start of the range. ``size`` Size of the range. ``max`` Exclusive upper boundary. **Description** Checks only if the endpoint of a range (**start** + **size**) exceeds **max**. Unlike range_overflows(), a zero-sized range at the boundary (**start** == **max**) is not considered an overflow. Useful for iterator-style checks. **Return** true if the endpoint exceeds the boundary.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj )}(hhh](j)}(h``start`` Start of the range. h](j)}(h ``start``h]j)}(hjh]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hStart of the range.h]hStart of the range.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMhj*ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj)hMhj ubj)}(h``size`` Size of the range. h](j)}(h``size``h]j)}(hjMh]hsize}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjGubj2)}(hhh]h)}(hSize of the range.h]hSize of the range.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMhjcubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhjbhMhj ubj)}(h"``max`` Exclusive upper boundary. h](j)}(h``max``h]j)}(hjh]hmax}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hExclusive upper boundary.h]hExclusive upper boundary.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjïhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(hChecks only if the endpoint of a range (**start** + **size**) exceeds **max**. Unlike range_overflows(), a zero-sized range at the boundary (**start** == **max**) is not considered an overflow. Useful for iterator-style checks.h](h(Checks only if the endpoint of a range (}(hjׯhhhNhNubj)}(h **start**h]hstart}(hj߯hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjׯubh + }(hjׯhhhNhNubj)}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjׯubh ) exceeds }(hjׯhhhNhNubj)}(h**max**h]hmax}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjׯubh@. Unlike range_overflows(), a zero-sized range at the boundary (}(hjׯhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjׯubh == }(hjׯhhhNhNubj)}(h**max**h]hmax}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjׯubhB) is not considered an overflow. Useful for iterator-style checks.}(hjׯhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(h **Return**h]j)}(hjBh]hReturn}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(h*true if the endpoint exceeds the boundary.h]h*true if the endpoint exceeds the boundary.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j range_end_overflows_t (C macro)c.range_end_overflows_thNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hrange_end_overflows_th]j)}(hrange_end_overflows_th]j{)}(hrange_end_overflows_th]j)}(hjh]hrange_end_overflows_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM$ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM$ubah}(h]jzah ](jjeh"]h$]h&]jj)jhuh1jhjhM$hj|hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj|hhhjhM$ubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h2``range_end_overflows_t (type, start, size, max)``h]j)}(hjh]h.range_end_overflows_t (type, start, size, max)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM&hj˘hhubj)}(h-Check if a range's endpoint is out of bounds h]h)}(h,Check if a range's endpoint is out of boundsh]h.Check if a range’s endpoint is out of bounds}(hjװhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM$hjӰubah}(h]h ]h"]h$]h&]uh1jhjhM$hj˘hhubj)}(hX!**Parameters** ``type`` Data type to use. ``start`` Start of the range. ``size`` Size of the range. ``max`` Exclusive upper boundary. **Description** Same as range_end_overflows() but forcing the parameters to **type**. **Return** true if the endpoint exceeds the boundary.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM(hjubj )}(hhh](j)}(h``type`` Data type to use. h](j)}(h``type``h]j)}(hjh]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM%hj ubj2)}(hhh]h)}(hData type to use.h]hData type to use.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hM%hj'ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj&hM%hjubj)}(h``start`` Start of the range. h](j)}(h ``start``h]j)}(hjJh]hstart}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM&hjDubj2)}(hhh]h)}(hStart of the range.h]hStart of the range.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hM&hj`ubah}(h]h ]h"]h$]h&]uh1j1hjDubeh}(h]h ]h"]h$]h&]uh1jhj_hM&hjubj)}(h``size`` Size of the range. h](j)}(h``size``h]j)}(hjh]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM'hj}ubj2)}(hhh]h)}(hSize of the range.h]hSize of the range.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM'hjubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhjhM'hjubj)}(h"``max`` Exclusive upper boundary. h](j)}(h``max``h]j)}(hjh]hmax}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM(hjubj2)}(hhh]h)}(hExclusive upper boundary.h]hExclusive upper boundary.}(hjձhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjѱhM(hjұubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjѱhM(hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM*hjubh)}(hESame as range_end_overflows() but forcing the parameters to **type**.h](hah"]h$]h&]uh1j1hjhhhjܳhMBubj{)}(hsize_mulh]j)}(hjٳh]hsize_mul}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjܳhMBubj)}(h (size_t factor1, size_t factor2)h](j)}(hsize_t factor1h](h)}(hhh]j)}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j׳ c.size_mulasbuh1hhjubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hfactor1h]hfactor1}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsize_t factor2h](h)}(hhh]j)}(hsize_th]hsize_t}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjWmodnameN classnameNj] j` )}jc ]j׳ c.size_mulasbuh1hhjNubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj)}(hfactor2h]hfactor2}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjܳhMBubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjܳhMBubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjܳhMBhjhhubj)}(hhh]h)}(h;Calculate size_t multiplication with saturation at SIZE_MAXh]h;Calculate size_t multiplication with saturation at SIZE_MAX}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMBhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjܳhMBubeh}(h]h ](jfunctioneh"]h$]h&]jjjjôjjôjjjuh1jhhhj˘hNhNubj)}(hX**Parameters** ``size_t factor1`` first factor ``size_t factor2`` second factor **Return** calculate **factor1** * **factor2**, both promoted to size_t, with any overflow causing the return value to be SIZE_MAX. The lvalue must be size_t to avoid implicit type conversion.h](h)}(h**Parameters**h]j)}(hjʹh]h Parameters}(hjϴhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj˴ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMFhjǴubj )}(hhh](j)}(h ``size_t factor1`` first factor h](j)}(h``size_t factor1``h]j)}(hjh]hsize_t factor1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMChjubj2)}(hhh]h)}(h first factorh]h first factor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMChjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMChjubj)}(h!``size_t factor2`` second factor h](j)}(h``size_t factor2``h]j)}(hj%h]hsize_t factor2}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMDhjubj2)}(hhh]h)}(h second factorh]h second factor}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hMDhj;ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj:hMDhjubeh}(h]h ]h"]h$]h&]uh1j hjǴubh)}(h **Return**h]j)}(hj`h]hReturn}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMFhjǴubh)}(hcalculate **factor1** * **factor2**, both promoted to size_t, with any overflow causing the return value to be SIZE_MAX. The lvalue must be size_t to avoid implicit type conversion.h](h calculate }(hjvhhhNhNubj)}(h **factor1**h]hfactor1}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubh * }(hjvhhhNhNubj)}(h **factor2**h]hfactor2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubh, both promoted to size_t, with any overflow causing the return value to be SIZE_MAX. The lvalue must be size_t to avoid implicit type conversion.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMFhjǴubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j size_add (C function) c.size_addhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h0size_t size_add (size_t addend1, size_t addend2)h]j)}(h/size_t size_add(size_t addend1, size_t addend2)h](h)}(hhh]j)}(hsize_th]hsize_t}(hj̵hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɵubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjεmodnameN classnameNj] j` )}jc ]jf )}jY size_addsb c.size_addasbuh1hhjŵhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMUubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjŵhhhjhMUubj{)}(hsize_addh]j)}(hjh]hsize_add}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjŵhhhjhMUubj)}(h (size_t addend1, size_t addend2)h](j)}(hsize_t addend1h](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]j c.size_addasbuh1hhjubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(haddend1h]haddend1}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsize_t addend2h](h)}(hhh]j)}(hsize_th]hsize_t}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjhmodnameN classnameNj] j` )}jc ]j c.size_addasbuh1hhj_ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubj)}(haddend2h]haddend2}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjŵhhhjhMUubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMUubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMUhjhhubj)}(hhh]h)}(h5Calculate size_t addition with saturation at SIZE_MAXh]h5Calculate size_t addition with saturation at SIZE_MAX}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMUhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMUubeh}(h]h ](jfunctioneh"]h$]h&]jjjjԶjjԶjjjuh1jhhhj˘hNhNubj)}(hX**Parameters** ``size_t addend1`` first addend ``size_t addend2`` second addend **Return** calculate **addend1** + **addend2**, both promoted to size_t, with any overflow causing the return value to be SIZE_MAX. The lvalue must be size_t to avoid implicit type conversion.h](h)}(h**Parameters**h]j)}(hj޶h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjܶubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMYhjضubj )}(hhh](j)}(h ``size_t addend1`` first addend h](j)}(h``size_t addend1``h]j)}(hjh]hsize_t addend1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMVhjubj2)}(hhh]h)}(h first addendh]h first addend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMVhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMVhjubj)}(h!``size_t addend2`` second addend h](j)}(h``size_t addend2``h]j)}(hj6h]hsize_t addend2}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMWhj0ubj2)}(hhh]h)}(h second addendh]h second addend}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMWhjLubah}(h]h ]h"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]uh1jhjKhMWhjubeh}(h]h ]h"]h$]h&]uh1j hjضubh)}(h **Return**h]j)}(hjqh]hReturn}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMYhjضubh)}(hcalculate **addend1** + **addend2**, both promoted to size_t, with any overflow causing the return value to be SIZE_MAX. The lvalue must be size_t to avoid implicit type conversion.h](h calculate }(hjhhhNhNubj)}(h **addend1**h]haddend1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh + }(hjhhhNhNubj)}(h **addend2**h]haddend2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, both promoted to size_t, with any overflow causing the return value to be SIZE_MAX. The lvalue must be size_t to avoid implicit type conversion.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMYhjضubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j size_sub (C function) c.size_subhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h3size_t size_sub (size_t minuend, size_t subtrahend)h]j)}(h2size_t size_sub(size_t minuend, size_t subtrahend)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjݷhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڷubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj߷modnameN classnameNj] j` )}jc ]jf )}jY size_subsb c.size_subasbuh1hhjַhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjַhhhjhMhubj{)}(hsize_subh]j)}(hjh]hsize_sub}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjַhhhjhMhubj)}(h#(size_t minuend, size_t subtrahend)h](j)}(hsize_t minuendh](h)}(hhh]j)}(hsize_th]hsize_t}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj1modnameN classnameNj] j` )}jc ]j c.size_subasbuh1hhj(ubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(ubj)}(hminuendh]hminuend}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj$ubj)}(hsize_t subtrahendh](h)}(hhh]j)}(hsize_th]hsize_t}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjymodnameN classnameNj] j` )}jc ]j c.size_subasbuh1hhjpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubj)}(h subtrahendh]h subtrahend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj$ubeh}(h]h ]h"]h$]h&]jjuh1jhjַhhhjhMhubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjҷhhhjhMhubah}(h]jͷah ](jjeh"]h$]h&]jj)jhuh1jhjhMhhjϷhhubj)}(hhh]h)}(h8Calculate size_t subtraction with saturation at SIZE_MAXh]h8Calculate size_t subtraction with saturation at SIZE_MAX}(hj͸hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhhjʸhhubah}(h]h ]h"]h$]h&]uh1jhjϷhhhjhMhubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubj)}(hX**Parameters** ``size_t minuend`` value to subtract from ``size_t subtrahend`` value to subtract from **minuend** **Return** calculate **minuend** - **subtrahend**, both promoted to size_t, with any overflow causing the return value to be SIZE_MAX. For composition with the size_add() and size_mul() helpers, neither argument may be SIZE_MAX (or the result with be forced to SIZE_MAX). The lvalue must be size_t to avoid implicit type conversion.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMlhjubj )}(hhh](j)}(h*``size_t minuend`` value to subtract from h](j)}(h``size_t minuend``h]j)}(hjh]hsize_t minuend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMihjubj2)}(hhh]h)}(hvalue to subtract fromh]hvalue to subtract from}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMihj$ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj#hMihjubj)}(h9``size_t subtrahend`` value to subtract from **minuend** h](j)}(h``size_t subtrahend``h]j)}(hjGh]hsize_t subtrahend}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMjhjAubj2)}(hhh]h)}(h"value to subtract from **minuend**h](hvalue to subtract from }(hj`hhhNhNubj)}(h **minuend**h]hminuend}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1hhj\hMjhj]ubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj\hMjhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMlhjubh)}(hXAcalculate **minuend** - **subtrahend**, both promoted to size_t, with any overflow causing the return value to be SIZE_MAX. For composition with the size_add() and size_mul() helpers, neither argument may be SIZE_MAX (or the result with be forced to SIZE_MAX). The lvalue must be size_t to avoid implicit type conversion.h](h calculate }(hjhhhNhNubj)}(h **minuend**h]hminuend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh - }(hjhhhNhNubj)}(h**subtrahend**h]h subtrahend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX, both promoted to size_t, with any overflow causing the return value to be SIZE_MAX. For composition with the size_add() and size_mul() helpers, neither argument may be SIZE_MAX (or the result with be forced to SIZE_MAX). The lvalue must be size_t to avoid implicit type conversion.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMlhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j array_size (C macro) c.array_sizehNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h array_sizeh]j)}(h array_sizeh]j{)}(h array_sizeh]j)}(hjh]h array_size}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM~ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM~ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM~hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhM~ubeh}(h]h ](jmacroeh"]h$]h&]jjjj)jj)jjjuh1jhhhj˘hNhNubh)}(h``array_size (a, b)``h]j)}(hj/h]harray_size (a, b)}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj˘hhubj)}(h'Calculate size of 2-dimensional array. h]h)}(h&Calculate size of 2-dimensional array.h]h&Calculate size of 2-dimensional array.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM~hjEubah}(h]h ]h"]h$]h&]uh1jhjWhM~hj˘hhubj)}(h**Parameters** ``a`` dimension one ``b`` dimension two **Description** Calculates size of 2-dimensional array: **a** * **b**. **Return** number of bytes needed to represent the array or SIZE_MAX on overflow.h](h)}(h**Parameters**h]j)}(hjdh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj^ubj )}(hhh](j)}(h``a`` dimension one h](j)}(h``a``h]j)}(hjh]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj}ubj2)}(hhh]h)}(h dimension oneh]h dimension one}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjzubj)}(h``b`` dimension two h](j)}(h``b``h]j)}(hjh]hb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(h dimension twoh]h dimension two}(hjպhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjѺhMhjҺubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjѺhMhjzubeh}(h]h ]h"]h$]h&]uh1j hj^ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj^ubh)}(h6Calculates size of 2-dimensional array: **a** * **b**.h](h(Calculates size of 2-dimensional array: }(hj hhhNhNubj)}(h**a**h]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh * }(hj hhhNhNubj)}(h**b**h]hb}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj^ubh)}(h **Return**h]j)}(hjBh]hReturn}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj^ubh)}(hFnumber of bytes needed to represent the array or SIZE_MAX on overflow.h]hFnumber of bytes needed to represent the array or SIZE_MAX on overflow.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j array3_size (C macro) c.array3_sizehNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h array3_sizeh]j)}(h array3_sizeh]j{)}(h array3_sizeh]j)}(hjh]h array3_size}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jzah ](jjeh"]h$]h&]jj)jhuh1jhjhMhj|hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj|hhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h``array3_size (a, b, c)``h]j)}(hjh]harray3_size (a, b, c)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj˘hhubj)}(h'Calculate size of 3-dimensional array. h]h)}(h&Calculate size of 3-dimensional array.h]h&Calculate size of 3-dimensional array.}(hj׻hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjӻubah}(h]h ]h"]h$]h&]uh1jhjhMhj˘hhubj)}(h**Parameters** ``a`` dimension one ``b`` dimension two ``c`` dimension three **Description** Calculates size of 3-dimensional array: **a** * **b** * **c**. **Return** number of bytes needed to represent the array or SIZE_MAX on overflow.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj )}(hhh](j)}(h``a`` dimension one h](j)}(h``a``h]j)}(hjh]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj ubj2)}(hhh]h)}(h dimension oneh]h dimension one}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMhj'ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhjubj)}(h``b`` dimension two h](j)}(h``b``h]j)}(hjJh]hb}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjDubj2)}(hhh]h)}(h dimension twoh]h dimension two}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hMhj`ubah}(h]h ]h"]h$]h&]uh1j1hjDubeh}(h]h ]h"]h$]h&]uh1jhj_hMhjubj)}(h``c`` dimension three h](j)}(h``c``h]j)}(hjh]hc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj}ubj2)}(hhh]h)}(hdimension threeh]hdimension three}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(h>Calculates size of 3-dimensional array: **a** * **b** * **c**.h](h(Calculates size of 3-dimensional array: }(hjԼhhhNhNubj)}(h**a**h]ha}(hjܼhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԼubh * }(hjԼhhhNhNubj)}(h**b**h]hb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԼubh * }hjԼsbj)}(h**c**h]hc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԼubh.}(hjԼhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(hFnumber of bytes needed to represent the array or SIZE_MAX on overflow.h]hFnumber of bytes needed to represent the array or SIZE_MAX on overflow.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j flex_array_size (C macro)c.flex_array_sizehNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hflex_array_sizeh]j)}(hflex_array_sizeh]j{)}(hflex_array_sizeh]j)}(hjZh]hflex_array_size}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj\hhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjXhhhjwhMubah}(h]jSah ](jjeh"]h$]h&]jj)jhuh1jhjwhMhjUhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjUhhhjwhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h&``flex_array_size (p, member, count)``h]j)}(hjh]h"flex_array_size (p, member, count)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj˘hhubj)}(hICalculate size of a flexible array member within an enclosing structure. h]h)}(hHCalculate size of a flexible array member within an enclosing structure.h]hHCalculate size of a flexible array member within an enclosing structure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj˘hhubj)}(hXN**Parameters** ``p`` Pointer to the structure. ``member`` Name of the flexible array member. ``count`` Number of elements in the array. **Description** Calculates size of a flexible array of **count** number of **member** elements, at the end of structure **p**. **Return** number of bytes needed or SIZE_MAX on overflow.h](h)}(h**Parameters**h]j)}(hj˽h]h Parameters}(hjͽhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɽubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjŽubj )}(hhh](j)}(h ``p`` Pointer to the structure. h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hPointer to the structure.h]hPointer to the structure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h.``member`` Name of the flexible array member. h](j)}(h ``member``h]j)}(hj#h]hmember}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(h"Name of the flexible array member.h]h"Name of the flexible array member.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj9ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj8hMhjubj)}(h+``count`` Number of elements in the array. h](j)}(h ``count``h]j)}(hj\h]hcount}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjVubj2)}(hhh]h)}(h Number of elements in the array.h]h Number of elements in the array.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhMhjrubah}(h]h ]h"]h$]h&]uh1j1hjVubeh}(h]h ]h"]h$]h&]uh1jhjqhMhjubeh}(h]h ]h"]h$]h&]uh1j hjŽubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjŽubh)}(hnCalculates size of a flexible array of **count** number of **member** elements, at the end of structure **p**.h](h'Calculates size of a flexible array of }(hjhhhNhNubj)}(h **count**h]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh number of }(hjhhhNhNubj)}(h **member**h]hmember}(hjǾhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh# elements, at the end of structure }(hjhhhNhNubj)}(h**p**h]hp}(hjپhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjŽubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjŽubh)}(h/number of bytes needed or SIZE_MAX on overflow.h]h/number of bytes needed or SIZE_MAX on overflow.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjŽubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j struct_size (C macro) c.struct_sizehNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h struct_sizeh]j)}(h struct_sizeh]j{)}(h struct_sizeh]j)}(hj3h]h struct_size}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj5hhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj1hhhjPhMubah}(h]j,ah ](jjeh"]h$]h&]jj)jhuh1jhjPhMhj.hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj.hhhjPhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjijjijjjuh1jhhhj˘hNhNubh)}(h"``struct_size (p, member, count)``h]j)}(hjoh]hstruct_size (p, member, count)}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj˘hhubj)}(h:Calculate size of structure with trailing flexible array. h]h)}(h9Calculate size of structure with trailing flexible array.h]h9Calculate size of structure with trailing flexible array.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj˘hhubj)}(hXO**Parameters** ``p`` Pointer to the structure. ``member`` Name of the array member. ``count`` Number of elements in the array. **Description** Calculates size of memory needed for structure of **p** followed by an array of **count** number of **member** elements. **Return** number of bytes needed or SIZE_MAX on overflow.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj )}(hhh](j)}(h ``p`` Pointer to the structure. h](j)}(h``p``h]j)}(hjÿh]hp}(hjſhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hPointer to the structure.h]hPointer to the structure.}(hjܿhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjؿhMhjٿubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjؿhMhjubj)}(h%``member`` Name of the array member. h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hName of the array member.h]hName of the array member.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h+``count`` Number of elements in the array. h](j)}(h ``count``h]j)}(hj5h]hcount}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj/ubj2)}(hhh]h)}(h Number of elements in the array.h]h Number of elements in the array.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMhjKubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhjJhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjph]h Description}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(hxCalculates size of memory needed for structure of **p** followed by an array of **count** number of **member** elements.h](h2Calculates size of memory needed for structure of }(hjhhhNhNubj)}(h**p**h]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh followed by an array of }(hjhhhNhNubj)}(h **count**h]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh number of }(hjhhhNhNubj)}(h **member**h]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh elements.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubh)}(h/number of bytes needed or SIZE_MAX on overflow.h]h/number of bytes needed or SIZE_MAX on overflow.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j struct_size_t (C macro)c.struct_size_thNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h struct_size_th]j)}(h struct_size_th]j{)}(h struct_size_th]j)}(hj h]h struct_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj)hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj)hMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj)hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjBjjBjjjuh1jhhhj˘hNhNubh)}(h'``struct_size_t (type, member, count)``h]j)}(hjHh]h#struct_size_t (type, member, count)}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj˘hhubj)}(h9Calculate size of structure with trailing flexible array h]h)}(h8Calculate size of structure with trailing flexible arrayh]h8Calculate size of structure with trailing flexible array}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj^ubah}(h]h ]h"]h$]h&]uh1jhjphMhj˘hhubj)}(hX**Parameters** ``type`` structure type name. ``member`` Name of the array member. ``count`` Number of elements in the array. **Description** Calculates size of memory needed for structure **type** followed by an array of **count** number of **member** elements. Prefer using struct_size() when possible instead, to keep calculations associated with a specific instance variable of type **type**. **Return** number of bytes needed or SIZE_MAX on overflow.h](h)}(h**Parameters**h]j)}(hj}h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjwubj )}(hhh](j)}(h``type`` structure type name. h](j)}(h``type``h]j)}(hjh]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hstructure type name.h]hstructure type name.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h%``member`` Name of the array member. h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hName of the array member.h]hName of the array member.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h+``count`` Number of elements in the array. h](j)}(h ``count``h]j)}(hjh]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(h Number of elements in the array.h]h Number of elements in the array.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMhj$ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj#hMhjubeh}(h]h ]h"]h$]h&]uh1j hjwubh)}(h**Description**h]j)}(hjIh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjwubh)}(hCalculates size of memory needed for structure **type** followed by an array of **count** number of **member** elements. Prefer using struct_size() when possible instead, to keep calculations associated with a specific instance variable of type **type**.h](h/Calculates size of memory needed for structure }(hj_hhhNhNubj)}(h**type**h]htype}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh followed by an array of }(hj_hhhNhNubj)}(h **count**h]hcount}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh number of }(hj_hhhNhNubj)}(h **member**h]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh elements. Prefer using struct_size() when possible instead, to keep calculations associated with a specific instance variable of type }(hj_hhhNhNubj)}(h**type**h]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh.}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjwubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjwubh)}(h/number of bytes needed or SIZE_MAX on overflow.h]h/number of bytes needed or SIZE_MAX on overflow.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjwubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j struct_offset (C macro)c.struct_offsethNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h struct_offseth]j)}(h struct_offseth]j{)}(h struct_offseth]j)}(hjh]h struct_offset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjj-jj-jjjuh1jhhhj˘hNhNubh)}(h``struct_offset (p, member)``h]j)}(hj3h]hstruct_offset (p, member)}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj˘hhubj)}(h1Calculate the offset of a member within a struct h]h)}(h0Calculate the offset of a member within a structh]h0Calculate the offset of a member within a struct}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjIubah}(h]h ]h"]h$]h&]uh1jhj[hMhj˘hhubj)}(hX**Parameters** ``p`` Pointer to the struct ``member`` Name of the member to get the offset of **Description** Calculates the offset of a particular **member** of the structure pointed to by **p**. **Return** number of bytes to the location of **member**.h](h)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjbubj )}(hhh](j)}(h``p`` Pointer to the struct h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hPointer to the structh]hPointer to the struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj~ubj)}(h3``member`` Name of the member to get the offset of h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(h'Name of the member to get the offset ofh]h'Name of the member to get the offset of}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj~ubeh}(h]h ]h"]h$]h&]uh1j hjbubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjbubh)}(hVCalculates the offset of a particular **member** of the structure pointed to by **p**.h](h&Calculates the offset of a particular }(hjhhhNhNubj)}(h **member**h]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh of the structure pointed to by }(hjhhhNhNubj)}(h**p**h]hp}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjbubh)}(h **Return**h]j)}(hjFh]hReturn}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjbubh)}(h.number of bytes to the location of **member**.h](h#number of bytes to the location of }(hj\hhhNhNubj)}(h **member**h]hmember}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh.}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __DEFINE_FLEX (C macro)c.__DEFINE_FLEXhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h __DEFINE_FLEXh]j)}(h __DEFINE_FLEXh]j{)}(h __DEFINE_FLEXh]j)}(hjh]h __DEFINE_FLEX}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h9``__DEFINE_FLEX (type, name, member, count, trailer...)``h]j)}(hjh]h5__DEFINE_FLEX (type, name, member, count, trailer...)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj˘hhubj)}(hchelper macro for DEFINE_FLEX() family. Enables caller macro to pass arbitrary trailing expressions h]h)}(hbhelper macro for DEFINE_FLEX() family. Enables caller macro to pass arbitrary trailing expressionsh]hbhelper macro for DEFINE_FLEX() family. Enables caller macro to pass arbitrary trailing expressions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj˘hhubj)}(hX3**Parameters** ``type`` structure type name, including "struct" keyword. ``name`` Name for a variable to define. ``member`` Name of the array member. ``count`` Number of elements in the array; must be compile-time const. ``trailer...`` Trailing expressions for attributes and/or initializers.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj )}(hhh](j)}(h:``type`` structure type name, including "struct" keyword. h](j)}(h``type``h]j)}(hj'h]htype}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj!ubj2)}(hhh]h)}(h0structure type name, including "struct" keyword.h]h4structure type name, including “struct” keyword.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj=ubah}(h]h ]h"]h$]h&]uh1j1hj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhjubj)}(h(``name`` Name for a variable to define. h](j)}(h``name``h]j)}(hj`h]hname}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjZubj2)}(hhh]h)}(hName for a variable to define.h]hName for a variable to define.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhMhjvubah}(h]h ]h"]h$]h&]uh1j1hjZubeh}(h]h ]h"]h$]h&]uh1jhjuhMhjubj)}(h%``member`` Name of the array member. h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hName of the array member.h]hName of the array member.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hG``count`` Number of elements in the array; must be compile-time const. h](j)}(h ``count``h]j)}(hjh]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hMhjubj)}(h%``member`` Name of the array member. h](j)}(h ``member``h]j)}(hjah]hmember}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj[ubj2)}(hhh]h)}(hName of the array member.h]hName of the array member.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhMhjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjubj)}(hG``count`` Number of elements in the array; must be compile-time const. h](j)}(h ``count``h]j)}(hjh]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hmember**) to get compile-time size of **name** members. Use STACK_FLEX_ARRAY_SIZE(**name**, **member**) to get compile-time number of elements in array **member**.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj )}(hhh](j)}(h:``type`` structure type name, including "struct" keyword. h](j)}(h``type``h]j)}(hjh]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(h0structure type name, including "struct" keyword.h]h4structure type name, including “struct” keyword.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h(``name`` Name for a variable to define. h](j)}(h``name``h]j)}(hjh]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hName for a variable to define.h]hName for a variable to define.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h%``member`` Name of the array member. h](j)}(h ``member``h]j)}(hj=h]hmember}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj7ubj2)}(hhh]h)}(hName of the array member.h]hName of the array member.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhjSubah}(h]h ]h"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhMhjubj)}(hG``count`` Number of elements in the array; must be compile-time const. h](j)}(h ``count``h]j)}(hjvh]hcount}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjpubj2)}(hhh]h)}(hmember**) to get compile-time size of **name** members. Use STACK_FLEX_ARRAY_SIZE(**name**, **member**) to get compile-time number of elements in array **member**.h](h'Define a zeroed, on-stack, instance of }(hjhhhNhNubj)}(h**type**h]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhD structure with a trailing flexible array member. Use __struct_size(}(hjhhhNhNubj)}(h**name**h]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh?) to get compile-time size of it afterwards. Use __member_size(}(hjhhhNhNubj)}(h**name->member**h]h name->member}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) to get compile-time size of }(hjhhhNhNubj)}(h**name**h]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh$ members. Use STACK_FLEX_ARRAY_SIZE(}(hjhhhNhNubj)}(h**name**h]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(h **member**h]hmember}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2) to get compile-time number of elements in array }(hjhhhNhNubj)}(h **member**h]hmember}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j DEFINE_FLEX (C macro) c.DEFINE_FLEXhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h DEFINE_FLEXh]j)}(h DEFINE_FLEXh]j{)}(h DEFINE_FLEXh]j)}(hjnh]h DEFINE_FLEX}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjphhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjlhhhjhMubah}(h]jgah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjihhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjihhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h4``DEFINE_FLEX (TYPE, NAME, MEMBER, COUNTER, COUNT)``h]j)}(hjh]h0DEFINE_FLEX (TYPE, NAME, MEMBER, COUNTER, COUNT)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM hj˘hhubj)}(hPDefine an on-stack instance of structure with a trailing flexible array member. h]h)}(hODefine an on-stack instance of structure with a trailing flexible array member.h]hODefine an on-stack instance of structure with a trailing flexible array member.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj˘hhubj)}(hX**Parameters** ``TYPE`` structure type name, including "struct" keyword. ``NAME`` Name for a variable to define. ``MEMBER`` Name of the array member. ``COUNTER`` Name of the __counted_by member. ``COUNT`` Number of elements in the array; must be compile-time const. **Description** Define a zeroed, on-stack, instance of **TYPE** structure with a trailing flexible array member. Use __struct_size(**NAME**) to get compile-time size of it afterwards. Use __member_size(**NAME->member**) to get compile-time size of **NAME** members. Use STACK_FLEX_ARRAY_SIZE(**name**, **member**) to get compile-time number of elements in array **member**.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM hjubj )}(hhh](j)}(h:``TYPE`` structure type name, including "struct" keyword. h](j)}(h``TYPE``h]j)}(hjh]hTYPE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM hjubj2)}(hhh]h)}(h0structure type name, including "struct" keyword.h]h4structure type name, including “struct” keyword.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h(``NAME`` Name for a variable to define. h](j)}(h``NAME``h]j)}(hj7h]hNAME}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM hj1ubj2)}(hhh]h)}(hName for a variable to define.h]hName for a variable to define.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhM hjMubah}(h]h ]h"]h$]h&]uh1j1hj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhM hjubj)}(h%``MEMBER`` Name of the array member. h](j)}(h ``MEMBER``h]j)}(hjph]hMEMBER}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM hjjubj2)}(hhh]h)}(hName of the array member.h]hName of the array member.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h-``COUNTER`` Name of the __counted_by member. h](j)}(h ``COUNTER``h]j)}(hjh]hCOUNTER}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM hjubj2)}(hhh]h)}(h Name of the __counted_by member.h]h Name of the __counted_by member.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(hG``COUNT`` Number of elements in the array; must be compile-time const. h](j)}(h ``COUNT``h]j)}(hjh]hCOUNT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubj2)}(hhh]h)}(hmember**) to get compile-time size of **NAME** members. Use STACK_FLEX_ARRAY_SIZE(**name**, **member**) to get compile-time number of elements in array **member**.h](h'Define a zeroed, on-stack, instance of }(hj3hhhNhNubj)}(h**TYPE**h]hTYPE}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubhD structure with a trailing flexible array member. Use __struct_size(}(hj3hhhNhNubj)}(h**NAME**h]hNAME}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh?) to get compile-time size of it afterwards. Use __member_size(}(hj3hhhNhNubj)}(h**NAME->member**h]h NAME->member}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh) to get compile-time size of }(hj3hhhNhNubj)}(h**NAME**h]hNAME}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh$ members. Use STACK_FLEX_ARRAY_SIZE(}(hj3hhhNhNubj)}(h**name**h]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh, }(hj3hhhNhNubj)}(h **member**h]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh2) to get compile-time number of elements in array }(hj3hhhNhNubj)}(h **member**h]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j STACK_FLEX_ARRAY_SIZE (C macro)c.STACK_FLEX_ARRAY_SIZEhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hSTACK_FLEX_ARRAY_SIZEh]j)}(hSTACK_FLEX_ARRAY_SIZEh]j{)}(hSTACK_FLEX_ARRAY_SIZEh]j)}(hjh]hSTACK_FLEX_ARRAY_SIZE}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj˘hNhNubh)}(h'``STACK_FLEX_ARRAY_SIZE (name, array)``h]j)}(hjh]h#STACK_FLEX_ARRAY_SIZE (name, array)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj˘hhubj)}(hThelper macro for DEFINE_FLEX() family. Returns the number of elements in **array**. h]h)}(hShelper macro for DEFINE_FLEX() family. Returns the number of elements in **array**.h](hIhelper macro for DEFINE_FLEX() family. Returns the number of elements in }(hj0hhhNhNubj)}(h **array**h]harray}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubh.}(hj0hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhj,ubah}(h]h ]h"]h$]h&]uh1jhjPhMhj˘hhubj)}(h**Parameters** ``name`` Name for a variable defined in DEFINE_RAW_FLEX()/DEFINE_FLEX(). ``array`` Name of the array member.h](h)}(h**Parameters**h]j)}(hj]h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjWubj )}(hhh](j)}(hI``name`` Name for a variable defined in DEFINE_RAW_FLEX()/DEFINE_FLEX(). h](j)}(h``name``h]j)}(hj|h]hname}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjvubj2)}(hhh]h)}(h?Name for a variable defined in DEFINE_RAW_FLEX()/DEFINE_FLEX().h]h?Name for a variable defined in DEFINE_RAW_FLEX()/DEFINE_FLEX().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhMhjsubj)}(h#``array`` Name of the array member.h](j)}(h ``array``h]j)}(hjh]harray}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM hjubj2)}(hhh]h)}(hName of the array member.h]hName of the array member.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjsubeh}(h]h ]h"]h$]h&]uh1j hjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j typeof_flex_counter (C macro)c.typeof_flex_counterhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(htypeof_flex_counterh]j)}(htypeof_flex_counterh]j{)}(htypeof_flex_counterh]j)}(hj h]htypeof_flex_counter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM&ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj&hM&ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj&hM&hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj&hM&ubeh}(h]h ](jmacroeh"]h$]h&]jjjj?jj?jjjuh1jhhhj˘hNhNubh)}(h``typeof_flex_counter (FAM)``h]j)}(hjEh]htypeof_flex_counter (FAM)}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM(hj˘hhubj)}(hfReturn the type of the counter variable of a given flexible array member annotated by __counted_by(). h]h)}(heReturn the type of the counter variable of a given flexible array member annotated by __counted_by().h]heReturn the type of the counter variable of a given flexible array member annotated by __counted_by().}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM&hj[ubah}(h]h ]h"]h$]h&]uh1jhjmhM&hj˘hhubj)}(h**Parameters** ``FAM`` Instance of flexible array member within a given struct. **Return** "size_t" if no annotation exists.h](h)}(h**Parameters**h]j)}(hjzh]h Parameters}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM*hjtubj )}(hhh]j)}(hA``FAM`` Instance of flexible array member within a given struct. h](j)}(h``FAM``h]j)}(hjh]hFAM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM(hjubj2)}(hhh]h)}(h8Instance of flexible array member within a given struct.h]h8Instance of flexible array member within a given struct.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM(hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM(hjubah}(h]h ]h"]h$]h&]uh1j hjtubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM*hjtubh)}(h!"size_t" if no annotation exists.h]h%“size_t” if no annotation exists.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM*hjtubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %overflows_flex_counter_type (C macro)c.overflows_flex_counter_typehNtauh1hhj˘hhhNhNubj)}(hhh](j)}(hoverflows_flex_counter_typeh]j)}(hoverflows_flex_counter_typeh]j{)}(hoverflows_flex_counter_typeh]j)}(hjh]hoverflows_flex_counter_type}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM2ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj0hM2ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj0hM2hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj0hM2ubeh}(h]h ](jmacroeh"]h$]h&]jjjjIjjIjjjuh1jhhhj˘hNhNubh)}(h2``overflows_flex_counter_type (TYPE, FAM, COUNT)``h]j)}(hjOh]h.overflows_flex_counter_type (TYPE, FAM, COUNT)}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM4hj˘hhubj)}(h\Check if the counter associated with the given flexible array member can represent a value. h]h)}(h[Check if the counter associated with the given flexible array member can represent a value.h]h[Check if the counter associated with the given flexible array member can represent a value.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM2hjeubah}(h]h ]h"]h$]h&]uh1jhjwhM2hj˘hhubj)}(hXa**Parameters** ``TYPE`` Type of the struct that contains the **FAM**. ``FAM`` Member name of the FAM within **TYPE**. ``COUNT`` Value to check against the __counted_by annotated **FAM**'s counter. **Return** true if **COUNT** can be represented in the **FAM**'s counter. When **FAM** is not annotated with __counted_by(), always returns true.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM6hj~ubj )}(hhh](j)}(h7``TYPE`` Type of the struct that contains the **FAM**. h](j)}(h``TYPE``h]j)}(hjh]hTYPE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM5hjubj2)}(hhh]h)}(h-Type of the struct that contains the **FAM**.h](h%Type of the struct that contains the }(hjhhhNhNubj)}(h**FAM**h]hFAM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM5hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM5hjubj)}(h0``FAM`` Member name of the FAM within **TYPE**. h](j)}(h``FAM``h]j)}(hjh]hFAM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM6hjubj2)}(hhh]h)}(h'Member name of the FAM within **TYPE**.h](hMember name of the FAM within }(hjhhhNhNubj)}(h**TYPE**h]hTYPE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM6hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM6hjubj)}(hO``COUNT`` Value to check against the __counted_by annotated **FAM**'s counter. h](j)}(h ``COUNT``h]j)}(hj9h]hCOUNT}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM7hj3ubj2)}(hhh]h)}(hDValue to check against the __counted_by annotated **FAM**'s counter.h](h2Value to check against the __counted_by annotated }(hjRhhhNhNubj)}(h**FAM**h]hFAM}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubh ’s counter.}(hjRhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjNhM7hjOubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhjNhM7hjubeh}(h]h ]h"]h$]h&]uh1j hj~ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM9hj~ubh)}(htrue if **COUNT** can be represented in the **FAM**'s counter. When **FAM** is not annotated with __counted_by(), always returns true.h](htrue if }(hjhhhNhNubj)}(h **COUNT**h]hCOUNT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh can be represented in the }(hjhhhNhNubj)}(h**FAM**h]hFAM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh’s counter. When }(hjhhhNhNubj)}(h**FAM**h]hFAM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh; is not annotated with __counted_by(), always returns true.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM9hj~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __set_flex_counter (C macro)c.__set_flex_counterhNtauh1hhj˘hhhNhNubj)}(hhh](j)}(h__set_flex_counterh]j)}(h__set_flex_counterh]j{)}(h__set_flex_counterh]j)}(hjh]h__set_flex_counter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM@ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM@ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM@hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhM@ubeh}(h]h ](jmacroeh"]h$]h&]jjjj1jj1jjjuh1jhhhj˘hNhNubh)}(h#``__set_flex_counter (FAM, COUNT)``h]j)}(hj7h]h__set_flex_counter (FAM, COUNT)}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMBhj˘hhubj)}(hjSet the counter associated with the given flexible array member that has been annoated by __counted_by(). h]h)}(hiSet the counter associated with the given flexible array member that has been annoated by __counted_by().h]hiSet the counter associated with the given flexible array member that has been annoated by __counted_by().}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhM@hjMubah}(h]h ]h"]h$]h&]uh1jhj_hM@hj˘hhubj)}(hX7**Parameters** ``FAM`` Instance of flexible array member within a given struct. ``COUNT`` Value to store to the __counted_by annotated **FAM_PTR**'s counter. **Description** This is a no-op if no annotation exists. Count needs to be checked with overflows_flex_counter_type() before using this function.h](h)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMDhjfubj )}(hhh](j)}(hA``FAM`` Instance of flexible array member within a given struct. h](j)}(h``FAM``h]j)}(hjh]hFAM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMBhjubj2)}(hhh]h)}(h8Instance of flexible array member within a given struct.h]h8Instance of flexible array member within a given struct.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMBhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMBhjubj)}(hN``COUNT`` Value to store to the __counted_by annotated **FAM_PTR**'s counter. h](j)}(h ``COUNT``h]j)}(hjh]hCOUNT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMChjubj2)}(hhh]h)}(hCValue to store to the __counted_by annotated **FAM_PTR**'s counter.h](h-Value to store to the __counted_by annotated }(hjhhhNhNubj)}(h **FAM_PTR**h]hFAM_PTR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ’s counter.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMChjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMChjubeh}(h]h ]h"]h$]h&]uh1j hjfubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMEhjfubh)}(hThis is a no-op if no annotation exists. Count needs to be checked with overflows_flex_counter_type() before using this function.h]hThis is a no-op if no annotation exists. Count needs to be checked with overflows_flex_counter_type() before using this function.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:127: ./include/linux/overflow.hhMDhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj˘hhhNhNubeh}(h]arithmetic-overflow-checkingah ]h"]arithmetic overflow checkingah$]h&]uh1hhjhhhhhK}ubh)}(hhh](h)}(h CRC Functionsh]h CRC Functions}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc4 (C function)c.crc4hNtauh1hhjEhhhNhNubj)}(hhh](j)}(h.uint8_t crc4 (uint8_t c, uint64_t x, int bits)h]j)}(h-uint8_t crc4(uint8_t c, uint64_t x, int bits)h](h)}(hhh]j)}(huint8_th]huint8_t}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]jf )}jY crc4sbc.crc4asbuh1hhjkhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:133: ./lib/crc/crc4.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkhhhjhKubj{)}(hcrc4h]j)}(hjh]hcrc4}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjkhhhjhKubj)}(h!(uint8_t c, uint64_t x, int bits)h](j)}(h uint8_t ch](h)}(hhh]j)}(huint8_th]huint8_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.crc4asbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]hc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h uint64_t xh](h)}(hhh]j)}(huint64_th]huint64_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jc.crc4asbuh1hhjubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hxh]hx}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint bitsh](j )}(hinth]hint}(hjPhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hbitsh]hbits}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjkhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjghhhjhKubah}(h]jbah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjdhhubj)}(hhh]h)}(h#calculate the 4-bit crc of a value.h]h#calculate the 4-bit crc of a value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:133: ./lib/crc/crc4.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjdhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjEhNhNubj)}(hX<**Parameters** ``uint8_t c`` starting crc4 ``uint64_t x`` value to checksum ``int bits`` number of bits in **x** to checksum **Description** Returns the crc4 value of **x**, using polynomial 0b10111. The **x** value is treated as left-aligned, and bits above **bits** are ignored in the crc calculations.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:133: ./lib/crc/crc4.chKhjubj )}(hhh](j)}(h``uint8_t c`` starting crc4 h](j)}(h ``uint8_t c``h]j)}(hjh]h uint8_t c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:133: ./lib/crc/crc4.chKhjubj2)}(hhh]h)}(h starting crc4h]h starting crc4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h!``uint64_t x`` value to checksum h](j)}(h``uint64_t x``h]j)}(hjh]h uint64_t x}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:133: ./lib/crc/crc4.chKhj ubj2)}(hhh]h)}(hvalue to checksumh]hvalue to checksum}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hKhj&ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj%hKhjubj)}(h1``int bits`` number of bits in **x** to checksum h](j)}(h ``int bits``h]j)}(hjIh]hint bits}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:133: ./lib/crc/crc4.chKhjCubj2)}(hhh]h)}(h#number of bits in **x** to checksumh](hnumber of bits in }(hjbhhhNhNubj)}(h**x**h]hx}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh to checksum}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj^hKhj_ubah}(h]h ]h"]h$]h&]uh1j1hjCubeh}(h]h ]h"]h$]h&]uh1jhj^hKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:133: ./lib/crc/crc4.chKhjubh)}(h:Returns the crc4 value of **x**, using polynomial 0b10111.h](hReturns the crc4 value of }(hjhhhNhNubj)}(h**x**h]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, using polynomial 0b10111.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:133: ./lib/crc/crc4.chKhjubh)}(hhThe **x** value is treated as left-aligned, and bits above **bits** are ignored in the crc calculations.h](hThe }(hjhhhNhNubj)}(h**x**h]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 value is treated as left-aligned, and bits above }(hjhhhNhNubj)}(h**bits**h]hbits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh% are ignored in the crc calculations.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:133: ./lib/crc/crc4.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc7_be (C function) c.crc7_behNtauh1hhjEhhhNhNubj)}(hhh](j)}(h1u8 crc7_be (u8 crc, const u8 *buffer, size_t len)h]j)}(h0u8 crc7_be(u8 crc, const u8 *buffer, size_t len)h](h)}(hhh]j)}(hu8h]hu8}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj%modnameN classnameNj] j` )}jc ]jf )}jY crc7_besb c.crc7_beasbuh1hhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:136: ./lib/crc/crc7.chK5ubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjDhK5ubj{)}(hcrc7_beh]j)}(hjAh]hcrc7_be}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjDhK5ubj)}(h&(u8 crc, const u8 *buffer, size_t len)h](j)}(hu8 crch](h)}(hhh]j)}(hu8h]hu8}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjwmodnameN classnameNj] j` )}jc ]j? c.crc7_beasbuh1hhjnubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubj)}(hcrch]hcrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjjubj)}(hconst u8 *bufferh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j? c.crc7_beasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufferh]hbuffer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjjubj)}(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&] refdomainjreftypejY reftargetj/modnameN classnameNj] j` )}jc ]j? c.crc7_beasbuh1hhj&ubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj)}(hlenh]hlen}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjDhK5ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjDhK5ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjDhK5hjhhubj)}(hhh]h)}(h#update the CRC7 for the data bufferh]h#update the CRC7 for the data buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:136: ./lib/crc/crc7.chK5hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjDhK5ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjEhNhNubj)}(hXS**Parameters** ``u8 crc`` previous CRC7 value ``const u8 *buffer`` data pointer ``size_t len`` number of bytes in the buffer **Context** any **Description** Returns the updated CRC7 value. The CRC7 is left-aligned in the byte (the lsbit is always 0), as that makes the computation easier, and all callers want it in that form.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:136: ./lib/crc/crc7.chK9hjubj )}(hhh](j)}(h``u8 crc`` previous CRC7 value h](j)}(h ``u8 crc``h]j)}(hjh]hu8 crc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:136: ./lib/crc/crc7.chK6hjubj2)}(hhh]h)}(hprevious CRC7 valueh]hprevious CRC7 value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK6hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK6hjubj)}(h"``const u8 *buffer`` data pointer h](j)}(h``const u8 *buffer``h]j)}(hjh]hconst u8 *buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:136: ./lib/crc/crc7.chK7hjubj2)}(hhh]h)}(h data pointerh]h data pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK7hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK7hjubj)}(h-``size_t len`` number of bytes in the buffer h](j)}(h``size_t len``h]j)}(hj6h]h size_t len}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:136: ./lib/crc/crc7.chK8hj0ubj2)}(hhh]h)}(hnumber of bytes in the bufferh]hnumber of bytes in the buffer}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhK8hjLubah}(h]h ]h"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]uh1jhjKhK8hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Context**h]j)}(hjqh]hContext}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:136: ./lib/crc/crc7.chK:hjubh)}(hanyh]hany}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:136: ./lib/crc/crc7.chK9hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:136: ./lib/crc/crc7.chK;hjubh)}(hReturns the updated CRC7 value. The CRC7 is left-aligned in the byte (the lsbit is always 0), as that makes the computation easier, and all callers want it in that form.h]hReturns the updated CRC7 value. The CRC7 is left-aligned in the byte (the lsbit is always 0), as that makes the computation easier, and all callers want it in that form.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:136: ./lib/crc/crc7.chK:hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc8_populate_msb (C function)c.crc8_populate_msbhNtauh1hhjEhhhNhNubj)}(hhh](j)}(hAvoid crc8_populate_msb (u8 table[CRC8_TABLE_SIZE], u8 polynomial)h]j)}(h@void crc8_populate_msb(u8 table[CRC8_TABLE_SIZE], u8 polynomial)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hcrc8_populate_msbh]j)}(hcrc8_populate_msbh]hcrc8_populate_msb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h*(u8 table[CRC8_TABLE_SIZE], u8 polynomial)h](j)}(hu8 table[CRC8_TABLE_SIZE]h](h)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.crc8_populate_msbasbuh1hhjubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(htableh]htable}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h[h]h[}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hCRC8_TABLE_SIZEh]hCRC8_TABLE_SIZE}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlmodnameN classnameNj] j` )}jc ]j9c.crc8_populate_msbasbuh1hhjubj)}(h]h]h]}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h u8 polynomialh](h)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j9c.crc8_populate_msbasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h polynomialh]h polynomial}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h9fill crc table for given polynomial in reverse bit order.h]h9fill crc table for given polynomial in reverse bit order.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjEhNhNubj)}(h**Parameters** ``u8 table[CRC8_TABLE_SIZE]`` table to be filled. ``u8 polynomial`` polynomial for which table is to be filled.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKhjubj )}(hhh](j)}(h2``u8 table[CRC8_TABLE_SIZE]`` table to be filled. h](j)}(h``u8 table[CRC8_TABLE_SIZE]``h]j)}(hj;h]hu8 table[CRC8_TABLE_SIZE]}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKhj5ubj2)}(hhh]h)}(htable to be filled.h]htable to be filled.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhKhjQubah}(h]h ]h"]h$]h&]uh1j1hj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhKhj2ubj)}(h=``u8 polynomial`` polynomial for which table is to be filled.h](j)}(h``u8 polynomial``h]j)}(hjth]h u8 polynomial}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKhjnubj2)}(hhh]h)}(h+polynomial for which table is to be filled.h]h+polynomial for which table is to be filled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKhjubah}(h]h ]h"]h$]h&]uh1j1hjnubeh}(h]h ]h"]h$]h&]uh1jhjhKhj2ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc8_populate_lsb (C function)c.crc8_populate_lsbhNtauh1hhjEhhhNhNubj)}(hhh](j)}(hAvoid crc8_populate_lsb (u8 table[CRC8_TABLE_SIZE], u8 polynomial)h]j)}(h@void crc8_populate_lsb(u8 table[CRC8_TABLE_SIZE], u8 polynomial)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chK/ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhK/ubj{)}(hcrc8_populate_lsbh]j)}(hcrc8_populate_lsbh]hcrc8_populate_lsb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhK/ubj)}(h*(u8 table[CRC8_TABLE_SIZE], u8 polynomial)h](j)}(hu8 table[CRC8_TABLE_SIZE]h](h)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.crc8_populate_lsbasbuh1hhjubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(htableh]htable}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj[h]h[}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hCRC8_TABLE_SIZEh]hCRC8_TABLE_SIZE}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj\modnameN classnameNj] j` )}jc ]j*c.crc8_populate_lsbasbuh1hhjubj)}(hjh]h]}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h u8 polynomialh](h)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j*c.crc8_populate_lsbasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h polynomialh]h polynomial}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhK/ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK/ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK/hjhhubj)}(hhh]h)}(h9fill crc table for given polynomial in regular bit order.h]h9fill crc table for given polynomial in regular bit order.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chK/hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK/ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjEhNhNubj)}(h**Parameters** ``u8 table[CRC8_TABLE_SIZE]`` table to be filled. ``u8 polynomial`` polynomial for which table is to be filled.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chK3hjubj )}(hhh](j)}(h2``u8 table[CRC8_TABLE_SIZE]`` table to be filled. h](j)}(h``u8 table[CRC8_TABLE_SIZE]``h]j)}(hj*h]hu8 table[CRC8_TABLE_SIZE]}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chK1hj$ubj2)}(hhh]h)}(htable to be filled.h]htable to be filled.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hK1hj@ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj?hK1hj!ubj)}(h=``u8 polynomial`` polynomial for which table is to be filled.h](j)}(h``u8 polynomial``h]j)}(hjch]h u8 polynomial}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chK3hj]ubj2)}(hhh]h)}(h+polynomial for which table is to be filled.h]h+polynomial for which table is to be filled.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chK2hjyubah}(h]h ]h"]h$]h&]uh1j1hj]ubeh}(h]h ]h"]h$]h&]uh1jhjxhK3hj!ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc8 (C function)c.crc8hNtauh1hhjEhhhNhNubj)}(hhh](j)}(hQu8 crc8 (const u8 table[CRC8_TABLE_SIZE], const u8 *pdata, size_t nbytes, u8 crc)h]j)}(hPu8 crc8(const u8 table[CRC8_TABLE_SIZE], const u8 *pdata, size_t nbytes, u8 crc)h](h)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY crc8sbc.crc8asbuh1hhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKDubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKDubj{)}(hcrc8h]j)}(hjh]hcrc8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKDubj)}(hI(const u8 table[CRC8_TABLE_SIZE], const u8 *pdata, size_t nbytes, u8 crc)h](j)}(hconst u8 table[CRC8_TABLE_SIZE]h](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hu8h]hu8}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj/modnameN classnameNj] j` )}jc ]jc.crc8asbuh1hhj ubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(htableh]htable}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hj[h]h[}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hCRC8_TABLE_SIZEh]hCRC8_TABLE_SIZE}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjymodnameN classnameNj] j` )}jc ]jc.crc8asbuh1hhj ubj)}(hjh]h]}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst u8 *pdatah](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.crc8asbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpdatah]hpdata}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t nbytesh](h)}(hhh]j)}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj"modnameN classnameNj] j` )}jc ]jc.crc8asbuh1hhjubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnbytesh]hnbytes}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hu8 crch](h)}(hhh]j)}(hu8h]hu8}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjjmodnameN classnameNj] j` )}jc ]jc.crc8asbuh1hhjaubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(hcrch]hcrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKDubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKDubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKDhjhhubj)}(hhh]h)}(h+calculate a crc8 over the given input data.h]h+calculate a crc8 over the given input data.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKDhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKDubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjEhNhNubj)}(h**Parameters** ``const u8 table[CRC8_TABLE_SIZE]`` crc table used for calculation. ``const u8 *pdata`` pointer to data buffer. ``size_t nbytes`` number of bytes in data buffer. ``u8 crc`` previous returned crc8 value.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKHhjubj )}(hhh](j)}(hD``const u8 table[CRC8_TABLE_SIZE]`` crc table used for calculation. h](j)}(h#``const u8 table[CRC8_TABLE_SIZE]``h]j)}(hjh]hconst u8 table[CRC8_TABLE_SIZE]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKFhjubj2)}(hhh]h)}(hcrc table used for calculation.h]hcrc table used for calculation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKFhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKFhjubj)}(h,``const u8 *pdata`` pointer to data buffer. h](j)}(h``const u8 *pdata``h]j)}(hj8h]hconst u8 *pdata}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKGhj2ubj2)}(hhh]h)}(hpointer to data buffer.h]hpointer to data buffer.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhKGhjNubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhKGhjubj)}(h2``size_t nbytes`` number of bytes in data buffer. h](j)}(h``size_t nbytes``h]j)}(hjqh]h size_t nbytes}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKHhjkubj2)}(hhh]h)}(hnumber of bytes in data buffer.h]hnumber of bytes in data buffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKHhjubah}(h]h ]h"]h$]h&]uh1j1hjkubeh}(h]h ]h"]h$]h&]uh1jhjhKHhjubj)}(h(``u8 crc`` previous returned crc8 value.h](j)}(h ``u8 crc``h]j)}(hjh]hu8 crc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKJhjubj2)}(hhh]h)}(hprevious returned crc8 value.h]hprevious returned crc8 value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:139: ./lib/crc/crc8.chKIhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKJhjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc16 (C function)c.crc16hNtauh1hhjEhhhNhNubj)}(hhh](j)}(h,u16 crc16 (u16 crc, const u8 *p, size_t len)h]j)}(h+u16 crc16(u16 crc, const u8 *p, size_t len)h](h)}(hhh]j)}(hu16h]hu16}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY crc16sbc.crc16asbuh1hhjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:142: ./lib/crc/crc16.chK0ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj(hK0ubj{)}(hcrc16h]j)}(hj%h]hcrc16}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj(hK0ubj)}(h"(u16 crc, const u8 *p, size_t len)h](j)}(hu16 crch](h)}(hhh]j)}(hu16h]hu16}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj[modnameN classnameNj] j` )}jc ]j#c.crc16asbuh1hhjRubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRubj)}(hcrch]hcrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjNubj)}(h const u8 *ph](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j#c.crc16asbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjNubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j#c.crc16asbuh1hhj ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hlenh]hlen}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjNubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj(hK0ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj(hK0ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj(hK0hjhhubj)}(hhh]h)}(h&compute the CRC-16 for the data bufferh]h&compute the CRC-16 for the data buffer}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:142: ./lib/crc/crc16.chK0hjchhubah}(h]h ]h"]h$]h&]uh1jhjhhhj(hK0ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj~jj~jjjuh1jhhhjEhNhNubj)}(h**Parameters** ``u16 crc`` previous CRC value ``const u8 *p`` data pointer ``size_t len`` number of bytes in the buffer **Description** Returns the updated CRC value.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:142: ./lib/crc/crc16.chK4hjubj )}(hhh](j)}(h``u16 crc`` previous CRC value h](j)}(h ``u16 crc``h]j)}(hjh]hu16 crc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:142: ./lib/crc/crc16.chK1hjubj2)}(hhh]h)}(hprevious CRC valueh]hprevious CRC value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK1hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK1hjubj)}(h``const u8 *p`` data pointer h](j)}(h``const u8 *p``h]j)}(hjh]h const u8 *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:142: ./lib/crc/crc16.chK2hjubj2)}(hhh]h)}(h data pointerh]h data pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK2hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK2hjubj)}(h-``size_t len`` number of bytes in the buffer h](j)}(h``size_t len``h]j)}(hjh]h size_t len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:142: ./lib/crc/crc16.chK3hjubj2)}(hhh]h)}(hnumber of bytes in the bufferh]hnumber of bytes in the buffer}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hK3hj/ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj.hK3hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjTh]h Description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:142: ./lib/crc/crc16.chK5hjubh)}(hReturns the updated CRC value.h]hReturns the updated CRC value.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:142: ./lib/crc/crc16.chK4hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc_ccitt (C function) c.crc_ccitthNtauh1hhjEhhhNhNubj)}(hhh](j)}(h5u16 crc_ccitt (u16 crc, u8 const *buffer, size_t len)h]j)}(h4u16 crc_ccitt(u16 crc, u8 const *buffer, size_t len)h](h)}(hhh]j)}(hu16h]hu16}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY crc_ccittsb c.crc_ccittasbuh1hhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:145: ./lib/crc/crc-ccitt.chK3ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhK3ubj{)}(h crc_ccitth]j)}(hjh]h crc_ccitt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhK3ubj)}(h'(u16 crc, u8 const *buffer, size_t len)h](j)}(hu16 crch](h)}(hhh]j)}(hu16h]hu16}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.crc_ccittasbuh1hhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcrch]hcrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hu8 const *bufferh](h)}(hhh]j)}(hu8h]hu8}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj8modnameN classnameNj] j` )}jc ]j c.crc_ccittasbuh1hhj/ubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(hjh]hconst}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hbufferh]hbuffer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.crc_ccittasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhK3ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK3ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK3hjhhubj)}(hhh]h)}(h9recompute the CRC (CRC-CCITT variant) for the data bufferh]h9recompute the CRC (CRC-CCITT variant) for the data buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:145: ./lib/crc/crc-ccitt.chK3hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK3ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjEhNhNubj)}(h**Parameters** ``u16 crc`` previous CRC value ``u8 const *buffer`` data pointer ``size_t len`` number of bytes in the bufferh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:145: ./lib/crc/crc-ccitt.chK7hjubj )}(hhh](j)}(h``u16 crc`` previous CRC value h](j)}(h ``u16 crc``h]j)}(hj=h]hu16 crc}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:145: ./lib/crc/crc-ccitt.chK5hj7ubj2)}(hhh]h)}(hprevious CRC valueh]hprevious CRC value}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhK5hjSubah}(h]h ]h"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhK5hj4ubj)}(h"``u8 const *buffer`` data pointer h](j)}(h``u8 const *buffer``h]j)}(hjvh]hu8 const *buffer}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:145: ./lib/crc/crc-ccitt.chK6hjpubj2)}(hhh]h)}(h data pointerh]h data pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK6hjubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhjhK6hj4ubj)}(h,``size_t len`` number of bytes in the bufferh](j)}(h``size_t len``h]j)}(hjh]h size_t len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:145: ./lib/crc/crc-ccitt.chK8hjubj2)}(hhh]h)}(hnumber of bytes in the bufferh]hnumber of bytes in the buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:145: ./lib/crc/crc-ccitt.chK7hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK8hj4ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc_itu_t (C function) c.crc_itu_thNtauh1hhjEhhhNhNubj)}(hhh](j)}(h5u16 crc_itu_t (u16 crc, const u8 *buffer, size_t len)h]j)}(h4u16 crc_itu_t(u16 crc, const u8 *buffer, size_t len)h](h)}(hhh]j)}(hu16h]hu16}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY crc_itu_tsb c.crc_itu_tasbuh1hhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:148: ./lib/crc/crc-itu-t.chK2ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj-hK2ubj{)}(h crc_itu_th]j)}(hj*h]h crc_itu_t}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj-hK2ubj)}(h'(u16 crc, const u8 *buffer, size_t len)h](j)}(hu16 crch](h)}(hhh]j)}(hu16h]hu16}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj`modnameN classnameNj] j` )}jc ]j( c.crc_itu_tasbuh1hhjWubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hcrch]hcrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubj)}(hconst u8 *bufferh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j( c.crc_itu_tasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufferh]hbuffer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j( c.crc_itu_tasbuh1hhjubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj-hK2ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj-hK2ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj-hK2hjhhubj)}(hhh]h)}(h)Compute the CRC-ITU-T for the data bufferh]h)Compute the CRC-ITU-T for the data buffer}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:148: ./lib/crc/crc-itu-t.chK2hjihhubah}(h]h ]h"]h$]h&]uh1jhjhhhj-hK2ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjEhNhNubj)}(h**Parameters** ``u16 crc`` previous CRC value ``const u8 *buffer`` data pointer ``size_t len`` number of bytes in the buffer **Description** Returns the updated CRC valueh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:148: ./lib/crc/crc-itu-t.chK6hjubj )}(hhh](j)}(h``u16 crc`` previous CRC value h](j)}(h ``u16 crc``h]j)}(hjh]hu16 crc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:148: ./lib/crc/crc-itu-t.chK4hjubj2)}(hhh]h)}(hprevious CRC valueh]hprevious CRC value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK4hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK4hjubj)}(h"``const u8 *buffer`` data pointer h](j)}(h``const u8 *buffer``h]j)}(hjh]hconst u8 *buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:148: ./lib/crc/crc-itu-t.chK5hjubj2)}(hhh]h)}(h data pointerh]h data pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK5hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK5hjubj)}(h-``size_t len`` number of bytes in the buffer h](j)}(h``size_t len``h]j)}(hjh]h size_t len}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:148: ./lib/crc/crc-itu-t.chK6hjubj2)}(hhh]h)}(hnumber of bytes in the bufferh]hnumber of bytes in the buffer}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hK6hj5ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj4hK6hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjZh]h Description}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:148: ./lib/crc/crc-itu-t.chK8hjubh)}(hReturns the updated CRC valueh]hReturns the updated CRC value}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:148: ./lib/crc/crc-itu-t.chK7hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc32_le (C function) c.crc32_lehNtauh1hhjEhhhNhNubj)}(hhh](j)}(h1u32 crc32_le (u32 crc, const void *p, size_t len)h]j)}(h0u32 crc32_le(u32 crc, const void *p, size_t len)h](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY crc32_lesb c.crc32_leasbuh1hhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhK ubj{)}(hcrc32_leh]j)}(hjh]hcrc32_le}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhK ubj)}(h$(u32 crc, const void *p, size_t len)h](j)}(hu32 crch](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.crc32_leasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcrch]hcrc}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h const void *ph](j)}(hjh]hconst}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj )}(hvoidh]hvoid}(hjThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hjh]h*}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hjh]hp}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.crc32_leasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhK ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK hjhhubj)}(hhh]h)}(h/Compute least-significant-bit-first IEEE CRC-32h]h/Compute least-significant-bit-first IEEE CRC-32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjEhNhNubj)}(hXx**Parameters** ``u32 crc`` Initial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally. ``const void *p`` Pointer to the data buffer ``size_t len`` Length of data in bytes **Description** This implements the CRC variant that is often known as the IEEE CRC-32, or simply CRC-32, and is widely used in Ethernet and other applications: - Polynomial: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + x^0 - Bit order: Least-significant-bit-first - Polynomial in integer form: 0xedb88320 This does *not* invert the CRC at the beginning or end. The caller is expected to do that if it needs to. Inverting at both ends is recommended. For new applications, prefer to use CRC-32C instead. See crc32c(). **Context** Any context **Return** The new CRC valueh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK hj ubj )}(hhh](j)}(h``u32 crc`` Initial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally. h](j)}(h ``u32 crc``h]j)}(hj/h]hu32 crc}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK hj)ubj2)}(hhh]h)}(hzInitial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally.h]hzInitial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK hjEubah}(h]h ]h"]h$]h&]uh1j1hj)ubeh}(h]h ]h"]h$]h&]uh1jhjDhK hj&ubj)}(h-``const void *p`` Pointer to the data buffer h](j)}(h``const void *p``h]j)}(hjih]h const void *p}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK hjcubj2)}(hhh]h)}(hPointer to the data bufferh]hPointer to the data buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hK hjubah}(h]h ]h"]h$]h&]uh1j1hjcubeh}(h]h ]h"]h$]h&]uh1jhj~hK hj&ubj)}(h'``size_t len`` Length of data in bytes h](j)}(h``size_t len``h]j)}(hjh]h size_t len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK hjubj2)}(hhh]h)}(hLength of data in bytesh]hLength of data in bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK hj&ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhj ubh)}(hThis implements the CRC variant that is often known as the IEEE CRC-32, or simply CRC-32, and is widely used in Ethernet and other applications:h]hThis implements the CRC variant that is often known as the IEEE CRC-32, or simply CRC-32, and is widely used in Ethernet and other applications:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhj ubj)}(hhh](j)}(hwPolynomial: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + x^0h]j )}(hhh]j)}(hkPolynomial: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + x^0h](j)}(hIPolynomial: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 +h]hIPolynomial: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 +}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhj ubj2)}(hhh]h)}(h!x^7 + x^5 + x^4 + x^2 + x^1 + x^0h]h!x^7 + x^5 + x^4 + x^2 + x^1 + x^0}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhjubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhjhKhj ubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h&Bit order: Least-significant-bit-firsth]h)}(hjKh]h&Bit order: Least-significant-bit-first}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhjIubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h'Polynomial in integer form: 0xedb88320 h]h)}(h&Polynomial in integer form: 0xedb88320h]h&Polynomial in integer form: 0xedb88320}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhjaubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhKhj ubh)}(hThis does *not* invert the CRC at the beginning or end. The caller is expected to do that if it needs to. Inverting at both ends is recommended.h](h This does }(hjhhhNhNubj)}(h*not*h]hnot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh invert the CRC at the beginning or end. The caller is expected to do that if it needs to. Inverting at both ends is recommended.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhj ubh)}(hCFor new applications, prefer to use CRC-32C instead. See crc32c().h]hCFor new applications, prefer to use CRC-32C instead. See crc32c().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhj ubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhj ubh)}(h Any contexth]h Any context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhj ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhj ubh)}(hThe new CRC valueh]hThe new CRC value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc32_be (C function) c.crc32_behNtauh1hhjEhhhNhNubj)}(hhh](j)}(h1u32 crc32_be (u32 crc, const void *p, size_t len)h]j)}(h0u32 crc32_be(u32 crc, const void *p, size_t len)h](h)}(hhh]j)}(hu32h]hu32}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj#modnameN classnameNj] j` )}jc ]jf )}jY crc32_besb c.crc32_beasbuh1hhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK(ubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjBhK(ubj{)}(hcrc32_beh]j)}(hj?h]hcrc32_be}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjBhK(ubj)}(h$(u32 crc, const void *p, size_t len)h](j)}(hu32 crch](h)}(hhh]j)}(hu32h]hu32}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjumodnameN classnameNj] j` )}jc ]j= c.crc32_beasbuh1hhjlubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hcrch]hcrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubj)}(h const void *ph](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j= c.crc32_beasbuh1hhjubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjBhK(ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjBhK(ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjBhK(hjhhubj)}(hhh]h)}(h.Compute most-significant-bit-first IEEE CRC-32h]h.Compute most-significant-bit-first IEEE CRC-32}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK(hjjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjBhK(ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjEhNhNubj)}(hX:**Parameters** ``u32 crc`` Initial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally. ``const void *p`` Pointer to the data buffer ``size_t len`` Length of data in bytes **Description** crc32_be() is the same as crc32_le() except that crc32_be() computes the *most-significant-bit-first* variant of the CRC. I.e., within each byte, the most significant bit is processed first (treated as highest order polynomial coefficient). The same bit order is also used for the CRC value itself: - Polynomial: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + x^0 - Bit order: Most-significant-bit-first - Polynomial in integer form: 0x04c11db7 **Context** Any context **Return** The new CRC valueh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK,hjubj )}(hhh](j)}(h``u32 crc`` Initial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally. h](j)}(h ``u32 crc``h]j)}(hjh]hu32 crc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK*hjubj2)}(hhh]h)}(hzInitial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally.h]hzInitial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK)hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK*hjubj)}(h-``const void *p`` Pointer to the data buffer h](j)}(h``const void *p``h]j)}(hjh]h const void *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK+hjubj2)}(hhh]h)}(hPointer to the data bufferh]hPointer to the data buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK+hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK+hjubj)}(h'``size_t len`` Length of data in bytes h](j)}(h``size_t len``h]j)}(hj!h]h size_t len}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK,hjubj2)}(hhh]h)}(hLength of data in bytesh]hLength of data in bytes}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hK,hj7ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj6hK,hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj\h]h Description}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK.hjubh)}(hX,crc32_be() is the same as crc32_le() except that crc32_be() computes the *most-significant-bit-first* variant of the CRC. I.e., within each byte, the most significant bit is processed first (treated as highest order polynomial coefficient). The same bit order is also used for the CRC value itself:h](hIcrc32_be() is the same as crc32_le() except that crc32_be() computes the }(hjrhhhNhNubj)}(h*most-significant-bit-first*h]hmost-significant-bit-first}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubh variant of the CRC. I.e., within each byte, the most significant bit is processed first (treated as highest order polynomial coefficient). The same bit order is also used for the CRC value itself:}(hjrhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK-hjubj)}(hhh](j)}(hwPolynomial: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + x^0h]j )}(hhh]j)}(hkPolynomial: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + x^0h](j)}(hIPolynomial: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 +h]hIPolynomial: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 +}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK2hjubj2)}(hhh]h)}(h!x^7 + x^5 + x^4 + x^2 + x^1 + x^0h]h!x^7 + x^5 + x^4 + x^2 + x^1 + x^0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK3hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK2hjubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h%Bit order: Most-significant-bit-firsth]h)}(hjh]h%Bit order: Most-significant-bit-first}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK4hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h'Polynomial in integer form: 0x04c11db7 h]h)}(h&Polynomial in integer form: 0x04c11db7h]h&Polynomial in integer form: 0x04c11db7}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK5hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhK2hjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK7hjubh)}(h Any contexth]h Any context}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK8hjubh)}(h **Return**h]j)}(hj:h]hReturn}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK:hjubh)}(hThe new CRC valueh]hThe new CRC value}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK9hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc32c (C function)c.crc32chNtauh1hhjEhhhNhNubj)}(hhh](j)}(h/u32 crc32c (u32 crc, const void *p, size_t len)h]j)}(h.u32 crc32c(u32 crc, const void *p, size_t len)h](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY crc32csbc.crc32casbuh1hhj{hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK>ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{hhhjhK>ubj{)}(hcrc32ch]j)}(hjh]hcrc32c}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj{hhhjhK>ubj)}(h$(u32 crc, const void *p, size_t len)h](j)}(hu32 crch](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.crc32casbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcrch]hcrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h const void *ph](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hj4hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjzmodnameN classnameNj] j` )}jc ]jc.crc32casbuh1hhjqubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj{hhhjhK>ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjwhhhjhK>ubah}(h]jrah ](jjeh"]h$]h&]jj)jhuh1jhjhK>hjthhubj)}(hhh]h)}(hCompute CRC-32Ch]hCompute CRC-32C}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK>hjhhubah}(h]h ]h"]h$]h&]uh1jhjthhhjhK>ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjEhNhNubj)}(hXD**Parameters** ``u32 crc`` Initial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally. ``const void *p`` Pointer to the data buffer ``size_t len`` Length of data in bytes **Description** This implements CRC-32C, i.e. the Castagnoli CRC. This is the recommended CRC variant to use in new applications that want a 32-bit CRC. - Polynomial: x^32 + x^28 + x^27 + x^26 + x^25 + x^23 + x^22 + x^20 + x^19 + x^18 + x^14 + x^13 + x^11 + x^10 + x^9 + x^8 + x^6 + x^0 - Bit order: Least-significant-bit-first - Polynomial in integer form: 0x82f63b78 This does *not* invert the CRC at the beginning or end. The caller is expected to do that if it needs to. Inverting at both ends is recommended. **Context** Any context **Return** The new CRC valueh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKBhjubj )}(hhh](j)}(h``u32 crc`` Initial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally. h](j)}(h ``u32 crc``h]j)}(hjh]hu32 crc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK@hj ubj2)}(hhh]h)}(hzInitial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally.h]hzInitial CRC value. ~0 (recommended) or 0 for a new CRC computation, or the previous CRC value if computing incrementally.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhK?hj%ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj$hK@hjubj)}(h-``const void *p`` Pointer to the data buffer h](j)}(h``const void *p``h]j)}(hjIh]h const void *p}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKAhjCubj2)}(hhh]h)}(hPointer to the data bufferh]hPointer to the data buffer}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hKAhj_ubah}(h]h ]h"]h$]h&]uh1j1hjCubeh}(h]h ]h"]h$]h&]uh1jhj^hKAhjubj)}(h'``size_t len`` Length of data in bytes h](j)}(h``size_t len``h]j)}(hjh]h size_t len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKBhj|ubj2)}(hhh]h)}(hLength of data in bytesh]hLength of data in bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKBhjubah}(h]h ]h"]h$]h&]uh1j1hj|ubeh}(h]h ]h"]h$]h&]uh1jhjhKBhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKDhjubh)}(hThis implements CRC-32C, i.e. the Castagnoli CRC. This is the recommended CRC variant to use in new applications that want a 32-bit CRC.h]hThis implements CRC-32C, i.e. the Castagnoli CRC. This is the recommended CRC variant to use in new applications that want a 32-bit CRC.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKChjubj)}(hhh](j)}(hPolynomial: x^32 + x^28 + x^27 + x^26 + x^25 + x^23 + x^22 + x^20 + x^19 + x^18 + x^14 + x^13 + x^11 + x^10 + x^9 + x^8 + x^6 + x^0h]j )}(hhh]j)}(hPolynomial: x^32 + x^28 + x^27 + x^26 + x^25 + x^23 + x^22 + x^20 + x^19 + x^18 + x^14 + x^13 + x^11 + x^10 + x^9 + x^8 + x^6 + x^0h](j)}(hJPolynomial: x^32 + x^28 + x^27 + x^26 + x^25 + x^23 + x^22 + x^20 + x^19 +h]hJPolynomial: x^32 + x^28 + x^27 + x^26 + x^25 + x^23 + x^22 + x^20 + x^19 +}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKFhjubj2)}(hhh]h)}(h8x^18 + x^14 + x^13 + x^11 + x^10 + x^9 + x^8 + x^6 + x^0h]h8x^18 + x^14 + x^13 + x^11 + x^10 + x^9 + x^8 + x^6 + x^0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKGhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKFhjubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h&Bit order: Least-significant-bit-firsth]h)}(hj+h]h&Bit order: Least-significant-bit-first}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKHhj)ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h'Polynomial in integer form: 0x82f63b78 h]h)}(h&Polynomial in integer form: 0x82f63b78h]h&Polynomial in integer form: 0x82f63b78}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKIhjAubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhKFhjubh)}(hThis does *not* invert the CRC at the beginning or end. The caller is expected to do that if it needs to. Inverting at both ends is recommended.h](h This does }(hj`hhhNhNubj)}(h*not*h]hnot}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubh invert the CRC at the beginning or end. The caller is expected to do that if it needs to. Inverting at both ends is recommended.}(hj`hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKKhjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKNhjubh)}(h Any contexth]h Any context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKOhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKQhjubh)}(hThe new CRC valueh]hThe new CRC value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:151: ./include/linux/crc32.hhKPhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc64_be (C function) c.crc64_behNtauh1hhjEhhhNhNubj)}(hhh](j)}(h1u64 crc64_be (u64 crc, const void *p, size_t len)h]j)}(h0u64 crc64_be(u64 crc, const void *p, size_t len)h](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY crc64_besb c.crc64_beasbuh1hhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hcrc64_beh]j)}(hjh]hcrc64_be}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h$(u64 crc, const void *p, size_t len)h](j)}(hu64 crch](h)}(hhh]j)}(hu64h]hu64}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjFmodnameN classnameNj] j` )}jc ]j c.crc64_beasbuh1hhj=ubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=ubj)}(hcrch]hcrc}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubj)}(h const void *ph](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.crc64_beasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h+Calculate bitwise big-endian ECMA-182 CRC64h]h+Calculate bitwise big-endian ECMA-182 CRC64}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhKhj;hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjVjjVjjjuh1jhhhjEhNhNubj)}(hX**Parameters** ``u64 crc`` seed value for computation. 0 or (u64)~0 for a new CRC calculation, or the previous crc64 value if computing incrementally. ``const void *p`` pointer to buffer over which CRC64 is run ``size_t len`` length of buffer **p**h](h)}(h**Parameters**h]j)}(hj`h]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhK hjZubj )}(hhh](j)}(h``u64 crc`` seed value for computation. 0 or (u64)~0 for a new CRC calculation, or the previous crc64 value if computing incrementally. h](j)}(h ``u64 crc``h]j)}(hjh]hu64 crc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhK hjyubj2)}(hhh]h)}(h{seed value for computation. 0 or (u64)~0 for a new CRC calculation, or the previous crc64 value if computing incrementally.h]h{seed value for computation. 0 or (u64)~0 for a new CRC calculation, or the previous crc64 value if computing incrementally.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhK hjubah}(h]h ]h"]h$]h&]uh1j1hjyubeh}(h]h ]h"]h$]h&]uh1jhjhK hjvubj)}(h<``const void *p`` pointer to buffer over which CRC64 is run h](j)}(h``const void *p``h]j)}(hjh]h const void *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhK hjubj2)}(hhh]h)}(h)pointer to buffer over which CRC64 is runh]h)pointer to buffer over which CRC64 is run}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK hjvubj)}(h%``size_t len`` length of buffer **p**h](j)}(h``size_t len``h]j)}(hjh]h size_t len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhK hjubj2)}(hhh]h)}(hlength of buffer **p**h](hlength of buffer }(hj hhhNhNubj)}(h**p**h]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhK hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK hjvubeh}(h]h ]h"]h$]h&]uh1j hjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j crc64_nvme (C function) c.crc64_nvmehNtauh1hhjEhhhNhNubj)}(hhh](j)}(h3u64 crc64_nvme (u64 crc, const void *p, size_t len)h]j)}(h2u64 crc64_nvme(u64 crc, const void *p, size_t len)h](h)}(hhh]j)}(hu64h]hu64}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj_modnameN classnameNj] j` )}jc ]jf )}jY crc64_nvmesb c.crc64_nvmeasbuh1hhjVhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVhhhj~hKubj{)}(h crc64_nvmeh]j)}(hj{h]h crc64_nvme}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjVhhhj~hKubj)}(h$(u64 crc, const void *p, size_t len)h](j)}(hu64 crch](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jy c.crc64_nvmeasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcrch]hcrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h const void *ph](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjUmodnameN classnameNj] j` )}jc ]jy c.crc64_nvmeasbuh1hhjLubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjVhhhj~hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjRhhhj~hKubah}(h]jMah ](jjeh"]h$]h&]jj)jhuh1jhj~hKhjOhhubj)}(hhh]h)}(hCalculate CRC64-NVMEh]hCalculate CRC64-NVME}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjOhhhj~hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjEhNhNubj)}(hX**Parameters** ``u64 crc`` seed value for computation. 0 for a new CRC calculation, or the previous crc64 value if computing incrementally. ``const void *p`` pointer to buffer over which CRC64 is run ``size_t len`` length of buffer **p** **Description** This computes the CRC64 defined in the NVME NVM Command Set Specification, *including the bitwise inversion at the beginning and end*.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhKhjubj )}(hhh](j)}(h}``u64 crc`` seed value for computation. 0 for a new CRC calculation, or the previous crc64 value if computing incrementally. h](j)}(h ``u64 crc``h]j)}(hjh]hu64 crc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhKhjubj2)}(hhh]h)}(hpseed value for computation. 0 for a new CRC calculation, or the previous crc64 value if computing incrementally.h]hpseed value for computation. 0 for a new CRC calculation, or the previous crc64 value if computing incrementally.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h<``const void *p`` pointer to buffer over which CRC64 is run h](j)}(h``const void *p``h]j)}(hj$h]h const void *p}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhKhjubj2)}(hhh]h)}(h)pointer to buffer over which CRC64 is runh]h)pointer to buffer over which CRC64 is run}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hKhj:ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj9hKhjubj)}(h&``size_t len`` length of buffer **p** h](j)}(h``size_t len``h]j)}(hj]h]h size_t len}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhKhjWubj2)}(hhh]h)}(hlength of buffer **p**h](hlength of buffer }(hjvhhhNhNubj)}(h**p**h]hp}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1hhjrhKhjsubah}(h]h ]h"]h$]h&]uh1j1hjWubeh}(h]h ]h"]h$]h&]uh1jhjrhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhKhjubh)}(hThis computes the CRC64 defined in the NVME NVM Command Set Specification, *including the bitwise inversion at the beginning and end*.h](hKThis computes the CRC64 defined in the NVME NVM Command Set Specification, }(hjhhhNhNubj)}(h:*including the bitwise inversion at the beginning and end*h]h8including the bitwise inversion at the beginning and end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:153: ./include/linux/crc64.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjEhhhNhNubeh}(h] crc-functionsah ]h"] crc functionsah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hBase 2 log and power Functionsh]hBase 2 log and power Functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j is_power_of_2 (C function)c.is_power_of_2hNtauh1hhjhhhNhNubj)}(hhh](j)}(h$bool is_power_of_2 (unsigned long n)h]j)}(h#bool is_power_of_2(unsigned long n)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK%ubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj#hK%ubj{)}(h is_power_of_2h]j)}(h is_power_of_2h]h is_power_of_2}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj#hK%ubj)}(h(unsigned long n)h]j)}(hunsigned long nh](j )}(hunsignedh]hunsigned}(hjRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjNubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj )}(hlongh]hlong}(hjnhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjNubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj#hK%ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj#hK%ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj#hK%hj hhubj)}(hhh]h)}(h"check if a value is a power of twoh]h"check if a value is a power of two}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK%hjhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj#hK%ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``unsigned long n`` the value to check **Description** Determine whether some value is a power of two, where zero is *not* considered a power of two. **Return** true if **n** is a power of 2, otherwise false.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK)hjubj )}(hhh]j)}(h'``unsigned long n`` the value to check h](j)}(h``unsigned long n``h]j)}(hjh]hunsigned long n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK&hjubj2)}(hhh]h)}(hthe value to checkh]hthe value to check}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK&hj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hK&hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj/h]h Description}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK(hjubh)}(h^Determine whether some value is a power of two, where zero is *not* considered a power of two.h](h>Determine whether some value is a power of two, where zero is }(hjEhhhNhNubj)}(h*not*h]hnot}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh considered a power of two.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK'hjubh)}(h **Return**h]j)}(hjhh]hReturn}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK*hjubh)}(h/true if **n** is a power of 2, otherwise false.h](htrue if }(hj~hhhNhNubj)}(h**n**h]hn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubh" is a power of 2, otherwise false.}(hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK*hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !__roundup_pow_of_two (C function)c.__roundup_pow_of_twohNtauh1hhjhhhNhNubj)}(hhh](j)}(h4unsigned long __roundup_pow_of_two (unsigned long n)h]j)}(h3unsigned long __roundup_pow_of_two(unsigned long n)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK3ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhK3ubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhK3ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhK3ubj{)}(h__roundup_pow_of_twoh]j)}(h__roundup_pow_of_twoh]h__roundup_pow_of_two}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhK3ubj)}(h(unsigned long n)h]j)}(hunsigned long nh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hj4hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]hn}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhK3ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK3ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK3hjhhubj)}(hhh]h)}(h round up to nearest power of twoh]h round up to nearest power of two}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK3hjvhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK3ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h7**Parameters** ``unsigned long n`` value to round uph](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK7hjubj )}(hhh]j)}(h%``unsigned long n`` value to round uph](j)}(h``unsigned long n``h]j)}(hjh]hunsigned long n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK9hjubj2)}(hhh]h)}(hvalue to round uph]hvalue to round up}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK4hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK9hjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #__rounddown_pow_of_two (C function)c.__rounddown_pow_of_twohNtauh1hhjhhhNhNubj)}(hhh](j)}(h6unsigned long __rounddown_pow_of_two (unsigned long n)h]j)}(h5unsigned long __rounddown_pow_of_two(unsigned long n)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK=ubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj"hK=ubj )}(hlongh]hlong}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhj"hK=ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj"hK=ubj{)}(h__rounddown_pow_of_twoh]j)}(h__rounddown_pow_of_twoh]h__rounddown_pow_of_two}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj"hK=ubj)}(h(unsigned long n)h]j)}(hunsigned long nh](j )}(hunsignedh]hunsigned}(hjmhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjiubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjiubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjeubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj"hK=ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj"hK=ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj"hK=hj hhubj)}(hhh]h)}(h"round down to nearest power of twoh]h"round down to nearest power of two}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK=hjhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj"hK=ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h9**Parameters** ``unsigned long n`` value to round downh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKAhjubj )}(hhh]j)}(h'``unsigned long n`` value to round downh](j)}(h``unsigned long n``h]j)}(hjh]hunsigned long n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKChj ubj2)}(hhh]h)}(hvalue to round downh]hvalue to round down}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhK>hj%ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj$hKChjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j const_ilog2 (C macro) c.const_ilog2hNtauh1hhjhhhNhNubj)}(hhh](j)}(h const_ilog2h]j)}(h const_ilog2h]j{)}(h const_ilog2h]j)}(hjch]h const_ilog2}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjehhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKGubah}(h]h ]h"]h$]h&]jjjuh1jjjhjahhhjhKGubah}(h]j\ah ](jjeh"]h$]h&]jj)jhuh1jhjhKGhj^hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj^hhhjhKGubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h``const_ilog2 (n)``h]j)}(hjh]hconst_ilog2 (n)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKIhjhhubj)}(h9log base 2 of 32-bit or a 64-bit constant unsigned value h]h)}(h8log base 2 of 32-bit or a 64-bit constant unsigned valueh]h8log base 2 of 32-bit or a 64-bit constant unsigned value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKGhjubah}(h]h ]h"]h$]h&]uh1jhjhKGhjhhubj)}(h**Parameters** ``n`` parameter **Description** Use this where sparse expects a true constant expression, e.g. for array indices.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKKhjubj )}(hhh]j)}(h``n`` parameter h](j)}(h``n``h]j)}(hjh]hn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKHhjubj2)}(hhh]h)}(h parameterh]h parameter}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKHhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKHhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj.h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKJhjubh)}(hQUse this where sparse expects a true constant expression, e.g. for array indices.h]hQUse this where sparse expects a true constant expression, e.g. for array indices.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKIhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ilog2 (C macro)c.ilog2hNtauh1hhjhhhNhNubj)}(hhh](j)}(hilog2h]j)}(hilog2h]j{)}(hilog2h]j)}(hjmh]hilog2}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjohhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjkhhhjhKubah}(h]jfah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h ``ilog2 (n)``h]j)}(hjh]h ilog2 (n)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjhhubj)}(h0log base 2 of 32-bit or a 64-bit unsigned value h]h)}(h/log base 2 of 32-bit or a 64-bit unsigned valueh]h/log base 2 of 32-bit or a 64-bit unsigned value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhjhhubj)}(hX**Parameters** ``n`` parameter **Description** constant-capable log of base 2 calculation - this can be used to initialise global variables from constant data, hence the massive ternary operator construction selects the appropriately-sized optimised version depending on sizeof(n)h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubj )}(hhh]j)}(h``n`` parameter h](j)}(h``n``h]j)}(hjh]hn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubj2)}(hhh]h)}(h parameterh]h parameter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj8h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubh)}(hconstant-capable log of base 2 calculation - this can be used to initialise global variables from constant data, hence the massive ternary operator constructionh]hconstant-capable log of base 2 calculation - this can be used to initialise global variables from constant data, hence the massive ternary operator construction}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubh)}(hHselects the appropriately-sized optimised version depending on sizeof(n)h]hHselects the appropriately-sized optimised version depending on sizeof(n)}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j roundup_pow_of_two (C macro)c.roundup_pow_of_twohNtauh1hhjhhhNhNubj)}(hhh](j)}(hroundup_pow_of_twoh]j)}(hroundup_pow_of_twoh]j{)}(hroundup_pow_of_twoh]j)}(hjh]hroundup_pow_of_two}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h``roundup_pow_of_two (n)``h]j)}(hjh]hroundup_pow_of_two (n)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjhhubj)}(h1round the given value up to nearest power of two h]h)}(h0round the given value up to nearest power of twoh]h0round the given value up to nearest power of two}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhjhhubj)}(h**Parameters** ``n`` parameter **Description** round the given value up to the nearest power of two - the result is undefined when n == 0 - this can be used to initialise global variables from constant datah](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubj )}(hhh]j)}(h``n`` parameter h](j)}(h``n``h]j)}(hjh]hn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubj2)}(hhh]h)}(h parameterh]h parameter}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hKhj,ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj+hKhj ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjQh]h Description}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubh)}(hround the given value up to the nearest power of two - the result is undefined when n == 0 - this can be used to initialise global variables from constant datah]hround the given value up to the nearest power of two - the result is undefined when n == 0 - this can be used to initialise global variables from constant data}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rounddown_pow_of_two (C macro)c.rounddown_pow_of_twohNtauh1hhjhhhNhNubj)}(hhh](j)}(hrounddown_pow_of_twoh]j)}(hrounddown_pow_of_twoh]j{)}(hrounddown_pow_of_twoh]j)}(hjh]hrounddown_pow_of_two}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h``rounddown_pow_of_two (n)``h]j)}(hjh]hrounddown_pow_of_two (n)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjhhubj)}(h3round the given value down to nearest power of two h]h)}(h2round the given value down to nearest power of twoh]h2round the given value down to nearest power of two}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhjhhubj)}(h**Parameters** ``n`` parameter **Description** round the given value down to the nearest power of two - the result is undefined when n == 0 - this can be used to initialise global variables from constant datah](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubj )}(hhh]j)}(h``n`` parameter h](j)}(h``n``h]j)}(hj h]hn}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubj2)}(hhh]h)}(h parameterh]h parameter}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hKhj6ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj5hKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj[h]h Description}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubh)}(hround the given value down to the nearest power of two - the result is undefined when n == 0 - this can be used to initialise global variables from constant datah]hround the given value down to the nearest power of two - the result is undefined when n == 0 - this can be used to initialise global variables from constant data}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j order_base_2 (C macro)c.order_base_2hNtauh1hhjhhhNhNubj)}(hhh](j)}(h order_base_2h]j)}(h order_base_2h]j{)}(h order_base_2h]j)}(hjh]h order_base_2}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h``order_base_2 (n)``h]j)}(hjh]horder_base_2 (n)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjhhubj)}(h8calculate the (rounded up) base 2 order of the argument h]h)}(h7calculate the (rounded up) base 2 order of the argumenth]h7calculate the (rounded up) base 2 order of the argument}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhjhhubj)}(h**Parameters** ``n`` parameter **Description** The first few values calculated by this routine: ob2(0) = 0 ob2(1) = 0 ob2(2) = 1 ob2(3) = 2 ob2(4) = 2 ob2(5) = 3 ... and so on.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubj )}(hhh]j)}(h``n`` parameter h](j)}(h``n``h]j)}(hj*h]hn}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhj$ubj2)}(hhh]h)}(h parameterh]h parameter}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hKhj@ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj?hKhj!ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjeh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubj )}(hhh]j)}(hThe first few values calculated by this routine: ob2(0) = 0 ob2(1) = 0 ob2(2) = 1 ob2(3) = 2 ob2(4) = 2 ob2(5) = 3 ... and so on.h](j)}(h0The first few values calculated by this routine:h]h0The first few values calculated by this routine:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhj~ubj2)}(hhh]h)}(hPob2(0) = 0 ob2(1) = 0 ob2(2) = 1 ob2(3) = 2 ob2(4) = 2 ob2(5) = 3 ... and so on.h]hPob2(0) = 0 ob2(1) = 0 ob2(2) = 1 ob2(3) = 2 ob2(4) = 2 ob2(5) = 3 ... and so on.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjubah}(h]h ]h"]h$]h&]uh1j1hj~ubeh}(h]h ]h"]h$]h&]uh1jhjhKhj{ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bits_per (C macro) c.bits_perhNtauh1hhjhhhNhNubj)}(hhh](j)}(hbits_perh]j)}(hbits_perh]j{)}(hbits_perh]j)}(hjh]hbits_per}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h``bits_per (n)``h]j)}(hj h]h bits_per (n)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjhhubj)}(h7calculate the number of bits required for the argument h]h)}(h6calculate the number of bits required for the argumenth]h6calculate the number of bits required for the argument}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhj!ubah}(h]h ]h"]h$]h&]uh1jhj3hKhjhhubj)}(hX**Parameters** ``n`` parameter **Description** This is constant-capable and can be used for compile time initializations, e.g bitfields. The first few values calculated by this routine: bf(0) = 1 bf(1) = 1 bf(2) = 2 bf(3) = 2 bf(4) = 3 ... and so on.h](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhj:ubj )}(hhh]j)}(h``n`` parameter h](j)}(h``n``h]j)}(hj_h]hn}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhjYubj2)}(hhh]h)}(h parameterh]h parameter}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthKhjuubah}(h]h ]h"]h$]h&]uh1j1hjYubeh}(h]h ]h"]h$]h&]uh1jhjthKhjVubah}(h]h ]h"]h$]h&]uh1j hj:ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhj:ubh)}(hYThis is constant-capable and can be used for compile time initializations, e.g bitfields.h]hYThis is constant-capable and can be used for compile time initializations, e.g bitfields.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhj:ubh)}(hqThe first few values calculated by this routine: bf(0) = 1 bf(1) = 1 bf(2) = 2 bf(3) = 2 bf(4) = 3 ... and so on.h]hqThe first few values calculated by this routine: bf(0) = 1 bf(1) = 1 bf(2) = 2 bf(3) = 2 bf(4) = 3 ... and so on.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhKhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "max_pow_of_two_factor (C function)c.max_pow_of_two_factorhNtauh1hhjhhhNhNubj)}(hhh](j)}(h3unsigned int max_pow_of_two_factor (unsigned int n)h]j)}(h2unsigned int max_pow_of_two_factor(unsigned int n)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hmax_pow_of_two_factorh]j)}(hmax_pow_of_two_factorh]hmax_pow_of_two_factor}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(unsigned int n)h]j)}(hunsigned int nh](j )}(hunsignedh]hunsigned}(hjGhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjCubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubj )}(hinth]hint}(hjchhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjCubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj?ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h return highest power-of-2 factorh]h return highest power-of-2 factor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``unsigned int n`` parameter **Description** find highest power-of-2 which is evenly divisible into n. 0 is returned for n == 0 or 1.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhMhjubj )}(hhh]j)}(h``unsigned int n`` parameter h](j)}(h``unsigned int n``h]j)}(hjh]hunsigned int n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhMhjubj2)}(hhh]h)}(h parameterh]h parameter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj$h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhMhjubh)}(hXfind highest power-of-2 which is evenly divisible into n. 0 is returned for n == 0 or 1.h]hXfind highest power-of-2 which is evenly divisible into n. 0 is returned for n == 0 or 1.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:158: ./include/linux/log2.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]base-2-log-and-power-functionsah ]h"]base 2 log and power functionsah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hInteger log and power Functionsh]hInteger log and power Functions}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j intlog2 (C function) c.intlog2hNtauh1hhjXhhhNhNubj)}(hhh](j)}(h unsigned int intlog2 (u32 value)h]j)}(hunsigned int intlog2(u32 value)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~hhhjhKubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~hhhjhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~hhhjhKubj{)}(hintlog2h]j)}(hintlog2h]hintlog2}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj~hhhjhKubj)}(h (u32 value)h]j)}(h u32 valueh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.intlog2asbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hvalueh]hvalue}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhj~hhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjzhhhjhKubah}(h]juah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjwhhubj)}(hhh]h)}(h?computes log2 of a value; the result is shifted left by 24 bitsh]h?computes log2 of a value; the result is shifted left by 24 bits}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhj3hhubah}(h]h ]h"]h$]h&]uh1jhjwhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjNjjNjjjuh1jhhhjXhNhNubj)}(hX**Parameters** ``u32 value`` The value (must be != 0) **Description** to use rational values you can use the following method: intlog2(value) = intlog2(value * 2^x) - x * 2^24 Some usecase examples: intlog2(8) will give 3 << 24 = 3 * 2^24 intlog2(9) will give 3 << 24 + ... = 3.16... * 2^24 intlog2(1.5) = intlog2(3) - 2^24 = 0.584... * 2^24 **Return** log2(value) * 2^24h](h)}(h**Parameters**h]j)}(hjXh]h Parameters}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhjRubj )}(hhh]j)}(h'``u32 value`` The value (must be != 0) h](j)}(h ``u32 value``h]j)}(hjwh]h u32 value}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhjqubj2)}(hhh]h)}(hThe value (must be != 0)h]hThe value (must be != 0)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjqubeh}(h]h ]h"]h$]h&]uh1jhjhKhjnubah}(h]h ]h"]h$]h&]uh1j hjRubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhjRubh)}(h8to use rational values you can use the following method:h]h8to use rational values you can use the following method:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhjRubj)}(h1intlog2(value) = intlog2(value * 2^x) - x * 2^24 h]h)}(h0intlog2(value) = intlog2(value * 2^x) - x * 2^24h]h0intlog2(value) = intlog2(value * 2^x) - x * 2^24}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhjRubh)}(hSome usecase examples:h]hSome usecase examples:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhjRubj)}(hintlog2(8) will give 3 << 24 = 3 * 2^24 intlog2(9) will give 3 << 24 + ... = 3.16... * 2^24 intlog2(1.5) = intlog2(3) - 2^24 = 0.584... * 2^24 h](h)}(h'intlog2(8) will give 3 << 24 = 3 * 2^24h]h'intlog2(8) will give 3 << 24 = 3 * 2^24}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhjubh)}(h3intlog2(9) will give 3 << 24 + ... = 3.16... * 2^24h]h3intlog2(9) will give 3 << 24 + ... = 3.16... * 2^24}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhjubh)}(h2intlog2(1.5) = intlog2(3) - 2^24 = 0.584... * 2^24h]h2intlog2(1.5) = intlog2(3) - 2^24 = 0.584... * 2^24}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjRubh)}(h **Return**h]j)}(hj8h]hReturn}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhjRubh)}(hlog2(value) * 2^24h]hlog2(value) * 2^24}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhKhjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjXhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j intlog10 (C function) c.intlog10hNtauh1hhjXhhhNhNubj)}(hhh](j)}(h!unsigned int intlog10 (u32 value)h]j)}(h unsigned int intlog10(u32 value)h](j )}(hunsignedh]hunsigned}(hj}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjyhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK$ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyhhhjhK$ubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjyhhhjhK$ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyhhhjhK$ubj{)}(hintlog10h]j)}(hintlog10h]hintlog10}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjyhhhjhK$ubj)}(h (u32 value)h]j)}(h u32 valueh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.intlog10asbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hvalueh]hvalue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjyhhhjhK$ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjuhhhjhK$ubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1jhjhK$hjrhhubj)}(hhh]h)}(h@computes log10 of a value; the result is shifted left by 24 bitsh]h@computes log10 of a value; the result is shifted left by 24 bits}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK$hj.hhubah}(h]h ]h"]h$]h&]uh1jhjrhhhjhK$ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjIjjIjjjuh1jhhhjXhNhNubj)}(hX**Parameters** ``u32 value`` The value (must be != 0) **Description** to use rational values you can use the following method: intlog10(value) = intlog10(value * 10^x) - x * 2^24 An usecase example: intlog10(1000) will give 3 << 24 = 3 * 2^24 due to the implementation intlog10(1000) might be not exactly 3 * 2^24 look at intlog2 for similar examples **Return** log10(value) * 2^24h](h)}(h**Parameters**h]j)}(hjSh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK(hjMubj )}(hhh]j)}(h'``u32 value`` The value (must be != 0) h](j)}(h ``u32 value``h]j)}(hjrh]h u32 value}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK&hjlubj2)}(hhh]h)}(hThe value (must be != 0)h]hThe value (must be != 0)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK&hjubah}(h]h ]h"]h$]h&]uh1j1hjlubeh}(h]h ]h"]h$]h&]uh1jhjhK&hjiubah}(h]h ]h"]h$]h&]uh1j hjMubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK(hjMubh)}(h8to use rational values you can use the following method:h]h8to use rational values you can use the following method:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK'hjMubj)}(h4intlog10(value) = intlog10(value * 10^x) - x * 2^24 h]h)}(h3intlog10(value) = intlog10(value * 10^x) - x * 2^24h]h3intlog10(value) = intlog10(value * 10^x) - x * 2^24}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK)hjubah}(h]h ]h"]h$]h&]uh1jhjhK)hjMubh)}(hAn usecase example:h]hAn usecase example:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK+hjMubj)}(hw intlog10(1000) will give 3 << 24 = 3 * 2^24 due to the implementation intlog10(1000) might be not exactly 3 * 2^24 h](j)}(h,intlog10(1000) will give 3 << 24 = 3 * 2^24 h]h)}(h+intlog10(1000) will give 3 << 24 = 3 * 2^24h]h+intlog10(1000) will give 3 << 24 = 3 * 2^24}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK-hjubah}(h]h ]h"]h$]h&]uh1jhjhK-hjubh)}(hFdue to the implementation intlog10(1000) might be not exactly 3 * 2^24h]hFdue to the implementation intlog10(1000) might be not exactly 3 * 2^24}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK/hjubeh}(h]h ]h"]h$]h&]uh1jhjhK-hjMubh)}(h$look at intlog2 for similar examplesh]h$look at intlog2 for similar examples}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK1hjMubh)}(h **Return**h]j)}(hj=h]hReturn}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK3hjMubh)}(hlog10(value) * 2^24h]hlog10(value) * 2^24}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:164: ./include/linux/int_log.hhK4hjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjXhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j int_pow (C function) c.int_powhNtauh1hhjXhhhNhNubj)}(hhh](j)}(h(u64 int_pow (u64 base, unsigned int exp)h]j)}(h'u64 int_pow(u64 base, unsigned int exp)h](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY int_powsb c.int_powasbuh1hhj~hhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:166: ./lib/math/int_pow.chK ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~hhhjhK ubj{)}(hint_powh]j)}(hjh]hint_pow}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj~hhhjhK ubj)}(h(u64 base, unsigned int exp)h](j)}(hu64 baseh](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.int_powasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hbaseh]hbase}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int exph](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hj8hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hexph]hexp}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj~hhhjhK ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjzhhhjhK ubah}(h]juah ](jjeh"]h$]h&]jj)jhuh1jhjhK hjwhhubj)}(hhh]h)}(h:computes the exponentiation of the given base and exponenth]h:computes the exponentiation of the given base and exponent}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:166: ./lib/math/int_pow.chK hj{hhubah}(h]h ]h"]h$]h&]uh1jhjwhhhjhK ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjXhNhNubj)}(h**Parameters** ``u64 base`` base which will be raised to the given power ``unsigned int exp`` power to be raised to **Description** Computes: pow(base, exp), i.e. **base** raised to the **exp** powerh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:166: ./lib/math/int_pow.chKhjubj )}(hhh](j)}(h:``u64 base`` base which will be raised to the given power h](j)}(h ``u64 base``h]j)}(hjh]hu64 base}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:166: ./lib/math/int_pow.chKhjubj2)}(hhh]h)}(h,base which will be raised to the given powerh]h,base which will be raised to the given power}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h+``unsigned int exp`` power to be raised to h](j)}(h``unsigned int exp``h]j)}(hjh]hunsigned int exp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:166: ./lib/math/int_pow.chKhjubj2)}(hhh]h)}(hpower to be raised toh]hpower to be raised to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj3h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:166: ./lib/math/int_pow.chKhjubh)}(hCComputes: pow(base, exp), i.e. **base** raised to the **exp** powerh](hComputes: pow(base, exp), i.e. }(hjIhhhNhNubj)}(h**base**h]hbase}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh raised to the }(hjIhhhNhNubj)}(h**exp**h]hexp}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh power}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:166: ./lib/math/int_pow.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjXhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j int_sqrt (C function) c.int_sqrthNtauh1hhjXhhhNhNubj)}(hhh](j)}(h(unsigned long int_sqrt (unsigned long x)h]j)}(h'unsigned long int_sqrt(unsigned long x)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:169: ./lib/math/int_sqrt.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hint_sqrth]j)}(hint_sqrth]hint_sqrt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(unsigned long x)h]j)}(hunsigned long xh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hj9h]hx}(hj- hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h computes the integer square rooth]h computes the integer square root}(hjV hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:169: ./lib/math/int_sqrt.chKhjS hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjn jjn jjjuh1jhhhjXhNhNubj)}(hw**Parameters** ``unsigned long x`` integer of which to calculate the sqrt **Description** Computes: floor(sqrt(x))h](h)}(h**Parameters**h]j)}(hjx h]h Parameters}(hjz hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:169: ./lib/math/int_sqrt.chKhjr ubj )}(hhh]j)}(h;``unsigned long x`` integer of which to calculate the sqrt h](j)}(h``unsigned long x``h]j)}(hj h]hunsigned long x}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:169: ./lib/math/int_sqrt.chKhj ubj2)}(hhh]h)}(h&integer of which to calculate the sqrth]h&integer of which to calculate the sqrt}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubah}(h]h ]h"]h$]h&]uh1j hjr ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:169: ./lib/math/int_sqrt.chKhjr ubh)}(hComputes: floor(sqrt(x))h]hComputes: floor(sqrt(x))}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:169: ./lib/math/int_sqrt.chKhjr ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjXhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j int_sqrt64 (C function) c.int_sqrt64hNtauh1hhjXhhhNhNubj)}(hhh](j)}(hu32 int_sqrt64 (u64 x)h]j)}(hu32 int_sqrt64(u64 x)h](h)}(hhh]j)}(hu32h]hu32}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY int_sqrt64sb c.int_sqrt64asbuh1hhj hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:169: ./lib/math/int_sqrt.chK-ubj2)}(h h]h }(hj< hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj; hK-ubj{)}(h int_sqrt64h]j)}(hj8 h]h int_sqrt64}(hjN hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj; hK-ubj)}(h(u64 x)h]j)}(hu64 xh](h)}(hhh]j)}(hu64h]hu64}(hjl hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjn modnameN classnameNj] j` )}jc ]j6  c.int_sqrt64asbuh1hhje ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hje ubj)}(hj9h]hx}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhja ubah}(h]h ]h"]h$]h&]jjuh1jhj hhhj; hK-ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj; hK-ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj; hK-hj hhubj)}(hhh]h)}(hGstrongly typed int_sqrt function when minimum 64 bit input is expected.h]hGstrongly typed int_sqrt function when minimum 64 bit input is expected.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:169: ./lib/math/int_sqrt.chK-hj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj; hK-ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjXhNhNubj)}(hH**Parameters** ``u64 x`` 64bit integer of which to calculate the sqrth](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:169: ./lib/math/int_sqrt.chK1hj ubj )}(hhh]j)}(h6``u64 x`` 64bit integer of which to calculate the sqrth](j)}(h ``u64 x``h]j)}(hj h]hu64 x}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:169: ./lib/math/int_sqrt.chK3hj ubj2)}(hhh]h)}(h,64bit integer of which to calculate the sqrth]h,64bit integer of which to calculate the sqrt}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:169: ./lib/math/int_sqrt.chK/hj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hK3hj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjXhhhNhNubeh}(h]integer-log-and-power-functionsah ]h"]integer log and power functionsah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hDivision Functionsh]hDivision Functions}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjK hhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j do_div (C macro)c.do_divhNtauh1hhjK hhhNhNubj)}(hhh](j)}(hdo_divh]j)}(hdo_divh]j{)}(hdo_divh]j)}(hjo h]hdo_div}(hjy hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjq hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjm hhhj hK ubah}(h]jh ah ](jjeh"]h$]h&]jj)jhuh1jhj hK hjj hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjj hhhj hK ubeh}(h]h ](jmacroeh"]h$]h&]jjjj jj jjjuh1jhhhjK hNhNubh)}(h``do_div (n, base)``h]j)}(hj h]hdo_div (n, base)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK"hjK hhubj)}(h>returns 2 values: calculate remainder and update new dividend h]h)}(h=returns 2 values: calculate remainder and update new dividendh]h=returns 2 values: calculate remainder and update new dividend}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK hj ubah}(h]h ]h"]h$]h&]uh1jhj hK hjK hhubj)}(hX**Parameters** ``n`` uint64_t dividend (will be updated) ``base`` uint32_t divisor **Description** Summary: ``uint32_t remainder = n % base;`` ``n = n / base;`` **Return** (uint32_t)remainder **NOTE** macro parameter **n** is evaluated multiple times, beware of side effects!h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK$hj ubj )}(hhh](j)}(h*``n`` uint64_t dividend (will be updated) h](j)}(h``n``h]j)}(hj h]hn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK!hj ubj2)}(hhh]h)}(h#uint64_t dividend (will be updated)h]h#uint64_t dividend (will be updated)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK!hj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hK!hj ubj)}(h``base`` uint32_t divisor h](j)}(h``base``h]j)}(hj8 h]hbase}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6 ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK"hj2 ubj2)}(hhh]h)}(huint32_t divisorh]huint32_t divisor}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjM hK"hjN ubah}(h]h ]h"]h$]h&]uh1j1hj2 ubeh}(h]h ]h"]h$]h&]uh1jhjM hK"hj ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjs h]h Description}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK$hj ubh)}(h=Summary: ``uint32_t remainder = n % base;`` ``n = n / base;``h](h Summary: }(hj hhhNhNubj)}(h"``uint32_t remainder = n % base;``h]huint32_t remainder = n % base;}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh }(hj hhhNhNubj)}(h``n = n / base;``h]h n = n / base;}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK#hj ubh)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK'hj ubh)}(h(uint32_t)remainderh]h(uint32_t)remainder}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK(hj ubh)}(h**NOTE**h]j)}(hj h]hNOTE}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK*hj ubh)}(hJmacro parameter **n** is evaluated multiple times, beware of side effects!h](hmacro parameter }(hj hhhNhNubj)}(h**n**h]hn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh5 is evaluated multiple times, beware of side effects!}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:175: ./include/asm-generic/div64.hhK*hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j div_u64_rem (C function) c.div_u64_remhNtauh1hhjK hhhNhNubj)}(hhh](j)}(h;u64 div_u64_rem (u64 dividend, u32 divisor, u32 *remainder)h]j)}(h:u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)h](h)}(hhh]j)}(hu64h]hu64}(hj; hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8 ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj= modnameN classnameNj] j` )}jc ]jf )}jY div_u64_remsb c.div_u64_remasbuh1hhj4 hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKubj2)}(h h]h }(hj] hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4 hhhj\ hKubj{)}(h div_u64_remh]j)}(hjY h]h div_u64_rem}(hjo hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj4 hhhj\ hKubj)}(h+(u64 dividend, u32 divisor, u32 *remainder)h](j)}(h u64 dividendh](h)}(hhh]j)}(hu64h]hu64}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jW  c.div_u64_remasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hdividendh]hdividend}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(h u32 divisorh](h)}(hhh]j)}(hu32h]hu32}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jW  c.div_u64_remasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hdivisorh]hdivisor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hu32 *remainderh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jW  c.div_u64_remasbuh1hhjubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h remainderh]h remainder}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhj4 hhhj\ hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj0 hhhj\ hKubah}(h]j+ ah ](jjeh"]h$]h&]jj)jhuh1jhj\ hKhj- hhubj)}(hhh]h)}(h7unsigned 64bit divide with 32bit divisor with remainderh]h7unsigned 64bit divide with 32bit divisor with remainder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhj}hhubah}(h]h ]h"]h$]h&]uh1jhj- hhhj\ hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjK hNhNubj)}(hXA**Parameters** ``u64 dividend`` unsigned 64bit dividend ``u32 divisor`` unsigned 32bit divisor ``u32 *remainder`` pointer to unsigned 32bit remainder **Return** sets ``*remainder``, then returns dividend / divisor **Description** This is commonly provided by 32bit archs to provide an optimized 64bit divide.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhjubj )}(hhh](j)}(h)``u64 dividend`` unsigned 64bit dividend h](j)}(h``u64 dividend``h]j)}(hjh]h u64 dividend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhjubj2)}(hhh]h)}(hunsigned 64bit dividendh]hunsigned 64bit dividend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h'``u32 divisor`` unsigned 32bit divisor h](j)}(h``u32 divisor``h]j)}(hjh]h u32 divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhjubj2)}(hhh]h)}(hunsigned 32bit divisorh]hunsigned 32bit divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h7``u32 *remainder`` pointer to unsigned 32bit remainder h](j)}(h``u32 *remainder``h]j)}(hj3h]hu32 *remainder}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhj-ubj2)}(hhh]h)}(h#pointer to unsigned 32bit remainderh]h#pointer to unsigned 32bit remainder}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhKhjIubah}(h]h ]h"]h$]h&]uh1j1hj-ubeh}(h]h ]h"]h$]h&]uh1jhjHhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjnh]hReturn}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhjubh)}(h4sets ``*remainder``, then returns dividend / divisorh](hsets }(hjhhhNhNubj)}(h``*remainder``h]h *remainder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh!, then returns dividend / divisor}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhjubh)}(hNThis is commonly provided by 32bit archs to provide an optimized 64bit divide.h]hNThis is commonly provided by 32bit archs to provide an optimized 64bit divide.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j div_s64_rem (C function) c.div_s64_remhNtauh1hhjK hhhNhNubj)}(hhh](j)}(h;s64 div_s64_rem (s64 dividend, s32 divisor, s32 *remainder)h]j)}(h:s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder)h](h)}(hhh]j)}(hs64h]hs64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY div_s64_remsb c.div_s64_remasbuh1hhjhhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK!ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhK!ubj{)}(h div_s64_remh]j)}(hj h]h div_s64_rem}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhK!ubj)}(h+(s64 dividend, s32 divisor, s32 *remainder)h](j)}(h s64 dividendh](h)}(hhh]j)}(hs64h]hs64}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjCmodnameN classnameNj] j` )}jc ]j  c.div_s64_remasbuh1hhj:ubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(hdividendh]hdividend}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj6ubj)}(h s32 divisorh](h)}(hhh]j)}(hs32h]hs32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j  c.div_s64_remasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdivisorh]hdivisor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj6ubj)}(hs32 *remainderh](h)}(hhh]j)}(hs32h]hs32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j  c.div_s64_remasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h remainderh]h remainder}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj6ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhK!ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK!ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK!hjhhubj)}(hhh]h)}(h5signed 64bit divide with 32bit divisor with remainderh]h5signed 64bit divide with 32bit divisor with remainder}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK!hj1hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK!ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjLjjLjjjuh1jhhhjK hNhNubj)}(h**Parameters** ``s64 dividend`` signed 64bit dividend ``s32 divisor`` signed 32bit divisor ``s32 *remainder`` pointer to signed 32bit remainder **Return** sets ``*remainder``, then returns dividend / divisorh](h)}(h**Parameters**h]j)}(hjVh]h Parameters}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK%hjPubj )}(hhh](j)}(h'``s64 dividend`` signed 64bit dividend h](j)}(h``s64 dividend``h]j)}(hjuh]h s64 dividend}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK"hjoubj2)}(hhh]h)}(hsigned 64bit dividendh]hsigned 64bit dividend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK"hjubah}(h]h ]h"]h$]h&]uh1j1hjoubeh}(h]h ]h"]h$]h&]uh1jhjhK"hjlubj)}(h%``s32 divisor`` signed 32bit divisor h](j)}(h``s32 divisor``h]j)}(hjh]h s32 divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK#hjubj2)}(hhh]h)}(hsigned 32bit divisorh]hsigned 32bit divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK#hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK#hjlubj)}(h5``s32 *remainder`` pointer to signed 32bit remainder h](j)}(h``s32 *remainder``h]j)}(hjh]hs32 *remainder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK$hjubj2)}(hhh]h)}(h!pointer to signed 32bit remainderh]h!pointer to signed 32bit remainder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK$hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK$hjlubeh}(h]h ]h"]h$]h&]uh1j hjPubh)}(h **Return**h]j)}(hj"h]hReturn}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK&hjPubh)}(h4sets ``*remainder``, then returns dividend / divisorh](hsets }(hj8hhhNhNubj)}(h``*remainder``h]h *remainder}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubh!, then returns dividend / divisor}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK&hjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j div64_u64_rem (C function)c.div64_u64_remhNtauh1hhjK hhhNhNubj)}(hhh](j)}(h=u64 div64_u64_rem (u64 dividend, u64 divisor, u64 *remainder)h]j)}(hah"]h$]h&]uh1j1hjuhhhjhK/ubj{)}(h div64_u64_remh]j)}(hjh]h div64_u64_rem}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjuhhhjhK/ubj)}(h+(u64 dividend, u64 divisor, u64 *remainder)h](j)}(h u64 dividendh](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.div64_u64_remasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdividendh]hdividend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h u64 divisorh](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.div64_u64_remasbuh1hhjubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdivisorh]hdivisor}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hu64 *remainderh](h)}(hhh]j)}(hu64h]hu64}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj`modnameN classnameNj] j` )}jc ]jc.div64_u64_remasbuh1hhjWubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(h remainderh]h remainder}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjuhhhjhK/ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjqhhhjhK/ubah}(h]jlah ](jjeh"]h$]h&]jj)jhuh1jhjhK/hjnhhubj)}(hhh]h)}(h6unsigned 64bit divide with 64bit divisor and remainderh]h6unsigned 64bit divide with 64bit divisor and remainder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK/hjhhubah}(h]h ]h"]h$]h&]uh1jhjnhhhjhK/ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjK hNhNubj)}(h**Parameters** ``u64 dividend`` unsigned 64bit dividend ``u64 divisor`` unsigned 64bit divisor ``u64 *remainder`` pointer to unsigned 64bit remainder **Return** sets ``*remainder``, then returns dividend / divisorh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK3hjubj )}(hhh](j)}(h)``u64 dividend`` unsigned 64bit dividend h](j)}(h``u64 dividend``h]j)}(hjh]h u64 dividend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK0hjubj2)}(hhh]h)}(hunsigned 64bit dividendh]hunsigned 64bit dividend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK0hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK0hjubj)}(h'``u64 divisor`` unsigned 64bit divisor h](j)}(h``u64 divisor``h]j)}(hj;h]h u64 divisor}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK1hj5ubj2)}(hhh]h)}(hunsigned 64bit divisorh]hunsigned 64bit divisor}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhK1hjQubah}(h]h ]h"]h$]h&]uh1j1hj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhK1hjubj)}(h7``u64 *remainder`` pointer to unsigned 64bit remainder h](j)}(h``u64 *remainder``h]j)}(hjth]hu64 *remainder}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK2hjnubj2)}(hhh]h)}(h#pointer to unsigned 64bit remainderh]h#pointer to unsigned 64bit remainder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK2hjubah}(h]h ]h"]h$]h&]uh1j1hjnubeh}(h]h ]h"]h$]h&]uh1jhjhK2hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK4hjubh)}(h4sets ``*remainder``, then returns dividend / divisorh](hsets }(hjhhhNhNubj)}(h``*remainder``h]h *remainder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh!, then returns dividend / divisor}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK4hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j div64_u64 (C function) c.div64_u64hNtauh1hhjK hhhNhNubj)}(hhh](j)}(h)u64 div64_u64 (u64 dividend, u64 divisor)h]j)}(h(u64 div64_u64(u64 dividend, u64 divisor)h](h)}(hhh]j)}(hu64h]hu64}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY div64_u64sb c.div64_u64asbuh1hhjhhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK=ubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj*hK=ubj{)}(h div64_u64h]j)}(hj'h]h div64_u64}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj*hK=ubj)}(h(u64 dividend, u64 divisor)h](j)}(h u64 dividendh](h)}(hhh]j)}(hu64h]hu64}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj]modnameN classnameNj] j` )}jc ]j% c.div64_u64asbuh1hhjTubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hdividendh]hdividend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(h u64 divisorh](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j% c.div64_u64asbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdivisorh]hdivisor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj*hK=ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj*hK=ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj*hK=hjhhubj)}(hhh]h)}(h(unsigned 64bit divide with 64bit divisorh]h(unsigned 64bit divide with 64bit divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK=hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj*hK=ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjK hNhNubj)}(h**Parameters** ``u64 dividend`` unsigned 64bit dividend ``u64 divisor`` unsigned 64bit divisor **Return** dividend / divisorh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKAhjubj )}(hhh](j)}(h)``u64 dividend`` unsigned 64bit dividend h](j)}(h``u64 dividend``h]j)}(hj:h]h u64 dividend}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK>hj4ubj2)}(hhh]h)}(hunsigned 64bit dividendh]hunsigned 64bit dividend}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhK>hjPubah}(h]h ]h"]h$]h&]uh1j1hj4ubeh}(h]h ]h"]h$]h&]uh1jhjOhK>hj1ubj)}(h'``u64 divisor`` unsigned 64bit divisor h](j)}(h``u64 divisor``h]j)}(hjsh]h u64 divisor}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK?hjmubj2)}(hhh]h)}(hunsigned 64bit divisorh]hunsigned 64bit divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK?hjubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjhK?hj1ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKAhjubh)}(hdividend / divisorh]hdividend / divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKAhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j div64_s64 (C function) c.div64_s64hNtauh1hhjK hhhNhNubj)}(hhh](j)}(h)s64 div64_s64 (s64 dividend, s64 divisor)h]j)}(h(s64 div64_s64(s64 dividend, s64 divisor)h](h)}(hhh]j)}(hs64h]hs64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY div64_s64sb c.div64_s64asbuh1hhjhhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKIubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKIubj{)}(h div64_s64h]j)}(hjh]h div64_s64}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKIubj)}(h(s64 dividend, s64 divisor)h](j)}(h s64 dividendh](h)}(hhh]j)}(hs64h]hs64}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjJmodnameN classnameNj] j` )}jc ]j c.div64_s64asbuh1hhjAubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubj)}(hdividendh]hdividend}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(h s64 divisorh](h)}(hhh]j)}(hs64h]hs64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.div64_s64asbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdivisorh]hdivisor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKIubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKIubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKIhjhhubj)}(hhh]h)}(h&signed 64bit divide with 64bit divisorh]h&signed 64bit divide with 64bit divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKIhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKIubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjK hNhNubj)}(h**Parameters** ``s64 dividend`` signed 64bit dividend ``s64 divisor`` signed 64bit divisor **Return** dividend / divisorh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKMhjubj )}(hhh](j)}(h'``s64 dividend`` signed 64bit dividend h](j)}(h``s64 dividend``h]j)}(hj'h]h s64 dividend}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKJhj!ubj2)}(hhh]h)}(hsigned 64bit dividendh]hsigned 64bit dividend}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hKJhj=ubah}(h]h ]h"]h$]h&]uh1j1hj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hKJhjubj)}(h%``s64 divisor`` signed 64bit divisor h](j)}(h``s64 divisor``h]j)}(hj`h]h s64 divisor}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKKhjZubj2)}(hhh]h)}(hsigned 64bit divisorh]hsigned 64bit divisor}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhKKhjvubah}(h]h ]h"]h$]h&]uh1j1hjZubeh}(h]h ]h"]h$]h&]uh1jhjuhKKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKMhjubh)}(hdividend / divisorh]hdividend / divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j div_u64 (C function) c.div_u64hNtauh1hhjK hhhNhNubj)}(hhh](j)}(h'u64 div_u64 (u64 dividend, u32 divisor)h]j)}(h&u64 div_u64(u64 dividend, u32 divisor)h](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY div_u64sb c.div_u64asbuh1hhjhhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKtubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKtubj{)}(hdiv_u64h]j)}(hjh]hdiv_u64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKtubj)}(h(u64 dividend, u32 divisor)h](j)}(h u64 dividendh](h)}(hhh]j)}(hu64h]hu64}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7modnameN classnameNj] j` )}jc ]j c.div_u64asbuh1hhj.ubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hdividendh]hdividend}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*ubj)}(h u32 divisorh](h)}(hhh]j)}(hu32h]hu32}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.div_u64asbuh1hhjvubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubj)}(hdivisorh]hdivisor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKtubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKtubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKthjhhubj)}(hhh]h)}(h(unsigned 64bit divide with 32bit divisorh]h(unsigned 64bit divide with 32bit divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKthjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKtubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjK hNhNubj)}(hX***Parameters** ``u64 dividend`` unsigned 64bit dividend ``u32 divisor`` unsigned 32bit divisor **Description** This is the most common 64bit divide and should be used if possible, as many 32bit archs can optimize this variant better than a full 64bit divide. **Return** dividend / divisorh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKxhjubj )}(hhh](j)}(h)``u64 dividend`` unsigned 64bit dividend h](j)}(h``u64 dividend``h]j)}(hjh]h u64 dividend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKuhjubj2)}(hhh]h)}(hunsigned 64bit dividendh]hunsigned 64bit dividend}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hKuhj*ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj)hKuhj ubj)}(h'``u32 divisor`` unsigned 32bit divisor h](j)}(h``u32 divisor``h]j)}(hjMh]h u32 divisor}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKvhjGubj2)}(hhh]h)}(hunsigned 32bit divisorh]hunsigned 32bit divisor}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhKvhjcubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhjbhKvhj ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKxhjubh)}(hThis is the most common 64bit divide and should be used if possible, as many 32bit archs can optimize this variant better than a full 64bit divide.h]hThis is the most common 64bit divide and should be used if possible, as many 32bit archs can optimize this variant better than a full 64bit divide.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKwhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK{hjubh)}(hdividend / divisorh]hdividend / divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhK|hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j div_s64 (C function) c.div_s64hNtauh1hhjK hhhNhNubj)}(hhh](j)}(h's64 div_s64 (s64 dividend, s32 divisor)h]j)}(h&s64 div_s64(s64 dividend, s32 divisor)h](h)}(hhh]j)}(hs64h]hs64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY div_s64sb c.div_s64asbuh1hhjhhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hdiv_s64h]j)}(hjh]hdiv_s64}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(s64 dividend, s32 divisor)h](j)}(h s64 dividendh](h)}(hhh]j)}(hs64h]hs64}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjKmodnameN classnameNj] j` )}jc ]j c.div_s64asbuh1hhjBubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hdividendh]hdividend}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj>ubj)}(h s32 divisorh](h)}(hhh]j)}(hs32h]hs32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.div_s64asbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdivisorh]hdivisor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj>ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h&signed 64bit divide with 32bit divisorh]h&signed 64bit divide with 32bit divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjK hNhNubj)}(h**Parameters** ``s64 dividend`` signed 64bit dividend ``s32 divisor`` signed 32bit divisor **Return** dividend / divisorh](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhjubj )}(hhh](j)}(h'``s64 dividend`` signed 64bit dividend h](j)}(h``s64 dividend``h]j)}(hj(h]h s64 dividend}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhj"ubj2)}(hhh]h)}(hsigned 64bit dividendh]hsigned 64bit dividend}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj>ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hKhjubj)}(h%``s32 divisor`` signed 32bit divisor h](j)}(h``s32 divisor``h]j)}(hjah]h s32 divisor}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhj[ubj2)}(hhh]h)}(hsigned 32bit divisorh]hsigned 32bit divisor}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhKhjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhjubh)}(hdividend / divisorh]hdividend / divisor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $mul_u64_add_u64_div_u64 (C function)c.mul_u64_add_u64_div_u64hNtauh1hhjK hhhNhNubj)}(hhh](j)}(h8u64 mul_u64_add_u64_div_u64 (u64 a, u64 b, u64 c, u64 d)h]j)}(h7u64 mul_u64_add_u64_div_u64(u64 a, u64 b, u64 c, u64 d)h](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY mul_u64_add_u64_div_u64sbc.mul_u64_add_u64_div_u64asbuh1hhjhhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM)ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM)ubj{)}(hmul_u64_add_u64_div_u64h]j)}(hjh]hmul_u64_add_u64_div_u64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM)ubj)}(h(u64 a, u64 b, u64 c, u64 d)h](j)}(hu64 ah](h)}(hhh]j)}(hu64h]hu64}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj8modnameN classnameNj] j` )}jc ]jc.mul_u64_add_u64_div_u64asbuh1hhj/ubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(hjh]ha}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(hu64 bh](h)}(hhh]j)}(hu64h]hu64}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.mul_u64_add_u64_div_u64asbuh1hhjvubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubj)}(hjLh]hb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(hu64 ch](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.mul_u64_add_u64_div_u64asbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]hc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(hu64 dh](h)}(hhh]j)}(hu64h]hu64}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jc.mul_u64_add_u64_div_u64asbuh1hhjubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdh]hd}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM)ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM)ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM)hjhhubj)}(hhh]h)}(h(unsigned 64bit multiply, add, and divideh]h(unsigned 64bit multiply, add, and divide}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM)hj^hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM)ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjyjjyjjjuh1jhhhjK hNhNubj)}(hX**Parameters** ``u64 a`` first unsigned 64bit multiplicand ``u64 b`` second unsigned 64bit multiplicand ``u64 c`` unsigned 64bit addend ``u64 d`` unsigned 64bit divisor **Description** Multiply two 64bit values together to generate a 128bit product add a third value and then divide by a fourth. The Generic code divides by 0 if **d** is zero and returns ~0 on overflow. Architecture specific code may trap on zero or overflow. **Return** (**a** * **b** + **c**) / **d**h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM-hj}ubj )}(hhh](j)}(h,``u64 a`` first unsigned 64bit multiplicand h](j)}(h ``u64 a``h]j)}(hjh]hu64 a}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM*hjubj2)}(hhh]h)}(h!first unsigned 64bit multiplicandh]h!first unsigned 64bit multiplicand}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM*hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM*hjubj)}(h-``u64 b`` second unsigned 64bit multiplicand h](j)}(h ``u64 b``h]j)}(hjh]hu64 b}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM+hjubj2)}(hhh]h)}(h"second unsigned 64bit multiplicandh]h"second unsigned 64bit multiplicand}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM+hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM+hjubj)}(h ``u64 c`` unsigned 64bit addend h](j)}(h ``u64 c``h]j)}(hjh]hu64 c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM,hjubj2)}(hhh]h)}(hunsigned 64bit addendh]hunsigned 64bit addend}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hM,hj*ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj)hM,hjubj)}(h!``u64 d`` unsigned 64bit divisor h](j)}(h ``u64 d``h]j)}(hjMh]hu64 d}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM-hjGubj2)}(hhh]h)}(hunsigned 64bit divisorh]hunsigned 64bit divisor}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhM-hjcubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhjbhM-hjubeh}(h]h ]h"]h$]h&]uh1j hj}ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM/hj}ubh)}(hMultiply two 64bit values together to generate a 128bit product add a third value and then divide by a fourth. The Generic code divides by 0 if **d** is zero and returns ~0 on overflow. Architecture specific code may trap on zero or overflow.h](hMultiply two 64bit values together to generate a 128bit product add a third value and then divide by a fourth. The Generic code divides by 0 if }(hjhhhNhNubj)}(h**d**h]hd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh] is zero and returns ~0 on overflow. Architecture specific code may trap on zero or overflow.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM.hj}ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM3hj}ubh)}(h(**a** * **b** + **c**) / **d**h](h(}(hjhhhNhNubj)}(h**a**h]ha}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh * }(hjhhhNhNubj)}(h**b**h]hb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh + }(hjhhhNhNubj)}(h**c**h]hc}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) / }(hjhhhNhNubj)}(h**d**h]hd}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM4hj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j mul_u64_u64_div_u64 (C macro)c.mul_u64_u64_div_u64hNtauh1hhjK hhhNhNubj)}(hhh](j)}(hmul_u64_u64_div_u64h]j)}(hmul_u64_u64_div_u64h]j{)}(hmul_u64_u64_div_u64h]j)}(hjD h]hmul_u64_u64_div_u64}(hjN hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjF hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM9ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjB hhhja hM9ubah}(h]j= ah ](jjeh"]h$]h&]jj)jhuh1jhja hM9hj? hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj? hhhja hM9ubeh}(h]h ](jmacroeh"]h$]h&]jjjjz jjz jjjuh1jhhhjK hNhNubh)}(h!``mul_u64_u64_div_u64 (a, b, d)``h]j)}(hj h]hmul_u64_u64_div_u64 (a, b, d)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM;hjK hhubj)}(h#unsigned 64bit multiply and divide h]h)}(h"unsigned 64bit multiply and divideh]h"unsigned 64bit multiply and divide}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM9hj ubah}(h]h ]h"]h$]h&]uh1jhj hM9hjK hhubj)}(hX**Parameters** ``a`` first unsigned 64bit multiplicand ``b`` second unsigned 64bit multiplicand ``d`` unsigned 64bit divisor **Description** Multiply two 64bit values together to generate a 128bit product and then divide by a third value. The Generic code divides by 0 if **d** is zero and returns ~0 on overflow. Architecture specific code may trap on zero or overflow. **Return** **a** * **b** / **d**h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM=hj ubj )}(hhh](j)}(h(``a`` first unsigned 64bit multiplicand h](j)}(h``a``h]j)}(hj h]ha}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM:hj ubj2)}(hhh]h)}(h!first unsigned 64bit multiplicandh]h!first unsigned 64bit multiplicand}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM:hj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hM:hj ubj)}(h)``b`` second unsigned 64bit multiplicand h](j)}(h``b``h]j)}(hj !h]hb}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj !ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM;hj!ubj2)}(hhh]h)}(h"second unsigned 64bit multiplicandh]h"second unsigned 64bit multiplicand}(hj&!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"!hM;hj#!ubah}(h]h ]h"]h$]h&]uh1j1hj!ubeh}(h]h ]h"]h$]h&]uh1jhj"!hM;hj ubj)}(h``d`` unsigned 64bit divisor h](j)}(h``d``h]j)}(hjF!h]hd}(hjH!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD!ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM<hj@!ubj2)}(hhh]h)}(hunsigned 64bit divisorh]hunsigned 64bit divisor}(hj_!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[!hM<hj\!ubah}(h]h ]h"]h$]h&]uh1j1hj@!ubeh}(h]h ]h"]h$]h&]uh1jhj[!hM<hj ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hj!h]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM>hj ubh)}(hMultiply two 64bit values together to generate a 128bit product and then divide by a third value. The Generic code divides by 0 if **d** is zero and returns ~0 on overflow. Architecture specific code may trap on zero or overflow.h](hMultiply two 64bit values together to generate a 128bit product and then divide by a third value. The Generic code divides by 0 if }(hj!hhhNhNubj)}(h**d**h]hd}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh] is zero and returns ~0 on overflow. Architecture specific code may trap on zero or overflow.}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM=hj ubh)}(h **Return**h]j)}(hj!h]hReturn}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMBhj ubh)}(h**a** * **b** / **d**h](j)}(h**a**h]ha}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh * }(hj!hhhNhNubj)}(h**b**h]hb}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh / }(hj!hhhNhNubj)}(h**d**h]hd}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMChj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %mul_u64_u64_div_u64_roundup (C macro)c.mul_u64_u64_div_u64_rounduphNtauh1hhjK hhhNhNubj)}(hhh](j)}(hmul_u64_u64_div_u64_rounduph]j)}(hmul_u64_u64_div_u64_rounduph]j{)}(hmul_u64_u64_div_u64_rounduph]j)}(hj'"h]hmul_u64_u64_div_u64_roundup}(hj1"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-"ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj)"hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMHubah}(h]h ]h"]h$]h&]jjjuh1jjjhj%"hhhjD"hMHubah}(h]j "ah ](jjeh"]h$]h&]jj)jhuh1jhjD"hMHhj""hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj""hhhjD"hMHubeh}(h]h ](jmacroeh"]h$]h&]jjjj]"jj]"jjjuh1jhhhjK hNhNubh)}(h)``mul_u64_u64_div_u64_roundup (a, b, d)``h]j)}(hjc"h]h%mul_u64_u64_div_u64_roundup (a, b, d)}(hje"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhja"ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMJhjK hhubj)}(h.unsigned 64bit multiply and divide rounded up h]h)}(h-unsigned 64bit multiply and divide rounded uph]h-unsigned 64bit multiply and divide rounded up}(hj}"hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMHhjy"ubah}(h]h ]h"]h$]h&]uh1jhj"hMHhjK hhubj)}(hX**Parameters** ``a`` first unsigned 64bit multiplicand ``b`` second unsigned 64bit multiplicand ``d`` unsigned 64bit divisor **Description** Multiply two 64bit values together to generate a 128bit product and then divide and round up. The Generic code divides by 0 if **d** is zero and returns ~0 on overflow. Architecture specific code may trap on zero or overflow. **Return** (**a** * **b** + **d** - 1) / **d**h](h)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMLhj"ubj )}(hhh](j)}(h(``a`` first unsigned 64bit multiplicand h](j)}(h``a``h]j)}(hj"h]ha}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMIhj"ubj2)}(hhh]h)}(h!first unsigned 64bit multiplicandh]h!first unsigned 64bit multiplicand}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMIhj"ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hMIhj"ubj)}(h)``b`` second unsigned 64bit multiplicand h](j)}(h``b``h]j)}(hj"h]hb}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMJhj"ubj2)}(hhh]h)}(h"second unsigned 64bit multiplicandh]h"second unsigned 64bit multiplicand}(hj #hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMJhj#ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj#hMJhj"ubj)}(h``d`` unsigned 64bit divisor h](j)}(h``d``h]j)}(hj)#h]hd}(hj+#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'#ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMKhj##ubj2)}(hhh]h)}(hunsigned 64bit divisorh]hunsigned 64bit divisor}(hjB#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>#hMKhj?#ubah}(h]h ]h"]h$]h&]uh1j1hj##ubeh}(h]h ]h"]h$]h&]uh1jhj>#hMKhj"ubeh}(h]h ]h"]h$]h&]uh1j hj"ubh)}(h**Description**h]j)}(hjd#h]h Description}(hjf#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb#ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMMhj"ubh)}(hMultiply two 64bit values together to generate a 128bit product and then divide and round up. The Generic code divides by 0 if **d** is zero and returns ~0 on overflow. Architecture specific code may trap on zero or overflow.h](hMultiply two 64bit values together to generate a 128bit product and then divide and round up. The Generic code divides by 0 if }(hjz#hhhNhNubj)}(h**d**h]hd}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz#ubh] is zero and returns ~0 on overflow. Architecture specific code may trap on zero or overflow.}(hjz#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMLhj"ubh)}(h **Return**h]j)}(hj#h]hReturn}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMQhj"ubh)}(h#(**a** * **b** + **d** - 1) / **d**h](h(}(hj#hhhNhNubj)}(h**a**h]ha}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh * }(hj#hhhNhNubj)}(h**b**h]hb}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh + }(hj#hhhNhNubj)}(h**d**h]hd}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh - 1) / }(hj#hhhNhNubj)}(h**d**h]hd}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMRhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j DIV64_U64_ROUND_UP (C macro)c.DIV64_U64_ROUND_UPhNtauh1hhjK hhhNhNubj)}(hhh](j)}(hDIV64_U64_ROUND_UPh]j)}(hDIV64_U64_ROUND_UPh]j{)}(hDIV64_U64_ROUND_UPh]j)}(hj $h]hDIV64_U64_ROUND_UP}(hj*$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&$ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj"$hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMYubah}(h]h ]h"]h$]h&]jjjuh1jjjhj$hhhj=$hMYubah}(h]j$ah ](jjeh"]h$]h&]jj)jhuh1jhj=$hMYhj$hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj$hhhj=$hMYubeh}(h]h ](jmacroeh"]h$]h&]jjjjV$jjV$jjjuh1jhhhjK hNhNubh)}(h``DIV64_U64_ROUND_UP (ll, d)``h]j)}(hj\$h]hDIV64_U64_ROUND_UP (ll, d)}(hj^$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ$ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM[hjK hhubj)}(h4unsigned 64bit divide with 64bit divisor rounded up h]h)}(h3unsigned 64bit divide with 64bit divisor rounded uph]h3unsigned 64bit divide with 64bit divisor rounded up}(hjv$hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMYhjr$ubah}(h]h ]h"]h$]h&]uh1jhj$hMYhjK hhubj)}(h**Parameters** ``ll`` unsigned 64bit dividend ``d`` unsigned 64bit divisor **Description** Divide unsigned 64bit dividend by unsigned 64bit divisor and round up. **Return** dividend / divisor rounded uph](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM]hj$ubj )}(hhh](j)}(h``ll`` unsigned 64bit dividend h](j)}(h``ll``h]j)}(hj$h]hll}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMZhj$ubj2)}(hhh]h)}(hunsigned 64bit dividendh]hunsigned 64bit dividend}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMZhj$ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hMZhj$ubj)}(h``d`` unsigned 64bit divisor h](j)}(h``d``h]j)}(hj$h]hd}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM[hj$ubj2)}(hhh]h)}(hunsigned 64bit divisorh]hunsigned 64bit divisor}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hM[hj$ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hM[hj$ubeh}(h]h ]h"]h$]h&]uh1j hj$ubh)}(h**Description**h]j)}(hj$%h]h Description}(hj&%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"%ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM]hj$ubh)}(hFDivide unsigned 64bit dividend by unsigned 64bit divisor and round up.h]hFDivide unsigned 64bit dividend by unsigned 64bit divisor and round up.}(hj:%hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM\hj$ubh)}(h **Return**h]j)}(hjK%h]hReturn}(hjM%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjI%ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM_hj$ubh)}(hdividend / divisor rounded uph]hdividend / divisor rounded up}(hja%hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhM`hj$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j DIV_U64_ROUND_UP (C macro)c.DIV_U64_ROUND_UPhNtauh1hhjK hhhNhNubj)}(hhh](j)}(hDIV_U64_ROUND_UPh]j)}(hDIV_U64_ROUND_UPh]j{)}(hDIV_U64_ROUND_UPh]j)}(hj%h]hDIV_U64_ROUND_UP}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj%hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMfubah}(h]h ]h"]h$]h&]jjjuh1jjjhj%hhhj%hMfubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj%hMfhj%hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj%hhhj%hMfubeh}(h]h ](jmacroeh"]h$]h&]jjjj%jj%jjjuh1jhhhjK hNhNubh)}(h``DIV_U64_ROUND_UP (ll, d)``h]j)}(hj%h]hDIV_U64_ROUND_UP (ll, d)}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhhjK hhubj)}(h4unsigned 64bit divide with 32bit divisor rounded up h]h)}(h3unsigned 64bit divide with 32bit divisor rounded uph]h3unsigned 64bit divide with 32bit divisor rounded up}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMfhj%ubah}(h]h ]h"]h$]h&]uh1jhj%hMfhjK hhubj)}(h**Parameters** ``ll`` unsigned 64bit dividend ``d`` unsigned 32bit divisor **Description** Divide unsigned 64bit dividend by unsigned 32bit divisor and round up. **Return** dividend / divisor rounded uph](h)}(h**Parameters**h]j)}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMjhj%ubj )}(hhh](j)}(h``ll`` unsigned 64bit dividend h](j)}(h``ll``h]j)}(hj&h]hll}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMghj&ubj2)}(hhh]h)}(hunsigned 64bit dividendh]hunsigned 64bit dividend}(hj3&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/&hMghj0&ubah}(h]h ]h"]h$]h&]uh1j1hj&ubeh}(h]h ]h"]h$]h&]uh1jhj/&hMghj&ubj)}(h``d`` unsigned 32bit divisor h](j)}(h``d``h]j)}(hjS&h]hd}(hjU&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ&ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhhjM&ubj2)}(hhh]h)}(hunsigned 32bit divisorh]hunsigned 32bit divisor}(hjl&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjh&hMhhji&ubah}(h]h ]h"]h$]h&]uh1j1hjM&ubeh}(h]h ]h"]h$]h&]uh1jhjh&hMhhj&ubeh}(h]h ]h"]h$]h&]uh1j hj%ubh)}(h**Description**h]j)}(hj&h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMjhj%ubh)}(hFDivide unsigned 64bit dividend by unsigned 32bit divisor and round up.h]hFDivide unsigned 64bit dividend by unsigned 32bit divisor and round up.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMihj%ubh)}(h **Return**h]j)}(hj&h]hReturn}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMlhj%ubh)}(hdividend / divisor rounded uph]hdividend / divisor rounded up}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMmhj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !DIV64_U64_ROUND_CLOSEST (C macro)c.DIV64_U64_ROUND_CLOSESThNtauh1hhjK hhhNhNubj)}(hhh](j)}(hDIV64_U64_ROUND_CLOSESTh]j)}(hDIV64_U64_ROUND_CLOSESTh]j{)}(hDIV64_U64_ROUND_CLOSESTh]j)}(hj&h]hDIV64_U64_ROUND_CLOSEST}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj&hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMsubah}(h]h ]h"]h$]h&]jjjuh1jjjhj&hhhj'hMsubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1jhj'hMshj&hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj&hhhj'hMsubeh}(h]h ](jmacroeh"]h$]h&]jjjj*'jj*'jjjuh1jhhhjK hNhNubh)}(h/``DIV64_U64_ROUND_CLOSEST (dividend, divisor)``h]j)}(hj0'h]h+DIV64_U64_ROUND_CLOSEST (dividend, divisor)}(hj2'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.'ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMuhjK hhubj)}(hDunsigned 64bit divide with 64bit divisor rounded to nearest integer h]h)}(hCunsigned 64bit divide with 64bit divisor rounded to nearest integerh]hCunsigned 64bit divide with 64bit divisor rounded to nearest integer}(hjJ'hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMshjF'ubah}(h]h ]h"]h$]h&]uh1jhjX'hMshjK hhubj)}(hX**Parameters** ``dividend`` unsigned 64bit dividend ``divisor`` unsigned 64bit divisor **Description** Divide unsigned 64bit dividend by unsigned 64bit divisor and round to closest integer. **Return** dividend / divisor rounded to nearest integerh](h)}(h**Parameters**h]j)}(hje'h]h Parameters}(hjg'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc'ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMwhj_'ubj )}(hhh](j)}(h%``dividend`` unsigned 64bit dividend h](j)}(h ``dividend``h]j)}(hj'h]hdividend}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMthj~'ubj2)}(hhh]h)}(hunsigned 64bit dividendh]hunsigned 64bit dividend}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hMthj'ubah}(h]h ]h"]h$]h&]uh1j1hj~'ubeh}(h]h ]h"]h$]h&]uh1jhj'hMthj{'ubj)}(h#``divisor`` unsigned 64bit divisor h](j)}(h ``divisor``h]j)}(hj'h]hdivisor}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMuhj'ubj2)}(hhh]h)}(hunsigned 64bit divisorh]hunsigned 64bit divisor}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hMuhj'ubah}(h]h ]h"]h$]h&]uh1j1hj'ubeh}(h]h ]h"]h$]h&]uh1jhj'hMuhj{'ubeh}(h]h ]h"]h$]h&]uh1j hj_'ubh)}(h**Description**h]j)}(hj'h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMwhj_'ubh)}(hVDivide unsigned 64bit dividend by unsigned 64bit divisor and round to closest integer.h]hVDivide unsigned 64bit dividend by unsigned 64bit divisor and round to closest integer.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMvhj_'ubh)}(h **Return**h]j)}(hj(h]hReturn}(hj!(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMyhj_'ubh)}(h-dividend / divisor rounded to nearest integerh]h-dividend / divisor rounded to nearest integer}(hj5(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMzhj_'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j DIV_U64_ROUND_CLOSEST (C macro)c.DIV_U64_ROUND_CLOSESThNtauh1hhjK hhhNhNubj)}(hhh](j)}(hDIV_U64_ROUND_CLOSESTh]j)}(hDIV_U64_ROUND_CLOSESTh]j{)}(hDIV_U64_ROUND_CLOSESTh]j)}(hj^(h]hDIV_U64_ROUND_CLOSEST}(hjh(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd(ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj`(hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj\(hhhj{(hMubah}(h]jW(ah ](jjeh"]h$]h&]jj)jhuh1jhj{(hMhjY(hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjY(hhhj{(hMubeh}(h]h ](jmacroeh"]h$]h&]jjjj(jj(jjjuh1jhhhjK hNhNubh)}(h-``DIV_U64_ROUND_CLOSEST (dividend, divisor)``h]j)}(hj(h]h)DIV_U64_ROUND_CLOSEST (dividend, divisor)}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhjK hhubj)}(hDunsigned 64bit divide with 32bit divisor rounded to nearest integer h]h)}(hCunsigned 64bit divide with 32bit divisor rounded to nearest integerh]hCunsigned 64bit divide with 32bit divisor rounded to nearest integer}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj(ubah}(h]h ]h"]h$]h&]uh1jhj(hMhjK hhubj)}(hX**Parameters** ``dividend`` unsigned 64bit dividend ``divisor`` unsigned 32bit divisor **Description** Divide unsigned 64bit dividend by unsigned 32bit divisor and round to closest integer. **Return** dividend / divisor rounded to nearest integerh](h)}(h**Parameters**h]j)}(hj(h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj(ubj )}(hhh](j)}(h%``dividend`` unsigned 64bit dividend h](j)}(h ``dividend``h]j)}(hj(h]hdividend}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj(ubj2)}(hhh]h)}(hunsigned 64bit dividendh]hunsigned 64bit dividend}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhj)hMhj(ubj)}(h#``divisor`` unsigned 32bit divisor h](j)}(h ``divisor``h]j)}(hj')h]hdivisor}(hj))hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%)ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj!)ubj2)}(hhh]h)}(hunsigned 32bit divisorh]hunsigned 32bit divisor}(hj@)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<)hMhj=)ubah}(h]h ]h"]h$]h&]uh1j1hj!)ubeh}(h]h ]h"]h$]h&]uh1jhj<)hMhj(ubeh}(h]h ]h"]h$]h&]uh1j hj(ubh)}(h**Description**h]j)}(hjb)h]h Description}(hjd)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`)ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj(ubh)}(hVDivide unsigned 64bit dividend by unsigned 32bit divisor and round to closest integer.h]hVDivide unsigned 64bit dividend by unsigned 32bit divisor and round to closest integer.}(hjx)hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj(ubh)}(h **Return**h]j)}(hj)h]hReturn}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj(ubh)}(h-dividend / divisor rounded to nearest integerh]h-dividend / divisor rounded to nearest integer}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j DIV_S64_ROUND_CLOSEST (C macro)c.DIV_S64_ROUND_CLOSESThNtauh1hhjK hhhNhNubj)}(hhh](j)}(hDIV_S64_ROUND_CLOSESTh]j)}(hDIV_S64_ROUND_CLOSESTh]j{)}(hDIV_S64_ROUND_CLOSESTh]j)}(hj)h]hDIV_S64_ROUND_CLOSEST}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj)hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj)hhhj)hMubah}(h]j)ah ](jjeh"]h$]h&]jj)jhuh1jhj)hMhj)hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj)hhhj)hMubeh}(h]h ](jmacroeh"]h$]h&]jjjj)jj)jjjuh1jhhhjK hNhNubh)}(h-``DIV_S64_ROUND_CLOSEST (dividend, divisor)``h]j)}(hj*h]h)DIV_S64_ROUND_CLOSEST (dividend, divisor)}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhjK hhubj)}(hBsigned 64bit divide with 32bit divisor rounded to nearest integer h]h)}(hAsigned 64bit divide with 32bit divisor rounded to nearest integerh]hAsigned 64bit divide with 32bit divisor rounded to nearest integer}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj*ubah}(h]h ]h"]h$]h&]uh1jhj,*hMhjK hhubj)}(h**Parameters** ``dividend`` signed 64bit dividend ``divisor`` signed 32bit divisor **Description** Divide signed 64bit dividend by signed 32bit divisor and round to closest integer. **Return** dividend / divisor rounded to nearest integerh](h)}(h**Parameters**h]j)}(hj9*h]h Parameters}(hj;*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7*ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj3*ubj )}(hhh](j)}(h#``dividend`` signed 64bit dividend h](j)}(h ``dividend``h]j)}(hjX*h]hdividend}(hjZ*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV*ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhjR*ubj2)}(hhh]h)}(hsigned 64bit dividendh]hsigned 64bit dividend}(hjq*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjm*hMhjn*ubah}(h]h ]h"]h$]h&]uh1j1hjR*ubeh}(h]h ]h"]h$]h&]uh1jhjm*hMhjO*ubj)}(h!``divisor`` signed 32bit divisor h](j)}(h ``divisor``h]j)}(hj*h]hdivisor}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj*ubj2)}(hhh]h)}(hsigned 32bit divisorh]hsigned 32bit divisor}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhjO*ubeh}(h]h ]h"]h$]h&]uh1j hj3*ubh)}(h**Description**h]j)}(hj*h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj3*ubh)}(hRDivide signed 64bit dividend by signed 32bit divisor and round to closest integer.h]hRDivide signed 64bit dividend by signed 32bit divisor and round to closest integer.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj3*ubh)}(h **Return**h]j)}(hj*h]hReturn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj3*ubh)}(h-dividend / divisor rounded to nearest integerh]h-dividend / divisor rounded to nearest integer}(hj +hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj3*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j roundup_u64 (C function) c.roundup_u64hNtauh1hhjK hhhNhNubj)}(hhh](j)}(hu64 roundup_u64 (u64 x, u32 y)h]j)}(hu64 roundup_u64(u64 x, u32 y)h](h)}(hhh]j)}(hu64h]hu64}(hj;+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8+ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj=+modnameN classnameNj] j` )}jc ]jf )}jY roundup_u64sb c.roundup_u64asbuh1hhj4+hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMubj2)}(h h]h }(hj]+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4+hhhj\+hMubj{)}(h roundup_u64h]j)}(hjY+h]h roundup_u64}(hjo+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk+ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj4+hhhj\+hMubj)}(h(u64 x, u32 y)h](j)}(hu64 xh](h)}(hhh]j)}(hu64h]hu64}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj+modnameN classnameNj] j` )}jc ]jW+ c.roundup_u64asbuh1hhj+ubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj)}(hj9h]hx}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(hu32 yh](h)}(hhh]j)}(hu32h]hu32}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj+modnameN classnameNj] j` )}jc ]jW+ c.roundup_u64asbuh1hhj+ubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj)}(hyh]hy}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubeh}(h]h ]h"]h$]h&]jjuh1jhj4+hhhj\+hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj0+hhhj\+hMubah}(h]j++ah ](jjeh"]h$]h&]jj)jhuh1jhj\+hMhj-+hhubj)}(hhh]h)}(h;Round up a 64bit value to the next specified 32bit multipleh]h;Round up a 64bit value to the next specified 32bit multiple}(hj*,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj',hhubah}(h]h ]h"]h$]h&]uh1jhj-+hhhj\+hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjB,jjB,jjjuh1jhhhjK hNhNubj)}(hX**Parameters** ``u64 x`` the value to up ``u32 y`` 32bit multiple to round up to **Description** Rounds **x** to the next multiple of **y**. For 32bit **x** values, see roundup and the faster round_up() for powers of 2. **Return** rounded up value.h](h)}(h**Parameters**h]j)}(hjL,h]h Parameters}(hjN,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ,ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhjF,ubj )}(hhh](j)}(h``u64 x`` the value to up h](j)}(h ``u64 x``h]j)}(hjk,h]hu64 x}(hjm,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji,ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhje,ubj2)}(hhh]h)}(hthe value to uph]hthe value to up}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1j1hje,ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhjb,ubj)}(h(``u32 y`` 32bit multiple to round up to h](j)}(h ``u32 y``h]j)}(hj,h]hu32 y}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhj,ubj2)}(hhh]h)}(h32bit multiple to round up toh]h32bit multiple to round up to}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhjb,ubeh}(h]h ]h"]h$]h&]uh1j hjF,ubh)}(h**Description**h]j)}(hj,h]h Description}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhjF,ubh)}(hzRounds **x** to the next multiple of **y**. For 32bit **x** values, see roundup and the faster round_up() for powers of 2.h](hRounds }(hj,hhhNhNubj)}(h**x**h]hx}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh to the next multiple of }(hj,hhhNhNubj)}(h**y**h]hy}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh . For 32bit }(hj,hhhNhNubj)}(h**x**h]hx}(hj!-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh? values, see roundup and the faster round_up() for powers of 2.}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhjF,ubh)}(h **Return**h]j)}(hj<-h]hReturn}(hj>-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:-ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhjF,ubh)}(hrounded up value.h]hrounded up value.}(hjR-hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:178: ./include/linux/math64.hhMhjF,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j gcd (C function)c.gcdhNtauh1hhjK hhhNhNubj)}(hhh](j)}(h4unsigned long gcd (unsigned long a, unsigned long b)h]j)}(h3unsigned long gcd(unsigned long a, unsigned long b)h](j )}(hunsignedh]hunsigned}(hj-hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}-hhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:181: ./lib/math/gcd.chK.ubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}-hhhj-hK.ubj )}(hlongh]hlong}(hj-hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}-hhhj-hK.ubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}-hhhj-hK.ubj{)}(hgcdh]j)}(hgcdh]hgcd}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj}-hhhj-hK.ubj)}(h"(unsigned long a, unsigned long b)h](j)}(hunsigned long ah](j )}(hunsignedh]hunsigned}(hj-hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj-ubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj )}(hlongh]hlong}(hj-hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj-ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(hjh]ha}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj-ubj)}(hunsigned long bh](j )}(hunsignedh]hunsigned}(hj*.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&.ubj2)}(h h]h }(hj8.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&.ubj )}(hlongh]hlong}(hjF.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&.ubj2)}(h h]h }(hjT.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&.ubj)}(hjLh]hb}(hjb.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj-ubeh}(h]h ]h"]h$]h&]jjuh1jhj}-hhhj-hK.ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjy-hhhj-hK.ubah}(h]jt-ah ](jjeh"]h$]h&]jj)jhuh1jhj-hK.hjv-hhubj)}(hhh]h)}(hDcalculate and return the greatest common divisor of 2 unsigned longsh]hDcalculate and return the greatest common divisor of 2 unsigned longs}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:181: ./lib/math/gcd.chK.hj.hhubah}(h]h ]h"]h$]h&]uh1jhjv-hhhj-hK.ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj.jj.jjjuh1jhhhjK hNhNubj)}(hU**Parameters** ``unsigned long a`` first value ``unsigned long b`` second valueh](h)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:181: ./lib/math/gcd.chK2hj.ubj )}(hhh](j)}(h ``unsigned long a`` first value h](j)}(h``unsigned long a``h]j)}(hj.h]hunsigned long a}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:181: ./lib/math/gcd.chK/hj.ubj2)}(hhh]h)}(h first valueh]h first value}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hK/hj.ubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hK/hj.ubj)}(h ``unsigned long b`` second valueh](j)}(h``unsigned long b``h]j)}(hj/h]hunsigned long b}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:181: ./lib/math/gcd.chK1hj.ubj2)}(hhh]h)}(h second valueh]h second value}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:181: ./lib/math/gcd.chK0hj/ubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhj/hK1hj.ubeh}(h]h ]h"]h$]h&]uh1j hj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjK hhhNhNubeh}(h]division-functionsah ]h"]division functionsah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(h UUID/GUIDh]h UUID/GUID}(hjQ/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjN/hhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !generate_random_uuid (C function)c.generate_random_uuidhNtauh1hhjN/hhhNhNubj)}(hhh](j)}(h2void generate_random_uuid (unsigned char uuid[16])h]j)}(h1void generate_random_uuid(unsigned char uuid[16])h](j )}(hvoidh]hvoid}(hjx/hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjt/hhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjt/hhhj/hKubj{)}(hgenerate_random_uuidh]j)}(hgenerate_random_uuidh]hgenerate_random_uuid}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjt/hhhj/hKubj)}(h(unsigned char uuid[16])h]j)}(hunsigned char uuid[16]h](j )}(hunsignedh]hunsigned}(hj/hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj/ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj )}(hcharh]hchar}(hj/hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj/ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(huuidh]huuid}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hj[h]h[}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubhdesc_sig_literal_number)}(h16h]h16}(hj 0hhhNhNubah}(h]h ]mah"]h$]h&]uh1j0hj/ubj)}(hjh]h]}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj/ubah}(h]h ]h"]h$]h&]jjuh1jhjt/hhhj/hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjp/hhhj/hKubah}(h]jk/ah ](jjeh"]h$]h&]jj)jhuh1jhj/hKhjm/hhubj)}(hhh]h)}(hgenerate a random UUIDh]hgenerate a random UUID}(hjB0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKhj?0hhubah}(h]h ]h"]h$]h&]uh1jhjm/hhhj/hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjZ0jjZ0jjjuh1jhhhjN/hNhNubj)}(h**Parameters** ``unsigned char uuid[16]`` where to put the generated UUID **Description** Random UUID interface Used to create a Boot ID or a filesystem UUID/GUID, but can be useful for other kernel drivers.h](h)}(h**Parameters**h]j)}(hjd0h]h Parameters}(hjf0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb0ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKhj^0ubj )}(hhh]j)}(h;``unsigned char uuid[16]`` where to put the generated UUID h](j)}(h``unsigned char uuid[16]``h]j)}(hj0h]hunsigned char uuid[16]}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKhj}0ubj2)}(hhh]h)}(hwhere to put the generated UUIDh]hwhere to put the generated UUID}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hKhj0ubah}(h]h ]h"]h$]h&]uh1j1hj}0ubeh}(h]h ]h"]h$]h&]uh1jhj0hKhjz0ubah}(h]h ]h"]h$]h&]uh1j hj^0ubh)}(h**Description**h]j)}(hj0h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKhj^0ubh)}(hRandom UUID interfaceh]hRandom UUID interface}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKhj^0ubh)}(h_Used to create a Boot ID or a filesystem UUID/GUID, but can be useful for other kernel drivers.h]h_Used to create a Boot ID or a filesystem UUID/GUID, but can be useful for other kernel drivers.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKhj^0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjN/hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j uuid_is_valid (C function)c.uuid_is_validhNtauh1hhjN/hhhNhNubj)}(hhh](j)}(h%bool uuid_is_valid (const char *uuid)h]j)}(h$bool uuid_is_valid(const char *uuid)h](j )}(hj8h]hbool}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj1hhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKNubj2)}(h h]h }(hj 1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1hhhj1hKNubj{)}(h uuid_is_validh]j)}(h uuid_is_validh]h uuid_is_valid}(hj21hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.1ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj1hhhj1hKNubj)}(h(const char *uuid)h]j)}(hconst char *uuidh](j)}(hjh]hconst}(hjN1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ1ubj2)}(h h]h }(hj[1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJ1ubj )}(hcharh]hchar}(hji1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJ1ubj2)}(h h]h }(hjw1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJ1ubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ1ubj)}(huuidh]huuid}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjF1ubah}(h]h ]h"]h$]h&]jjuh1jhj1hhhj1hKNubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj 1hhhj1hKNubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1jhj1hKNhj1hhubj)}(hhh]h)}(h checks if a UUID string is validh]h checks if a UUID string is valid}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKNhj1hhubah}(h]h ]h"]h$]h&]uh1jhj1hhhj1hKNubeh}(h]h ](jfunctioneh"]h$]h&]jjjj1jj1jjjuh1jhhhjN/hNhNubj)}(h**Parameters** ``const char *uuid`` UUID string to check **Description** It checks if the UUID string is following the format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx where x is a hex digit. **Return** true if input is valid UUID string.h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKRhj1ubj )}(hhh]j)}(h*``const char *uuid`` UUID string to check h](j)}(h``const char *uuid``h]j)}(hj1h]hconst char *uuid}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKOhj1ubj2)}(hhh]h)}(hUUID string to checkh]hUUID string to check}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hKOhj2ubah}(h]h ]h"]h$]h&]uh1j1hj1ubeh}(h]h ]h"]h$]h&]uh1jhj2hKOhj1ubah}(h]h ]h"]h$]h&]uh1j hj1ubh)}(h**Description**h]j)}(hj82h]h Description}(hj:2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj62ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKQhj1ubj )}(hhh]j)}(h[It checks if the UUID string is following the format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx h](j)}(h5It checks if the UUID string is following the format:h]h5It checks if the UUID string is following the format:}(hjU2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKRhjQ2ubj2)}(hhh]h)}(h$xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxh]h$xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}(hjg2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjc2hKRhjd2ubah}(h]h ]h"]h$]h&]uh1j1hjQ2ubeh}(h]h ]h"]h$]h&]uh1jhjc2hKRhjN2ubah}(h]h ]h"]h$]h&]uh1j hj1ubh)}(hwhere x is a hex digit.h]hwhere x is a hex digit.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKThj1ubh)}(h **Return**h]j)}(hj2h]hReturn}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKVhj1ubh)}(h#true if input is valid UUID string.h]h#true if input is valid UUID string.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:187: ./lib/uuid.chKWhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjN/hhhNhNubeh}(h] uuid-guidah ]h"] uuid/guidah$]h&]uh1hhjhhhhhKubeh}(h]crc-and-math-functions-in-linuxah ]h"]crc and math functions in linuxah$]h&]uh1hhhhhhhhKzubh)}(hhh](h)}(hKernel IPC facilitiesh]hKernel IPC facilities}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hhhhhKubh)}(hhh](h)}(h IPC utilitiesh]h IPC utilities}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipc_init (C function) c.ipc_inithNtauh1hhj2hhhNhNubj)}(hhh](j)}(hint ipc_init (void)h]j)}(hint ipc_init(void)h](j )}(hinth]hint}(hj3hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj 3hhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKQubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj 3hhhj3hKQubj{)}(hipc_inith]j)}(hipc_inith]hipc_init}(hj03hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,3ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj 3hhhj3hKQubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjL3hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjH3ubah}(h]h ]h"]h$]h&]noemphjjuh1jhjD3ubah}(h]h ]h"]h$]h&]jjuh1jhj 3hhhj3hKQubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj3hhhj3hKQubah}(h]j3ah ](jjeh"]h$]h&]jj)jhuh1jhj3hKQhj3hhubj)}(hhh]h)}(hinitialise ipc subsystemh]hinitialise ipc subsystem}(hjv3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKQhjs3hhubah}(h]h ]h"]h$]h&]uh1jhj3hhhj3hKQubeh}(h]h ](jfunctioneh"]h$]h&]jjjj3jj3jjjuh1jhhhj2hNhNubj)}(hXX**Parameters** ``void`` no arguments **Description** The various sysv ipc resources (semaphores, messages and shared memory) are initialised. A callback routine is registered into the memory hotplug notifier chain: since msgmni scales to lowmem this callback routine will be called upon successful memory add / remove to recompute msmgni.h](h)}(h**Parameters**h]j)}(hj3h]h Parameters}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKUhj3ubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj3h]hvoid}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj3ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hKhj3ubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hKhj3ubah}(h]h ]h"]h$]h&]uh1j hj3ubh)}(h**Description**h]j)}(hj3h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj3ubh)}(hXThe various sysv ipc resources (semaphores, messages and shared memory) are initialised.h]hXThe various sysv ipc resources (semaphores, messages and shared memory) are initialised.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKRhj3ubh)}(hA callback routine is registered into the memory hotplug notifier chain: since msgmni scales to lowmem this callback routine will be called upon successful memory add / remove to recompute msmgni.h]hA callback routine is registered into the memory hotplug notifier chain: since msgmni scales to lowmem this callback routine will be called upon successful memory add / remove to recompute msmgni.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKUhj3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipc_init_ids (C function)c.ipc_init_idshNtauh1hhj2hhhNhNubj)}(hhh](j)}(h'void ipc_init_ids (struct ipc_ids *ids)h]j)}(h&void ipc_init_ids(struct ipc_ids *ids)h](j )}(hvoidh]hvoid}(hjF4hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjB4hhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKmubj2)}(h h]h }(hjU4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjB4hhhjT4hKmubj{)}(h ipc_init_idsh]j)}(h ipc_init_idsh]h ipc_init_ids}(hjg4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjc4ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjB4hhhjT4hKmubj)}(h(struct ipc_ids *ids)h]j)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4ubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj4modnameN classnameNj] j` )}jc ]jf )}jY ji4sbc.ipc_init_idsasbuh1hhj4ubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4ubj)}(hjh]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(hidsh]hids}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{4ubah}(h]h ]h"]h$]h&]jjuh1jhjB4hhhjT4hKmubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj>4hhhjT4hKmubah}(h]j94ah ](jjeh"]h$]h&]jj)jhuh1jhjT4hKmhj;4hhubj)}(hhh]h)}(hinitialise ipc identifiersh]hinitialise ipc identifiers}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKmhj5hhubah}(h]h ]h"]h$]h&]uh1jhj;4hhhjT4hKmubeh}(h]h ](jfunctioneh"]h$]h&]jjjj5jj5jjjuh1jhhhj2hNhNubj)}(h**Parameters** ``struct ipc_ids *ids`` ipc identifier set **Description** Set up the sequence range to use for the ipc identifier range (limited below ipc_mni) then initialise the keys hashtable and ids idr.h](h)}(h**Parameters**h]j)}(hj(5h]h Parameters}(hj*5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&5ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKqhj"5ubj )}(hhh]j)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hjG5h]hstruct ipc_ids *ids}(hjI5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE5ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKnhjA5ubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hj`5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\5hKnhj]5ubah}(h]h ]h"]h$]h&]uh1j1hjA5ubeh}(h]h ]h"]h$]h&]uh1jhj\5hKnhj>5ubah}(h]h ]h"]h$]h&]uh1j hj"5ubh)}(h**Description**h]j)}(hj5h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKphj"5ubh)}(hSet up the sequence range to use for the ipc identifier range (limited below ipc_mni) then initialise the keys hashtable and ids idr.h]hSet up the sequence range to use for the ipc identifier range (limited below ipc_mni) then initialise the keys hashtable and ids idr.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKohj"5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $ipc_init_proc_interface (C function)c.ipc_init_proc_interfacehNtauh1hhj2hhhNhNubj)}(hhh](j)}(htvoid ipc_init_proc_interface (const char *path, const char *header, int ids, int (*show)(struct seq_file *, void *))h]j)}(hqvoid ipc_init_proc_interface(const char *path, const char *header, int ids, int (*show)(struct seq_file*, void*))h](j )}(hvoidh]hvoid}(hj5hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5hhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5hhhj5hKubj{)}(hipc_init_proc_interfaceh]j)}(hipc_init_proc_interfaceh]hipc_init_proc_interface}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj5hhhj5hKubj)}(hU(const char *path, const char *header, int ids, int (*show)(struct seq_file*, void*))h](j)}(hconst char *pathh](j)}(hjh]hconst}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj )}(hcharh]hchar}(hj6hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hj-6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj)}(hjh]h*}(hj;6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hpathh]hpath}(hjH6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubj)}(hconst char *headerh](j)}(hjh]hconst}(hja6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]6ubj2)}(h h]h }(hjn6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]6ubj )}(hcharh]hchar}(hj|6hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]6ubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]6ubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]6ubj)}(hheaderh]hheader}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubj)}(hint idsh](j )}(hinth]hint}(hj6hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj)}(hidsh]hids}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubj)}(h$int (*show)(struct seq_file*, void*)h](j )}(hinth]hint}(hj6hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj)}(h(h]h(}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hshowh]hshow}(hj*7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(h)h]h)}(hj87hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hj7h]h(}(hjF7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hjAh]hstruct}(hjS7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hj`7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubh)}(hhh]j)}(hseq_fileh]hseq_file}(hjq7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn7ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjs7modnameN classnameNj] j` )}jc ]jf )}jY j5sbc.ipc_init_proc_interfaceasbuh1hhj6ubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(h,h]h,}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj )}(hvoidh]hvoid}(hj7hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj6ubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hj:7h]h)}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubeh}(h]h ]h"]h$]h&]jjuh1jhj5hhhj5hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj5hhhj5hKubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1jhj5hKhj5hhubj)}(hhh]h)}(hDcreate a proc interface for sysipc types using a seq_file interface.h]hDcreate a proc interface for sysipc types using a seq_file interface.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj7hhubah}(h]h ]h"]h$]h&]uh1jhj5hhhj5hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj8jj8jjjuh1jhhhj2hNhNubj)}(h**Parameters** ``const char *path`` Path in procfs ``const char *header`` Banner to be printed at the beginning of the file. ``int ids`` ipc id table to iterate. ``int (*show)(struct seq_file *, void *)`` show routine.h](h)}(h**Parameters**h]j)}(hj 8h]h Parameters}(hj"8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj8ubj )}(hhh](j)}(h$``const char *path`` Path in procfs h](j)}(h``const char *path``h]j)}(hj?8h]hconst char *path}(hjA8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=8ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj98ubj2)}(hhh]h)}(hPath in procfsh]hPath in procfs}(hjX8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjT8hKhjU8ubah}(h]h ]h"]h$]h&]uh1j1hj98ubeh}(h]h ]h"]h$]h&]uh1jhjT8hKhj68ubj)}(hJ``const char *header`` Banner to be printed at the beginning of the file. h](j)}(h``const char *header``h]j)}(hjx8h]hconst char *header}(hjz8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv8ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhjr8ubj2)}(hhh]h)}(h2Banner to be printed at the beginning of the file.h]h2Banner to be printed at the beginning of the file.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hKhj8ubah}(h]h ]h"]h$]h&]uh1j1hjr8ubeh}(h]h ]h"]h$]h&]uh1jhj8hKhj68ubj)}(h%``int ids`` ipc id table to iterate. h](j)}(h ``int ids``h]j)}(hj8h]hint ids}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj8ubj2)}(hhh]h)}(hipc id table to iterate.h]hipc id table to iterate.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hKhj8ubah}(h]h ]h"]h$]h&]uh1j1hj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hKhj68ubj)}(h8``int (*show)(struct seq_file *, void *)`` show routine.h](j)}(h*``int (*show)(struct seq_file *, void *)``h]j)}(hj8h]h&int (*show)(struct seq_file *, void *)}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj8ubj2)}(hhh]h)}(h show routine.h]h show routine.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj9ubah}(h]h ]h"]h$]h&]uh1j1hj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hKhj68ubeh}(h]h ]h"]h$]h&]uh1j hj8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipc_findkey (C function) c.ipc_findkeyhNtauh1hhj2hhhNhNubj)}(hhh](j)}(hCstruct kern_ipc_perm * ipc_findkey (struct ipc_ids *ids, key_t key)h]j)}(hAstruct kern_ipc_perm *ipc_findkey(struct ipc_ids *ids, key_t key)h](j)}(hjAh]hstruct}(hjD9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@9hhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKubj2)}(h h]h }(hjR9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@9hhhjQ9hKubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjc9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`9ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetje9modnameN classnameNj] j` )}jc ]jf )}jY ipc_findkeysb c.ipc_findkeyasbuh1hhj@9hhhjQ9hKubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@9hhhjQ9hKubj)}(hjh]h*}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@9hhhjQ9hKubj{)}(h ipc_findkeyh]j)}(hj9h]h ipc_findkey}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj@9hhhjQ9hKubj)}(h (struct ipc_ids *ids, key_t key)h](j)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj9modnameN classnameNj] j` )}jc ]j9 c.ipc_findkeyasbuh1hhj9ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hidsh]hids}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubj)}(h key_t keyh](h)}(hhh]j)}(hkey_th]hkey_t}(hj1:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.:ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj3:modnameN classnameNj] j` )}jc ]j9 c.ipc_findkeyasbuh1hhj*:ubj2)}(h h]h }(hjO:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*:ubj)}(hkeyh]hkey}(hj]:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubeh}(h]h ]h"]h$]h&]jjuh1jhj@9hhhjQ9hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj<9hhhjQ9hKubah}(h]j79ah ](jjeh"]h$]h&]jj)jhuh1jhjQ9hKhj99hhubj)}(hhh]h)}(h#find a key in an ipc identifier seth]h#find a key in an ipc identifier set}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj:hhubah}(h]h ]h"]h$]h&]uh1jhj99hhhjQ9hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj:jj:jjjuh1jhhhj2hNhNubj)}(hX**Parameters** ``struct ipc_ids *ids`` ipc identifier set ``key_t key`` key to find **Description** Returns the locked pointer to the ipc structure if found or NULL otherwise. If key is found ipc points to the owning ipc structure Called with writer ipc_ids.rwsem held.h](h)}(h**Parameters**h]j)}(hj:h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj:ubj )}(hhh](j)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hj:h]hstruct ipc_ids *ids}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj:ubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hKhj:ubah}(h]h ]h"]h$]h&]uh1j1hj:ubeh}(h]h ]h"]h$]h&]uh1jhj:hKhj:ubj)}(h``key_t key`` key to find h](j)}(h ``key_t key``h]j)}(hj;h]h key_t key}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj:ubj2)}(hhh]h)}(h key to findh]h key to find}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hKhj;ubah}(h]h ]h"]h$]h&]uh1j1hj:ubeh}(h]h ]h"]h$]h&]uh1jhj;hKhj:ubeh}(h]h ]h"]h$]h&]uh1j hj:ubh)}(h**Description**h]j)}(hj<;h]h Description}(hj>;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:;ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj:ubh)}(hReturns the locked pointer to the ipc structure if found or NULL otherwise. If key is found ipc points to the owning ipc structureh]hReturns the locked pointer to the ipc structure if found or NULL otherwise. If key is found ipc points to the owning ipc structure}(hjR;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj:ubh)}(h&Called with writer ipc_ids.rwsem held.h]h&Called with writer ipc_ids.rwsem held.}(hja;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chKhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipc_addid (C function) c.ipc_addidhNtauh1hhj2hhhNhNubj)}(hhh](j)}(hIint ipc_addid (struct ipc_ids *ids, struct kern_ipc_perm *new, int limit)h]j)}(hHint ipc_addid(struct ipc_ids *ids, struct kern_ipc_perm *new, int limit)h](j )}(hinth]hint}(hj;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj;hhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;hhhj;hMubj{)}(h ipc_addidh]j)}(h ipc_addidh]h ipc_addid}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj;hhhj;hMubj)}(h;(struct ipc_ids *ids, struct kern_ipc_perm *new, int limit)h](j)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;ubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj;modnameN classnameNj] j` )}jc ]jf )}jY j;sb c.ipc_addidasbuh1hhj;ubj2)}(h h]h }(hj <hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(hidsh]hids}(hj&<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj;ubj)}(hstruct kern_ipc_perm *newh](j)}(hjAh]hstruct}(hj?<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;<ubj2)}(h h]h }(hjL<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;<ubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hj]<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ<ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj_<modnameN classnameNj] j` )}jc ]j< c.ipc_addidasbuh1hhj;<ubj2)}(h h]h }(hj{<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;<ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;<ubj)}(hnewh]hnew}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj;ubj)}(h int limith](j )}(hinth]hint}(hj<hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj<ubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubj)}(hlimith]hlimit}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj;ubeh}(h]h ]h"]h$]h&]jjuh1jhj;hhhj;hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj;hhhj;hMubah}(h]j;ah ](jjeh"]h$]h&]jj)jhuh1jhj;hMhj;hhubj)}(hhh]h)}(hadd an ipc identifierh]hadd an ipc identifier}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj<hhubah}(h]h ]h"]h$]h&]uh1jhj;hhhj;hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj =jj =jjjuh1jhhhj2hNhNubj)}(hX4**Parameters** ``struct ipc_ids *ids`` ipc identifier set ``struct kern_ipc_perm *new`` new ipc permission set ``int limit`` limit for the number of used ids **Description** Add an entry 'new' to the ipc ids idr. The permissions object is initialised and the first free entry is set up and the index assigned is returned. The 'new' entry is returned in a locked state on success. On failure the entry is not locked and a negative err-code is returned. The caller must use ipc_rcu_putref() to free the identifier. Called with writer ipc_ids.rwsem held.h](h)}(h**Parameters**h]j)}(hj=h]h Parameters}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM hj=ubj )}(hhh](j)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hj6=h]hstruct ipc_ids *ids}(hj8=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4=ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM hj0=ubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hjO=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjK=hM hjL=ubah}(h]h ]h"]h$]h&]uh1j1hj0=ubeh}(h]h ]h"]h$]h&]uh1jhjK=hM hj-=ubj)}(h5``struct kern_ipc_perm *new`` new ipc permission set h](j)}(h``struct kern_ipc_perm *new``h]j)}(hjo=h]hstruct kern_ipc_perm *new}(hjq=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm=ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM hji=ubj2)}(hhh]h)}(hnew ipc permission seth]hnew ipc permission set}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM hj=ubah}(h]h ]h"]h$]h&]uh1j1hji=ubeh}(h]h ]h"]h$]h&]uh1jhj=hM hj-=ubj)}(h/``int limit`` limit for the number of used ids h](j)}(h ``int limit``h]j)}(hj=h]h int limit}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM hj=ubj2)}(hhh]h)}(h limit for the number of used idsh]h limit for the number of used ids}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM hj=ubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hM hj-=ubeh}(h]h ]h"]h$]h&]uh1j hj=ubh)}(h**Description**h]j)}(hj=h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM hj=ubh)}(hAdd an entry 'new' to the ipc ids idr. The permissions object is initialised and the first free entry is set up and the index assigned is returned. The 'new' entry is returned in a locked state on success.h]hAdd an entry ‘new’ to the ipc ids idr. The permissions object is initialised and the first free entry is set up and the index assigned is returned. The ‘new’ entry is returned in a locked state on success.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM hj=ubh)}(hOn failure the entry is not locked and a negative err-code is returned. The caller must use ipc_rcu_putref() to free the identifier.h]hOn failure the entry is not locked and a negative err-code is returned. The caller must use ipc_rcu_putref() to free the identifier.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj=ubh)}(h&Called with writer ipc_ids.rwsem held.h]h&Called with writer ipc_ids.rwsem held.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipcget_new (C function) c.ipcget_newhNtauh1hhj2hhhNhNubj)}(hhh](j)}(htint ipcget_new (struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops, struct ipc_params *params)h]j)}(hsint ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops, struct ipc_params *params)h](j )}(hinth]hint}(hjF>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjB>hhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMJubj2)}(h h]h }(hjU>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjB>hhhjT>hMJubj{)}(h ipcget_newh]j)}(h ipcget_newh]h ipcget_new}(hjg>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjc>ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjB>hhhjT>hMJubj)}(he(struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops, struct ipc_params *params)h](j)}(hstruct ipc_namespace *nsh](j)}(hjAh]hstruct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubh)}(hhh]j)}(h ipc_namespaceh]h ipc_namespace}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj>modnameN classnameNj] j` )}jc ]jf )}jY ji>sb c.ipcget_newasbuh1hhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hnsh]hns}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{>ubj)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj?modnameN classnameNj] j` )}jc ]j> c.ipcget_newasbuh1hhj>ubj2)}(h h]h }(hj1?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hjh]h*}(hj??hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hidsh]hids}(hjL?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{>ubj)}(hconst struct ipc_ops *opsh](j)}(hjh]hconst}(hje?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja?ubj2)}(h h]h }(hjr?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hja?ubj)}(hjAh]hstruct}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hja?ubh)}(hhh]j)}(hipc_opsh]hipc_ops}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj?modnameN classnameNj] j` )}jc ]j> c.ipcget_newasbuh1hhja?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hja?ubj)}(hjh]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja?ubj)}(hopsh]hops}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{>ubj)}(hstruct ipc_params *paramsh](j)}(hjAh]hstruct}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubh)}(hhh]j)}(h ipc_paramsh]h ipc_params}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj @ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj@modnameN classnameNj] j` )}jc ]j> c.ipcget_newasbuh1hhj?ubj2)}(h h]h }(hj,@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubj)}(hjh]h*}(hj:@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hparamsh]hparams}(hjG@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{>ubeh}(h]h ]h"]h$]h&]jjuh1jhjB>hhhjT>hMJubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj>>hhhjT>hMJubah}(h]j9>ah ](jjeh"]h$]h&]jj)jhuh1jhjT>hMJhj;>hhubj)}(hhh]h)}(hcreate a new ipc objecth]hcreate a new ipc object}(hjq@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMJhjn@hhubah}(h]h ]h"]h$]h&]uh1jhj;>hhhjT>hMJubeh}(h]h ](jfunctioneh"]h$]h&]jjjj@jj@jjjuh1jhhhj2hNhNubj)}(hXR**Parameters** ``struct ipc_namespace *ns`` ipc namespace ``struct ipc_ids *ids`` ipc identifier set ``const struct ipc_ops *ops`` the actual creation routine to call ``struct ipc_params *params`` its parameters **Description** This routine is called by sys_msgget, sys_semget() and sys_shmget() when the key is IPC_PRIVATE.h](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMNhj@ubj )}(hhh](j)}(h+``struct ipc_namespace *ns`` ipc namespace h](j)}(h``struct ipc_namespace *ns``h]j)}(hj@h]hstruct ipc_namespace *ns}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMKhj@ubj2)}(hhh]h)}(h ipc namespaceh]h ipc namespace}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMKhj@ubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hMKhj@ubj)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hj@h]hstruct ipc_ids *ids}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMLhj@ubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMLhjAubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhjAhMLhj@ubj)}(hB``const struct ipc_ops *ops`` the actual creation routine to call h](j)}(h``const struct ipc_ops *ops``h]j)}(hj$Ah]hconst struct ipc_ops *ops}(hj&AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"Aubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMMhjAubj2)}(hhh]h)}(h#the actual creation routine to callh]h#the actual creation routine to call}(hj=AhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9AhMMhj:Aubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj9AhMMhj@ubj)}(h-``struct ipc_params *params`` its parameters h](j)}(h``struct ipc_params *params``h]j)}(hj]Ah]hstruct ipc_params *params}(hj_AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[Aubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMNhjWAubj2)}(hhh]h)}(hits parametersh]hits parameters}(hjvAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrAhMNhjsAubah}(h]h ]h"]h$]h&]uh1j1hjWAubeh}(h]h ]h"]h$]h&]uh1jhjrAhMNhj@ubeh}(h]h ]h"]h$]h&]uh1j hj@ubh)}(h**Description**h]j)}(hjAh]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMPhj@ubh)}(h`This routine is called by sys_msgget, sys_semget() and sys_shmget() when the key is IPC_PRIVATE.h]h`This routine is called by sys_msgget, sys_semget() and sys_shmget() when the key is IPC_PRIVATE.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMOhj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipc_check_perms (C function)c.ipc_check_permshNtauh1hhj2hhhNhNubj)}(hhh](j)}(hint ipc_check_perms (struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, const struct ipc_ops *ops, struct ipc_params *params)h]j)}(hint ipc_check_perms(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, const struct ipc_ops *ops, struct ipc_params *params)h](j )}(hinth]hint}(hjAhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjAhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM_ubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAhhhjAhM_ubj{)}(hipc_check_permsh]j)}(hipc_check_permsh]hipc_check_perms}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjAhhhjAhM_ubj)}(hl(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, const struct ipc_ops *ops, struct ipc_params *params)h](j)}(hstruct ipc_namespace *nsh](j)}(hjAh]hstruct}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj2)}(h h]h }(hj'BhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubh)}(hhh]j)}(h ipc_namespaceh]h ipc_namespace}(hj8BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5Bubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj:BmodnameN classnameNj] j` )}jc ]jf )}jY jBsbc.ipc_check_permsasbuh1hhjBubj2)}(h h]h }(hjXBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hjh]h*}(hjfBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(hnsh]hns}(hjsBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubj)}(hstruct kern_ipc_perm *ipcph](j)}(hjAh]hstruct}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjBmodnameN classnameNj] j` )}jc ]jTBc.ipc_check_permsasbuh1hhjBubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hjh]h*}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(hipcph]hipcp}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubj)}(hconst struct ipc_ops *opsh](j)}(hjh]hconst}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj2)}(h h]h }(hj ChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hjAh]hstruct}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj2)}(h h]h }(hj$ChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubh)}(hhh]j)}(hipc_opsh]hipc_ops}(hj5ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2Cubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7CmodnameN classnameNj] j` )}jc ]jTBc.ipc_check_permsasbuh1hhjBubj2)}(h h]h }(hjSChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hjh]h*}(hjaChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(hopsh]hops}(hjnChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubj)}(hstruct ipc_params *paramsh](j)}(hjAh]hstruct}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubh)}(hhh]j)}(h ipc_paramsh]h ipc_params}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjCmodnameN classnameNj] j` )}jc ]jTBc.ipc_check_permsasbuh1hhjCubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hparamsh]hparams}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubeh}(h]h ]h"]h$]h&]jjuh1jhjAhhhjAhM_ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjAhhhjAhM_ubah}(h]jAah ](jjeh"]h$]h&]jj)jhuh1jhjAhM_hjAhhubj)}(hhh]h)}(h0check security and permissions for an ipc objecth]h0check security and permissions for an ipc object}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM_hjDhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjAhM_ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj Djj Djjjuh1jhhhj2hNhNubj)}(hX**Parameters** ``struct ipc_namespace *ns`` ipc namespace ``struct kern_ipc_perm *ipcp`` ipc permission set ``const struct ipc_ops *ops`` the actual security routine to call ``struct ipc_params *params`` its parameters **Description** This routine is called by sys_msgget(), sys_semget() and sys_shmget() when the key is not IPC_PRIVATE and that key already exists in the ds IDR. On success, the ipc id is returned. It is called with ipc_ids.rwsem and ipcp->lock held.h](h)}(h**Parameters**h]j)}(hj*Dh]h Parameters}(hj,DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(Dubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMchj$Dubj )}(hhh](j)}(h+``struct ipc_namespace *ns`` ipc namespace h](j)}(h``struct ipc_namespace *ns``h]j)}(hjIDh]hstruct ipc_namespace *ns}(hjKDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGDubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM`hjCDubj2)}(hhh]h)}(h ipc namespaceh]h ipc namespace}(hjbDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^DhM`hj_Dubah}(h]h ]h"]h$]h&]uh1j1hjCDubeh}(h]h ]h"]h$]h&]uh1jhj^DhM`hj@Dubj)}(h2``struct kern_ipc_perm *ipcp`` ipc permission set h](j)}(h``struct kern_ipc_perm *ipcp``h]j)}(hjDh]hstruct kern_ipc_perm *ipcp}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMahj|Dubj2)}(hhh]h)}(hipc permission seth]hipc permission set}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMahjDubah}(h]h ]h"]h$]h&]uh1j1hj|Dubeh}(h]h ]h"]h$]h&]uh1jhjDhMahj@Dubj)}(hB``const struct ipc_ops *ops`` the actual security routine to call h](j)}(h``const struct ipc_ops *ops``h]j)}(hjDh]hconst struct ipc_ops *ops}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMbhjDubj2)}(hhh]h)}(h#the actual security routine to callh]h#the actual security routine to call}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMbhjDubah}(h]h ]h"]h$]h&]uh1j1hjDubeh}(h]h ]h"]h$]h&]uh1jhjDhMbhj@Dubj)}(h-``struct ipc_params *params`` its parameters h](j)}(h``struct ipc_params *params``h]j)}(hjDh]hstruct ipc_params *params}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMchjDubj2)}(hhh]h)}(hits parametersh]hits parameters}(hj EhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj EhMchj Eubah}(h]h ]h"]h$]h&]uh1j1hjDubeh}(h]h ]h"]h$]h&]uh1jhj EhMchj@Dubeh}(h]h ]h"]h$]h&]uh1j hj$Dubh)}(h**Description**h]j)}(hj/Eh]h Description}(hj1EhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-Eubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMehj$Dubh)}(hThis routine is called by sys_msgget(), sys_semget() and sys_shmget() when the key is not IPC_PRIVATE and that key already exists in the ds IDR.h]hThis routine is called by sys_msgget(), sys_semget() and sys_shmget() when the key is not IPC_PRIVATE and that key already exists in the ds IDR.}(hjEEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMdhj$Dubh)}(h#On success, the ipc id is returned.h]h#On success, the ipc id is returned.}(hjTEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhhj$Dubh)}(h4It is called with ipc_ids.rwsem and ipcp->lock held.h]h4It is called with ipc_ids.rwsem and ipcp->lock held.}(hjcEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMjhj$Dubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipcget_public (C function)c.ipcget_publichNtauh1hhj2hhhNhNubj)}(hhh](j)}(hwint ipcget_public (struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops, struct ipc_params *params)h]j)}(hvint ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops, struct ipc_params *params)h](j )}(hinth]hint}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjEhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEhhhjEhMubj{)}(h ipcget_publich]j)}(h ipcget_publich]h ipcget_public}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjEhhhjEhMubj)}(he(struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops, struct ipc_params *params)h](j)}(hstruct ipc_namespace *nsh](j)}(hjAh]hstruct}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEubh)}(hhh]j)}(h ipc_namespaceh]h ipc_namespace}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjEmodnameN classnameNj] j` )}jc ]jf )}jY jEsbc.ipcget_publicasbuh1hhjEubj2)}(h h]h }(hj FhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hnsh]hns}(hj(FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubj)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hjAFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=Fubj2)}(h h]h }(hjNFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=Fubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hj_FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\Fubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjaFmodnameN classnameNj] j` )}jc ]j Fc.ipcget_publicasbuh1hhj=Fubj2)}(h h]h }(hj}FhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=Fubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=Fubj)}(hidsh]hids}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=Fubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubj)}(hconst struct ipc_ops *opsh](j)}(hjh]hconst}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj)}(hjAh]hstruct}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubh)}(hhh]j)}(hipc_opsh]hipc_ops}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjFmodnameN classnameNj] j` )}jc ]j Fc.ipcget_publicasbuh1hhjFubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj)}(hjh]h*}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hopsh]hops}(hj#GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubj)}(hstruct ipc_params *paramsh](j)}(hjAh]hstruct}(hjah"]h$]h&]uh1j1hj8Gubh)}(hhh]j)}(h ipc_paramsh]h ipc_params}(hjZGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWGubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj\GmodnameN classnameNj] j` )}jc ]j Fc.ipcget_publicasbuh1hhj8Gubj2)}(h h]h }(hjxGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8Gubj)}(hjh]h*}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8Gubj)}(hparamsh]hparams}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8Gubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubeh}(h]h ]h"]h$]h&]jjuh1jhjEhhhjEhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjEhhhjEhMubah}(h]jEah ](jjeh"]h$]h&]jj)jhuh1jhjEhMhjEhhubj)}(hhh]h)}(h%get an ipc object or create a new oneh]h%get an ipc object or create a new one}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjGhhubah}(h]h ]h"]h$]h&]uh1jhjEhhhjEhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjGjjGjjjuh1jhhhj2hNhNubj)}(hX**Parameters** ``struct ipc_namespace *ns`` ipc namespace ``struct ipc_ids *ids`` ipc identifier set ``const struct ipc_ops *ops`` the actual creation routine to call ``struct ipc_params *params`` its parameters **Description** This routine is called by sys_msgget, sys_semget() and sys_shmget() when the key is not IPC_PRIVATE. It adds a new entry if the key is not found and does some permission / security checkings if the key is found. On success, the ipc id is returned.h](h)}(h**Parameters**h]j)}(hjGh]h Parameters}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjGubj )}(hhh](j)}(h+``struct ipc_namespace *ns`` ipc namespace h](j)}(h``struct ipc_namespace *ns``h]j)}(hjGh]hstruct ipc_namespace *ns}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjGubj2)}(hhh]h)}(h ipc namespaceh]h ipc namespace}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhMhjHubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhjHhMhjGubj)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hj7Hh]hstruct ipc_ids *ids}(hj9HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5Hubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj1Hubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hjPHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLHhMhjMHubah}(h]h ]h"]h$]h&]uh1j1hj1Hubeh}(h]h ]h"]h$]h&]uh1jhjLHhMhjGubj)}(hB``const struct ipc_ops *ops`` the actual creation routine to call h](j)}(h``const struct ipc_ops *ops``h]j)}(hjpHh]hconst struct ipc_ops *ops}(hjrHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnHubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjjHubj2)}(hhh]h)}(h#the actual creation routine to callh]h#the actual creation routine to call}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhMhjHubah}(h]h ]h"]h$]h&]uh1j1hjjHubeh}(h]h ]h"]h$]h&]uh1jhjHhMhjGubj)}(h-``struct ipc_params *params`` its parameters h](j)}(h``struct ipc_params *params``h]j)}(hjHh]hstruct ipc_params *params}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjHubj2)}(hhh]h)}(hits parametersh]hits parameters}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhMhjHubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjHhMhjGubeh}(h]h ]h"]h$]h&]uh1j hjGubh)}(h**Description**h]j)}(hjHh]h Description}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjGubh)}(hThis routine is called by sys_msgget, sys_semget() and sys_shmget() when the key is not IPC_PRIVATE. It adds a new entry if the key is not found and does some permission / security checkings if the key is found.h]hThis routine is called by sys_msgget, sys_semget() and sys_shmget() when the key is not IPC_PRIVATE. It adds a new entry if the key is not found and does some permission / security checkings if the key is found.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjGubh)}(h#On success, the ipc id is returned.h]h#On success, the ipc id is returned.}(hj IhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipc_kht_remove (C function)c.ipc_kht_removehNtauh1hhj2hhhNhNubj)}(hhh](j)}(hEvoid ipc_kht_remove (struct ipc_ids *ids, struct kern_ipc_perm *ipcp)h]j)}(hDvoid ipc_kht_remove(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)h](j )}(hvoidh]hvoid}(hj8IhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj4IhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hjGIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4IhhhjFIhMubj{)}(hipc_kht_removeh]j)}(hipc_kht_removeh]hipc_kht_remove}(hjYIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUIubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj4IhhhjFIhMubj)}(h1(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)h](j)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hjuIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqIubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjImodnameN classnameNj] j` )}jc ]jf )}jY j[Isbc.ipc_kht_removeasbuh1hhjqIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqIubj)}(hjh]h*}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqIubj)}(hidsh]hids}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjmIubj)}(hstruct kern_ipc_perm *ipcph](j)}(hjAh]hstruct}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjJmodnameN classnameNj] j` )}jc ]jIc.ipc_kht_removeasbuh1hhjIubj2)}(h h]h }(hj#JhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjh]h*}(hj1JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hipcph]hipcp}(hj>JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjmIubeh}(h]h ]h"]h$]h&]jjuh1jhj4IhhhjFIhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj0IhhhjFIhMubah}(h]j+Iah ](jjeh"]h$]h&]jj)jhuh1jhjFIhMhj-Ihhubj)}(hhh]h)}(h$remove an ipc from the key hashtableh]h$remove an ipc from the key hashtable}(hjhJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjeJhhubah}(h]h ]h"]h$]h&]uh1jhj-IhhhjFIhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjJjjJjjjuh1jhhhj2hNhNubj)}(hX!**Parameters** ``struct ipc_ids *ids`` ipc identifier set ``struct kern_ipc_perm *ipcp`` ipc perm structure containing the key to remove **Description** ipc_ids.rwsem (as a writer) and the spinlock for this ID are held before this function is called, and remain locked on the exit.h](h)}(h**Parameters**h]j)}(hjJh]h Parameters}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjJubj )}(hhh](j)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hjJh]hstruct ipc_ids *ids}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjJubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMhjJubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjJhMhjJubj)}(hO``struct kern_ipc_perm *ipcp`` ipc perm structure containing the key to remove h](j)}(h``struct kern_ipc_perm *ipcp``h]j)}(hjJh]hstruct kern_ipc_perm *ipcp}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjJubj2)}(hhh]h)}(h/ipc perm structure containing the key to removeh]h/ipc perm structure containing the key to remove}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMhjJubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjJhMhjJubeh}(h]h ]h"]h$]h&]uh1j hjJubh)}(h**Description**h]j)}(hjKh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjJubh)}(hipc_ids.rwsem (as a writer) and the spinlock for this ID are held before this function is called, and remain locked on the exit.h]hipc_ids.rwsem (as a writer) and the spinlock for this ID are held before this function is called, and remain locked on the exit.}(hj3KhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipc_search_maxidx (C function)c.ipc_search_maxidxhNtauh1hhj2hhhNhNubj)}(hhh](j)}(h6int ipc_search_maxidx (struct ipc_ids *ids, int limit)h]j)}(h5int ipc_search_maxidx(struct ipc_ids *ids, int limit)h](j )}(hinth]hint}(hjbKhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj^KhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hjqKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^KhhhjpKhMubj{)}(hipc_search_maxidxh]j)}(hipc_search_maxidxh]hipc_search_maxidx}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj^KhhhjpKhMubj)}(h (struct ipc_ids *ids, int limit)h](j)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjKmodnameN classnameNj] j` )}jc ]jf )}jY jKsbc.ipc_search_maxidxasbuh1hhjKubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubj)}(hjh]h*}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hidsh]hids}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjKubj)}(h int limith](j )}(hinth]hint}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj Lubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj Lubj)}(hlimith]hlimit}(hj-LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Lubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjKubeh}(h]h ]h"]h$]h&]jjuh1jhj^KhhhjpKhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjZKhhhjpKhMubah}(h]jUKah ](jjeh"]h$]h&]jj)jhuh1jhjpKhMhjWKhhubj)}(hhh]h)}(h%search for the highest assigned indexh]h%search for the highest assigned index}(hjWLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjTLhhubah}(h]h ]h"]h$]h&]uh1jhjWKhhhjpKhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjoLjjoLjjjuh1jhhhj2hNhNubj)}(hX**Parameters** ``struct ipc_ids *ids`` ipc identifier set ``int limit`` known upper limit for highest assigned index **Description** The function determines the highest assigned index in **ids**. It is intended to be called when ids->max_idx needs to be updated. Updating ids->max_idx is necessary when the current highest index ipc object is deleted. If no ipc object is allocated, then -1 is returned. ipc_ids.rwsem needs to be held by the caller.h](h)}(h**Parameters**h]j)}(hjyLh]h Parameters}(hj{LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwLubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjsLubj )}(hhh](j)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hjLh]hstruct ipc_ids *ids}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjLubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjLubah}(h]h ]h"]h$]h&]uh1j1hjLubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjLubj)}(h;``int limit`` known upper limit for highest assigned index h](j)}(h ``int limit``h]j)}(hjLh]h int limit}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjLubj2)}(hhh]h)}(h,known upper limit for highest assigned indexh]h,known upper limit for highest assigned index}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjLubah}(h]h ]h"]h$]h&]uh1j1hjLubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjLubeh}(h]h ]h"]h$]h&]uh1j hjsLubh)}(h**Description**h]j)}(hj Mh]h Description}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Mubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjsLubh)}(hXThe function determines the highest assigned index in **ids**. It is intended to be called when ids->max_idx needs to be updated. Updating ids->max_idx is necessary when the current highest index ipc object is deleted. If no ipc object is allocated, then -1 is returned.h](h6The function determines the highest assigned index in }(hj"MhhhNhNubj)}(h**ids**h]hids}(hj*MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"Mubh. It is intended to be called when ids->max_idx needs to be updated. Updating ids->max_idx is necessary when the current highest index ipc object is deleted. If no ipc object is allocated, then -1 is returned.}(hj"MhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjsLubh)}(h-ipc_ids.rwsem needs to be held by the caller.h]h-ipc_ids.rwsem needs to be held by the caller.}(hjCMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjsLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipc_rmid (C function) c.ipc_rmidhNtauh1hhj2hhhNhNubj)}(hhh](j)}(h?void ipc_rmid (struct ipc_ids *ids, struct kern_ipc_perm *ipcp)h]j)}(h>void ipc_rmid(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)h](j )}(hvoidh]hvoid}(hjrMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnMhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnMhhhjMhMubj{)}(hipc_rmidh]j)}(hipc_rmidh]hipc_rmid}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnMhhhjMhMubj)}(h1(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)h](j)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjMmodnameN classnameNj] j` )}jc ]jf )}jY jMsb c.ipc_rmidasbuh1hhjMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj)}(hjh]h*}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(hidsh]hids}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(hstruct kern_ipc_perm *ipcph](j)}(hjAh]hstruct}(hj!NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj2)}(h h]h }(hj.NhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hj?NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjah"]h$]h&]uh1j1hjNubj)}(hjh]h*}(hjkNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj)}(hipcph]hipcp}(hjxNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubeh}(h]h ]h"]h$]h&]jjuh1jhjnMhhhjMhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjjMhhhjMhMubah}(h]jeMah ](jjeh"]h$]h&]jj)jhuh1jhjMhMhjgMhhubj)}(hhh]h)}(hremove an ipc identifierh]hremove an ipc identifier}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjNhhubah}(h]h ]h"]h$]h&]uh1jhjgMhhhjMhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjNjjNjjjuh1jhhhj2hNhNubj)}(hX(**Parameters** ``struct ipc_ids *ids`` ipc identifier set ``struct kern_ipc_perm *ipcp`` ipc perm structure containing the identifier to remove **Description** ipc_ids.rwsem (as a writer) and the spinlock for this ID are held before this function is called, and remain locked on the exit.h](h)}(h**Parameters**h]j)}(hjNh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjNubj )}(hhh](j)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hjNh]hstruct ipc_ids *ids}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjNubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMhjNubah}(h]h ]h"]h$]h&]uh1j1hjNubeh}(h]h ]h"]h$]h&]uh1jhjNhMhjNubj)}(hV``struct kern_ipc_perm *ipcp`` ipc perm structure containing the identifier to remove h](j)}(h``struct kern_ipc_perm *ipcp``h]j)}(hjOh]hstruct kern_ipc_perm *ipcp}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjOubj2)}(hhh]h)}(h6ipc perm structure containing the identifier to removeh]h6ipc perm structure containing the identifier to remove}(hj5OhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1OhMhj2Oubah}(h]h ]h"]h$]h&]uh1j1hjOubeh}(h]h ]h"]h$]h&]uh1jhj1OhMhjNubeh}(h]h ]h"]h$]h&]uh1j hjNubh)}(h**Description**h]j)}(hjWOh]h Description}(hjYOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUOubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjNubh)}(hipc_ids.rwsem (as a writer) and the spinlock for this ID are held before this function is called, and remain locked on the exit.h]hipc_ids.rwsem (as a writer) and the spinlock for this ID are held before this function is called, and remain locked on the exit.}(hjmOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  ipc_set_key_private (C function)c.ipc_set_key_privatehNtauh1hhj2hhhNhNubj)}(hhh](j)}(hJvoid ipc_set_key_private (struct ipc_ids *ids, struct kern_ipc_perm *ipcp)h]j)}(hIvoid ipc_set_key_private(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)h](j )}(hvoidh]hvoid}(hjOhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjOhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hjOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOhhhjOhMubj{)}(hipc_set_key_privateh]j)}(hipc_set_key_privateh]hipc_set_key_private}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjOhhhjOhMubj)}(h1(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)h](j)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj2)}(h h]h }(hjOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjOmodnameN classnameNj] j` )}jc ]jf )}jY jOsbc.ipc_set_key_privateasbuh1hhjOubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOubj)}(hjh]h*}(hj%PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj)}(hidsh]hids}(hj2PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubj)}(hstruct kern_ipc_perm *ipcph](j)}(hjAh]hstruct}(hjKPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGPubj2)}(h h]h }(hjXPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGPubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjiPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfPubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjkPmodnameN classnameNj] j` )}jc ]jPc.ipc_set_key_privateasbuh1hhjGPubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGPubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGPubj)}(hipcph]hipcp}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGPubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubeh}(h]h ]h"]h$]h&]jjuh1jhjOhhhjOhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjOhhhjOhMubah}(h]jOah ](jjeh"]h$]h&]jj)jhuh1jhjOhMhjOhhubj)}(hhh]h)}(h0switch the key of an existing ipc to IPC_PRIVATEh]h0switch the key of an existing ipc to IPC_PRIVATE}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjPhhubah}(h]h ]h"]h$]h&]uh1jhjOhhhjOhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjPjjPjjjuh1jhhhj2hNhNubj)}(hX!**Parameters** ``struct ipc_ids *ids`` ipc identifier set ``struct kern_ipc_perm *ipcp`` ipc perm structure containing the key to modify **Description** ipc_ids.rwsem (as a writer) and the spinlock for this ID are held before this function is called, and remain locked on the exit.h](h)}(h**Parameters**h]j)}(hjPh]h Parameters}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjPubj )}(hhh](j)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hj Qh]hstruct ipc_ids *ids}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Qubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjQubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hj&QhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"QhMhj#Qubah}(h]h ]h"]h$]h&]uh1j1hjQubeh}(h]h ]h"]h$]h&]uh1jhj"QhMhjQubj)}(hO``struct kern_ipc_perm *ipcp`` ipc perm structure containing the key to modify h](j)}(h``struct kern_ipc_perm *ipcp``h]j)}(hjFQh]hstruct kern_ipc_perm *ipcp}(hjHQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDQubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj@Qubj2)}(hhh]h)}(h/ipc perm structure containing the key to modifyh]h/ipc perm structure containing the key to modify}(hj_QhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[QhMhj\Qubah}(h]h ]h"]h$]h&]uh1j1hj@Qubeh}(h]h ]h"]h$]h&]uh1jhj[QhMhjQubeh}(h]h ]h"]h$]h&]uh1j hjPubh)}(h**Description**h]j)}(hjQh]h Description}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjPubh)}(hipc_ids.rwsem (as a writer) and the spinlock for this ID are held before this function is called, and remain locked on the exit.h]hipc_ids.rwsem (as a writer) and the spinlock for this ID are held before this function is called, and remain locked on the exit.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipcperms (C function) c.ipcpermshNtauh1hhj2hhhNhNubj)}(hhh](j)}(hOint ipcperms (struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, short flag)h]j)}(hNint ipcperms(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, short flag)h](j )}(hinth]hint}(hjQhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjQhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQhhhjQhMubj{)}(hipcpermsh]j)}(hipcpermsh]hipcperms}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjQhhhjQhMubj)}(hB(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, short flag)h](j)}(hstruct ipc_namespace *nsh](j)}(hjAh]hstruct}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubh)}(hhh]j)}(h ipc_namespaceh]h ipc_namespace}(hj!RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj#RmodnameN classnameNj] j` )}jc ]jf )}jY jQsb c.ipcpermsasbuh1hhjQubj2)}(h h]h }(hjARhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hjh]h*}(hjORhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(hnsh]hns}(hj\RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubj)}(hstruct kern_ipc_perm *ipcph](j)}(hjAh]hstruct}(hjuRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqRubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqRubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjRmodnameN classnameNj] j` )}jc ]j=R c.ipcpermsasbuh1hhjqRubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqRubj)}(hjh]h*}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqRubj)}(hipcph]hipcp}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqRubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubj)}(h short flagh](j )}(hshorth]hshort}(hjRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjRubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRubj)}(hflagh]hflag}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubeh}(h]h ]h"]h$]h&]jjuh1jhjQhhhjQhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjQhhhjQhMubah}(h]jQah ](jjeh"]h$]h&]jj)jhuh1jhjQhMhjQhhubj)}(hhh]h)}(hcheck ipc permissionsh]hcheck ipc permissions}(hj+ShhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj(Shhubah}(h]h ]h"]h$]h&]uh1jhjQhhhjQhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjCSjjCSjjjuh1jhhhj2hNhNubj)}(hXH**Parameters** ``struct ipc_namespace *ns`` ipc namespace ``struct kern_ipc_perm *ipcp`` ipc permission set ``short flag`` desired permission set **Description** Check user, group, other permissions for access to ipc resources. return 0 if allowed **flag** will most probably be 0 or ``S_...UGO`` from h](h)}(h**Parameters**h]j)}(hjMSh]h Parameters}(hjOShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKSubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM#hjGSubj )}(hhh](j)}(h+``struct ipc_namespace *ns`` ipc namespace h](j)}(h``struct ipc_namespace *ns``h]j)}(hjlSh]hstruct ipc_namespace *ns}(hjnShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjSubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM hjfSubj2)}(hhh]h)}(h ipc namespaceh]h ipc namespace}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShM hjSubah}(h]h ]h"]h$]h&]uh1j1hjfSubeh}(h]h ]h"]h$]h&]uh1jhjShM hjcSubj)}(h2``struct kern_ipc_perm *ipcp`` ipc permission set h](j)}(h``struct kern_ipc_perm *ipcp``h]j)}(hjSh]hstruct kern_ipc_perm *ipcp}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM!hjSubj2)}(hhh]h)}(hipc permission seth]hipc permission set}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShM!hjSubah}(h]h ]h"]h$]h&]uh1j1hjSubeh}(h]h ]h"]h$]h&]uh1jhjShM!hjcSubj)}(h&``short flag`` desired permission set h](j)}(h``short flag``h]j)}(hjSh]h short flag}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM"hjSubj2)}(hhh]h)}(hdesired permission seth]hdesired permission set}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShM"hjSubah}(h]h ]h"]h$]h&]uh1j1hjSubeh}(h]h ]h"]h$]h&]uh1jhjShM"hjcSubeh}(h]h ]h"]h$]h&]uh1j hjGSubh)}(h**Description**h]j)}(hjTh]h Description}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM$hjGSubh)}(hUCheck user, group, other permissions for access to ipc resources. return 0 if allowedh]hUCheck user, group, other permissions for access to ipc resources. return 0 if allowed}(hj/ThhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM#hjGSubh)}(hD**flag** will most probably be 0 or ``S_...UGO`` from h](j)}(h**flag**h]hflag}(hjBThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>Tubh will most probably be 0 or }(hj>ThhhNhNubj)}(h ``S_...UGO``h]hS_...UGO}(hjTThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>Tubh from }(hj>ThhhNhNubeh}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM&hjGSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !kernel_to_ipc64_perm (C function)c.kernel_to_ipc64_permhNtauh1hhj2hhhNhNubj)}(hhh](j)}(hLvoid kernel_to_ipc64_perm (struct kern_ipc_perm *in, struct ipc64_perm *out)h]j)}(hKvoid kernel_to_ipc64_perm(struct kern_ipc_perm *in, struct ipc64_perm *out)h](j )}(hvoidh]hvoid}(hjThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjThhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMDubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjThhhjThMDubj{)}(hkernel_to_ipc64_permh]j)}(hkernel_to_ipc64_permh]hkernel_to_ipc64_perm}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjThhhjThMDubj)}(h2(struct kern_ipc_perm *in, struct ipc64_perm *out)h](j)}(hstruct kern_ipc_perm *inh](j)}(hjAh]hstruct}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjTmodnameN classnameNj] j` )}jc ]jf )}jY jTsbc.kernel_to_ipc64_permasbuh1hhjTubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hjh]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hinh]hin}(hj#UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubj)}(hstruct ipc64_perm *outh](j)}(hjAh]hstruct}(hjah"]h$]h&]uh1j1hj8Uubh)}(hhh]j)}(h ipc64_permh]h ipc64_perm}(hjZUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWUubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj\UmodnameN classnameNj] j` )}jc ]jUc.kernel_to_ipc64_permasbuh1hhj8Uubj2)}(h h]h }(hjxUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8Uubj)}(hjh]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8Uubj)}(houth]hout}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8Uubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubeh}(h]h ]h"]h$]h&]jjuh1jhjThhhjThMDubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjThhhjThMDubah}(h]jTah ](jjeh"]h$]h&]jj)jhuh1jhjThMDhjThhubj)}(hhh]h)}(h&convert kernel ipc permissions to userh]h&convert kernel ipc permissions to user}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMDhjUhhubah}(h]h ]h"]h$]h&]uh1jhjThhhjThMDubeh}(h]h ](jfunctioneh"]h$]h&]jjjjUjjUjjjuh1jhhhj2hNhNubj)}(h**Parameters** ``struct kern_ipc_perm *in`` kernel permissions ``struct ipc64_perm *out`` new style ipc permissions **Description** Turn the kernel object **in** into a set of permissions descriptions for returning to userspace (**out**).h](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMHhjUubj )}(hhh](j)}(h0``struct kern_ipc_perm *in`` kernel permissions h](j)}(h``struct kern_ipc_perm *in``h]j)}(hjUh]hstruct kern_ipc_perm *in}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMEhjUubj2)}(hhh]h)}(hkernel permissionsh]hkernel permissions}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMEhjVubah}(h]h ]h"]h$]h&]uh1j1hjUubeh}(h]h ]h"]h$]h&]uh1jhjVhMEhjUubj)}(h5``struct ipc64_perm *out`` new style ipc permissions h](j)}(h``struct ipc64_perm *out``h]j)}(hj7Vh]hstruct ipc64_perm *out}(hj9VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5Vubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMFhj1Vubj2)}(hhh]h)}(hnew style ipc permissionsh]hnew style ipc permissions}(hjPVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLVhMFhjMVubah}(h]h ]h"]h$]h&]uh1j1hj1Vubeh}(h]h ]h"]h$]h&]uh1jhjLVhMFhjUubeh}(h]h ]h"]h$]h&]uh1j hjUubh)}(h**Description**h]j)}(hjrVh]h Description}(hjtVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpVubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMHhjUubh)}(hjTurn the kernel object **in** into a set of permissions descriptions for returning to userspace (**out**).h](hTurn the kernel object }(hjVhhhNhNubj)}(h**in**h]hin}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubhD into a set of permissions descriptions for returning to userspace (}(hjVhhhNhNubj)}(h**out**h]hout}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh).}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMGhjUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #ipc64_perm_to_ipc_perm (C function)c.ipc64_perm_to_ipc_permhNtauh1hhj2hhhNhNubj)}(hhh](j)}(hIvoid ipc64_perm_to_ipc_perm (struct ipc64_perm *in, struct ipc_perm *out)h]j)}(hHvoid ipc64_perm_to_ipc_perm(struct ipc64_perm *in, struct ipc_perm *out)h](j )}(hvoidh]hvoid}(hjVhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjVhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMWubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVhhhjVhMWubj{)}(hipc64_perm_to_ipc_permh]j)}(hipc64_perm_to_ipc_permh]hipc64_perm_to_ipc_perm}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjVhhhjVhMWubj)}(h-(struct ipc64_perm *in, struct ipc_perm *out)h](j)}(hstruct ipc64_perm *inh](j)}(hjAh]hstruct}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj2)}(h h]h }(hj%WhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubh)}(hhh]j)}(h ipc64_permh]h ipc64_perm}(hj6WhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Wubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj8WmodnameN classnameNj] j` )}jc ]jf )}jY jVsbc.ipc64_perm_to_ipc_permasbuh1hhjWubj2)}(h h]h }(hjVWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjh]h*}(hjdWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hinh]hin}(hjqWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjWubj)}(hstruct ipc_perm *outh](j)}(hjAh]hstruct}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubh)}(hhh]j)}(hipc_permh]hipc_perm}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjWmodnameN classnameNj] j` )}jc ]jRWc.ipc64_perm_to_ipc_permasbuh1hhjWubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(houth]hout}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjWubeh}(h]h ]h"]h$]h&]jjuh1jhjVhhhjVhMWubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjVhhhjVhMWubah}(h]jVah ](jjeh"]h$]h&]jj)jhuh1jhjVhMWhjVhhubj)}(hhh]h)}(h"convert new ipc permissions to oldh]h"convert new ipc permissions to old}(hj XhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMWhjXhhubah}(h]h ]h"]h$]h&]uh1jhjVhhhjVhMWubeh}(h]h ](jfunctioneh"]h$]h&]jjjj#Xjj#Xjjjuh1jhhhj2hNhNubj)}(h**Parameters** ``struct ipc64_perm *in`` new style ipc permissions ``struct ipc_perm *out`` old style ipc permissions **Description** Turn the new style permissions object **in** into a compatibility object and store it into the **out** pointer.h](h)}(h**Parameters**h]j)}(hj-Xh]h Parameters}(hj/XhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+Xubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM[hj'Xubj )}(hhh](j)}(h4``struct ipc64_perm *in`` new style ipc permissions h](j)}(h``struct ipc64_perm *in``h]j)}(hjLXh]hstruct ipc64_perm *in}(hjNXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJXubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMXhjFXubj2)}(hhh]h)}(hnew style ipc permissionsh]hnew style ipc permissions}(hjeXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjaXhMXhjbXubah}(h]h ]h"]h$]h&]uh1j1hjFXubeh}(h]h ]h"]h$]h&]uh1jhjaXhMXhjCXubj)}(h3``struct ipc_perm *out`` old style ipc permissions h](j)}(h``struct ipc_perm *out``h]j)}(hjXh]hstruct ipc_perm *out}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMYhjXubj2)}(hhh]h)}(hold style ipc permissionsh]hold style ipc permissions}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMYhjXubah}(h]h ]h"]h$]h&]uh1j1hjXubeh}(h]h ]h"]h$]h&]uh1jhjXhMYhjCXubeh}(h]h ]h"]h$]h&]uh1j hj'Xubh)}(h**Description**h]j)}(hjXh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chM[hj'Xubh)}(hoTurn the new style permissions object **in** into a compatibility object and store it into the **out** pointer.h](h&Turn the new style permissions object }(hjXhhhNhNubj)}(h**in**h]hin}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh3 into a compatibility object and store it into the }(hjXhhhNhNubj)}(h**out**h]hout}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh pointer.}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMZhj'Xubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "ipc_obtain_object_idr (C function)c.ipc_obtain_object_idrhNtauh1hhj2hhhNhNubj)}(hhh](j)}(hJstruct kern_ipc_perm * ipc_obtain_object_idr (struct ipc_ids *ids, int id)h]j)}(hHstruct kern_ipc_perm *ipc_obtain_object_idr(struct ipc_ids *ids, int id)h](j)}(hjAh]hstruct}(hj)YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%YhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMjubj2)}(h h]h }(hj7YhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%Yhhhj6YhMjubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjHYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEYubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjJYmodnameN classnameNj] j` )}jc ]jf )}jY ipc_obtain_object_idrsbc.ipc_obtain_object_idrasbuh1hhj%Yhhhj6YhMjubj2)}(h h]h }(hjiYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%Yhhhj6YhMjubj)}(hjh]h*}(hjwYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%Yhhhj6YhMjubj{)}(hipc_obtain_object_idrh]j)}(hjfYh]hipc_obtain_object_idr}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj%Yhhhj6YhMjubj)}(h(struct ipc_ids *ids, int id)h](j)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjYmodnameN classnameNj] j` )}jc ]jdYc.ipc_obtain_object_idrasbuh1hhjYubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hidsh]hids}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjYubj)}(hint idh](j )}(hinth]hint}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZubj2)}(h h]h }(hj!ZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hidh]hid}(hj/ZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjYubeh}(h]h ]h"]h$]h&]jjuh1jhj%Yhhhj6YhMjubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj!Yhhhj6YhMjubah}(h]jYah ](jjeh"]h$]h&]jj)jhuh1jhj6YhMjhjYhhubj)}(hhh]h)}(hCLook for an id in the ipc ids idr and return associated ipc object.h]hCLook for an id in the ipc ids idr and return associated ipc object.}(hjYZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMjhjVZhhubah}(h]h ]h"]h$]h&]uh1jhjYhhhj6YhMjubeh}(h]h ](jfunctioneh"]h$]h&]jjjjqZjjqZjjjuh1jhhhj2hNhNubj)}(h**Parameters** ``struct ipc_ids *ids`` ipc identifier set ``int id`` ipc id to look for **Description** Call inside the RCU critical section. The ipc object is *not* locked on exit.h](h)}(h**Parameters**h]j)}(hj{Zh]h Parameters}(hj}ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyZubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMnhjuZubj )}(hhh](j)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hjZh]hstruct ipc_ids *ids}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMlhjZubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhMlhjZubah}(h]h ]h"]h$]h&]uh1j1hjZubeh}(h]h ]h"]h$]h&]uh1jhjZhMlhjZubj)}(h``int id`` ipc id to look for h](j)}(h ``int id``h]j)}(hjZh]hint id}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMmhjZubj2)}(hhh]h)}(hipc id to look forh]hipc id to look for}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhMmhjZubah}(h]h ]h"]h$]h&]uh1j1hjZubeh}(h]h ]h"]h$]h&]uh1jhjZhMmhjZubeh}(h]h ]h"]h$]h&]uh1j hjuZubh)}(h**Description**h]j)}(hj[h]h Description}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj [ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMohjuZubh)}(hMCall inside the RCU critical section. The ipc object is *not* locked on exit.h](h8Call inside the RCU critical section. The ipc object is }(hj$[hhhNhNubj)}(h*not*h]hnot}(hj,[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$[ubh locked on exit.}(hj$[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMnhjuZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $ipc_obtain_object_check (C function)c.ipc_obtain_object_checkhNtauh1hhj2hhhNhNubj)}(hhh](j)}(hLstruct kern_ipc_perm * ipc_obtain_object_check (struct ipc_ids *ids, int id)h]j)}(hJstruct kern_ipc_perm *ipc_obtain_object_check(struct ipc_ids *ids, int id)h](j)}(hjAh]hstruct}(hje[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja[hhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hjs[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hja[hhhjr[hMubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj[modnameN classnameNj] j` )}jc ]jf )}jY ipc_obtain_object_checksbc.ipc_obtain_object_checkasbuh1hhja[hhhjr[hMubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hja[hhhjr[hMubj)}(hjh]h*}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja[hhhjr[hMubj{)}(hipc_obtain_object_checkh]j)}(hj[h]hipc_obtain_object_check}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhja[hhhjr[hMubj)}(h(struct ipc_ids *ids, int id)h](j)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[ubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj[modnameN classnameNj] j` )}jc ]j[c.ipc_obtain_object_checkasbuh1hhj[ubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[ubj)}(hjh]h*}(hj)\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj)}(hidsh]hids}(hj6\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj[ubj)}(hint idh](j )}(hinth]hint}(hjO\hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjK\ubj2)}(h h]h }(hj]\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjK\ubj)}(hidh]hid}(hjk\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj[ubeh}(h]h ]h"]h$]h&]jjuh1jhja[hhhjr[hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj][hhhjr[hMubah}(h]jX[ah ](jjeh"]h$]h&]jj)jhuh1jhjr[hMhjZ[hhubj)}(hhh]h)}(hRSimilar to ipc_obtain_object_idr() but also checks the ipc object sequence number.h]hRSimilar to ipc_obtain_object_idr() but also checks the ipc object sequence number.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj\hhubah}(h]h ]h"]h$]h&]uh1jhjZ[hhhjr[hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj\jj\jjjuh1jhhhj2hNhNubj)}(h**Parameters** ``struct ipc_ids *ids`` ipc identifier set ``int id`` ipc id to look for **Description** Call inside the RCU critical section. The ipc object is *not* locked on exit.h](h)}(h**Parameters**h]j)}(hj\h]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj\ubj )}(hhh](j)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hj\h]hstruct ipc_ids *ids}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj\ubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMhj\ubah}(h]h ]h"]h$]h&]uh1j1hj\ubeh}(h]h ]h"]h$]h&]uh1jhj\hMhj\ubj)}(h``int id`` ipc id to look for h](j)}(h ``int id``h]j)}(hj]h]hint id}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ]ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj ]ubj2)}(hhh]h)}(hipc id to look forh]hipc id to look for}(hj(]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$]hMhj%]ubah}(h]h ]h"]h$]h&]uh1j1hj ]ubeh}(h]h ]h"]h$]h&]uh1jhj$]hMhj\ubeh}(h]h ]h"]h$]h&]uh1j hj\ubh)}(h**Description**h]j)}(hjJ]h]h Description}(hjL]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH]ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj\ubh)}(hMCall inside the RCU critical section. The ipc object is *not* locked on exit.h](h8Call inside the RCU critical section. The ipc object is }(hj`]hhhNhNubj)}(h*not*h]hnot}(hjh]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`]ubh locked on exit.}(hj`]hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipcget (C function)c.ipcgethNtauh1hhj2hhhNhNubj)}(hhh](j)}(hpint ipcget (struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops, struct ipc_params *params)h]j)}(hoint ipcget(struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops, struct ipc_params *params)h](j )}(hinth]hint}(hj]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]hhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]hhhj]hMubj{)}(hipcgeth]j)}(hipcgeth]hipcget}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj]hhhj]hMubj)}(he(struct ipc_namespace *ns, struct ipc_ids *ids, const struct ipc_ops *ops, struct ipc_params *params)h](j)}(hstruct ipc_namespace *nsh](j)}(hjAh]hstruct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubh)}(hhh]j)}(h ipc_namespaceh]h ipc_namespace}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj]modnameN classnameNj] j` )}jc ]jf )}jY j]sbc.ipcgetasbuh1hhj]ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hjh]h*}(hj*^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hnsh]hns}(hj7^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hjP^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL^ubj2)}(h h]h }(hj]^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjL^ubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hjn^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk^ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjp^modnameN classnameNj] j` )}jc ]j^c.ipcgetasbuh1hhjL^ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjL^ubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL^ubj)}(hidsh]hids}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(hconst struct ipc_ops *opsh](j)}(hjh]hconst}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubj)}(hjAh]hstruct}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubh)}(hhh]j)}(hipc_opsh]hipc_ops}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj^modnameN classnameNj] j` )}jc ]j^c.ipcgetasbuh1hhj^ubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubj)}(hjh]h*}(hj%_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hopsh]hops}(hj2_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(hstruct ipc_params *paramsh](j)}(hjAh]hstruct}(hjK_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG_ubj2)}(h h]h }(hjX_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjG_ubh)}(hhh]j)}(h ipc_paramsh]h ipc_params}(hji_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf_ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjk_modnameN classnameNj] j` )}jc ]j^c.ipcgetasbuh1hhjG_ubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjG_ubj)}(hjh]h*}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG_ubj)}(hparamsh]hparams}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubeh}(h]h ]h"]h$]h&]jjuh1jhj]hhhj]hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]hhhj]hMubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1jhj]hMhj]hhubj)}(hhh]h)}(hCommon sys_*get() codeh]hCommon sys_*get() code}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj_hhubah}(h]h ]h"]h$]h&]uh1jhj]hhhj]hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj_jj_jjjuh1jhhhj2hNhNubj)}(hX**Parameters** ``struct ipc_namespace *ns`` namespace ``struct ipc_ids *ids`` ipc identifier set ``const struct ipc_ops *ops`` operations to be called on ipc object creation, permission checks and further checks ``struct ipc_params *params`` the parameters needed by the previous operations. **Description** Common routine called by sys_msgget(), sys_semget() and sys_shmget().h](h)}(h**Parameters**h]j)}(hj_h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj_ubj )}(hhh](j)}(h'``struct ipc_namespace *ns`` namespace h](j)}(h``struct ipc_namespace *ns``h]j)}(hj `h]hstruct ipc_namespace *ns}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj `ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj`ubj2)}(hhh]h)}(h namespaceh]h namespace}(hj&`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"`hMhj#`ubah}(h]h ]h"]h$]h&]uh1j1hj`ubeh}(h]h ]h"]h$]h&]uh1jhj"`hMhj`ubj)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hjF`h]hstruct ipc_ids *ids}(hjH`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD`ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj@`ubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hj_`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[`hMhj\`ubah}(h]h ]h"]h$]h&]uh1j1hj@`ubeh}(h]h ]h"]h$]h&]uh1jhj[`hMhj`ubj)}(hs``const struct ipc_ops *ops`` operations to be called on ipc object creation, permission checks and further checks h](j)}(h``const struct ipc_ops *ops``h]j)}(hj`h]hconst struct ipc_ops *ops}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}`ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjy`ubj2)}(hhh]h)}(hToperations to be called on ipc object creation, permission checks and further checksh]hToperations to be called on ipc object creation, permission checks and further checks}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj`ubah}(h]h ]h"]h$]h&]uh1j1hjy`ubeh}(h]h ]h"]h$]h&]uh1jhj`hMhj`ubj)}(hP``struct ipc_params *params`` the parameters needed by the previous operations. h](j)}(h``struct ipc_params *params``h]j)}(hj`h]hstruct ipc_params *params}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj`ubj2)}(hhh]h)}(h1the parameters needed by the previous operations.h]h1the parameters needed by the previous operations.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hMhj`ubah}(h]h ]h"]h$]h&]uh1j1hj`ubeh}(h]h ]h"]h$]h&]uh1jhj`hMhj`ubeh}(h]h ]h"]h$]h&]uh1j hj_ubh)}(h**Description**h]j)}(hj`h]h Description}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj_ubh)}(hECommon routine called by sys_msgget(), sys_semget() and sys_shmget().h]hECommon routine called by sys_msgget(), sys_semget() and sys_shmget().}(hj ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipc_update_perm (C function)c.ipc_update_permhNtauh1hhj2hhhNhNubj)}(hhh](j)}(hFint ipc_update_perm (struct ipc64_perm *in, struct kern_ipc_perm *out)h]j)}(hEint ipc_update_perm(struct ipc64_perm *in, struct kern_ipc_perm *out)h](j )}(hinth]hint}(hj9ahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5ahhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hjHahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ahhhjGahMubj{)}(hipc_update_permh]j)}(hipc_update_permh]hipc_update_perm}(hjZahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVaubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj5ahhhjGahMubj)}(h2(struct ipc64_perm *in, struct kern_ipc_perm *out)h](j)}(hstruct ipc64_perm *inh](j)}(hjAh]hstruct}(hjvahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjraubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjraubh)}(hhh]j)}(h ipc64_permh]h ipc64_perm}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjamodnameN classnameNj] j` )}jc ]jf )}jY j\asbc.ipc_update_permasbuh1hhjraubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjraubj)}(hjh]h*}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjraubj)}(hinh]hin}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjraubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnaubj)}(hstruct kern_ipc_perm *outh](j)}(hjAh]hstruct}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjbmodnameN classnameNj] j` )}jc ]jac.ipc_update_permasbuh1hhjaubj2)}(h h]h }(hj$bhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(hjh]h*}(hj2bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj)}(houth]hout}(hj?bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnaubeh}(h]h ]h"]h$]h&]jjuh1jhj5ahhhjGahMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj1ahhhjGahMubah}(h]j,aah ](jjeh"]h$]h&]jj)jhuh1jhjGahMhj.ahhubj)}(hhh]h)}(h'update the permissions of an ipc objecth]h'update the permissions of an ipc object}(hjibhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjfbhhubah}(h]h ]h"]h$]h&]uh1jhj.ahhhjGahMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbjjbjjjuh1jhhhj2hNhNubj)}(h**Parameters** ``struct ipc64_perm *in`` the permission given as input. ``struct kern_ipc_perm *out`` the permission of the ipc to set.h](h)}(h**Parameters**h]j)}(hjbh]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjbubj )}(hhh](j)}(h9``struct ipc64_perm *in`` the permission given as input. h](j)}(h``struct ipc64_perm *in``h]j)}(hjbh]hstruct ipc64_perm *in}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjbubj2)}(hhh]h)}(hthe permission given as input.h]hthe permission given as input.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMhjbubah}(h]h ]h"]h$]h&]uh1j1hjbubeh}(h]h ]h"]h$]h&]uh1jhjbhMhjbubj)}(h?``struct kern_ipc_perm *out`` the permission of the ipc to set.h](j)}(h``struct kern_ipc_perm *out``h]j)}(hjbh]hstruct kern_ipc_perm *out}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjbubj2)}(hhh]h)}(h!the permission of the ipc to set.h]h!the permission of the ipc to set.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjbubah}(h]h ]h"]h$]h&]uh1j1hjbubeh}(h]h ]h"]h$]h&]uh1jhjbhMhjbubeh}(h]h ]h"]h$]h&]uh1j hjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  ipcctl_obtain_check (C function)c.ipcctl_obtain_checkhNtauh1hhj2hhhNhNubj)}(hhh](j)}(hstruct kern_ipc_perm * ipcctl_obtain_check (struct ipc_namespace *ns, struct ipc_ids *ids, int id, int cmd, struct ipc64_perm *perm, int extra_perm)h]j)}(hstruct kern_ipc_perm *ipcctl_obtain_check(struct ipc_namespace *ns, struct ipc_ids *ids, int id, int cmd, struct ipc64_perm *perm, int extra_perm)h](j)}(hjAh]hstruct}(hj=chhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9chhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hjKchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9chhhjJchMubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hj\chhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYcubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj^cmodnameN classnameNj] j` )}jc ]jf )}jY ipcctl_obtain_checksbc.ipcctl_obtain_checkasbuh1hhj9chhhjJchMubj2)}(h h]h }(hj}chhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9chhhjJchMubj)}(hjh]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9chhhjJchMubj{)}(hipcctl_obtain_checkh]j)}(hjzch]hipcctl_obtain_check}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj9chhhjJchMubj)}(hi(struct ipc_namespace *ns, struct ipc_ids *ids, int id, int cmd, struct ipc64_perm *perm, int extra_perm)h](j)}(hstruct ipc_namespace *nsh](j)}(hjAh]hstruct}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubh)}(hhh]j)}(h ipc_namespaceh]h ipc_namespace}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjcmodnameN classnameNj] j` )}jc ]jxcc.ipcctl_obtain_checkasbuh1hhjcubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hjh]h*}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hnsh]hns}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubj)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hj'dhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#dubj2)}(h h]h }(hj4dhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#dubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hjEdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBdubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjGdmodnameN classnameNj] j` )}jc ]jxcc.ipcctl_obtain_checkasbuh1hhj#dubj2)}(h h]h }(hjcdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#dubj)}(hjh]h*}(hjqdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#dubj)}(hidsh]hids}(hj~dhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#dubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubj)}(hint idh](j )}(hinth]hint}(hjdhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj)}(hidh]hid}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubj)}(hint cmdh](j )}(hinth]hint}(hjdhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj)}(hcmdh]hcmd}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubj)}(hstruct ipc64_perm *permh](j)}(hjAh]hstruct}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubh)}(hhh]j)}(h ipc64_permh]h ipc64_perm}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj!emodnameN classnameNj] j` )}jc ]jxcc.ipcctl_obtain_checkasbuh1hhjdubj2)}(h h]h }(hj=ehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj)}(hjh]h*}(hjKehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hpermh]hperm}(hjXehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubj)}(hint extra_permh](j )}(hinth]hint}(hjqehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjmeubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjmeubj)}(h extra_permh]h extra_perm}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmeubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjcubeh}(h]h ]h"]h$]h&]jjuh1jhj9chhhjJchMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj5chhhjJchMubah}(h]j0cah ](jjeh"]h$]h&]jj)jhuh1jhjJchMhj2chhubj)}(hhh]h)}(h,retrieve an ipc object and check permissionsh]h,retrieve an ipc object and check permissions}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjehhubah}(h]h ]h"]h$]h&]uh1jhj2chhhjJchMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjejjejjjuh1jhhhj2hNhNubj)}(hX**Parameters** ``struct ipc_namespace *ns`` ipc namespace ``struct ipc_ids *ids`` the table of ids where to look for the ipc ``int id`` the id of the ipc to retrieve ``int cmd`` the cmd to check ``struct ipc64_perm *perm`` the permission to set ``int extra_perm`` one extra permission parameter used by msq **Description** This function does some common audit and permissions check for some IPC_XXX cmd and is called from semctl_down, shmctl_down and msgctl_down. It: - retrieves the ipc object with the given id in the given table. - performs some audit and permission check, depending on the given cmd - returns a pointer to the ipc object or otherwise, the corresponding error. Call holding the both the rwsem and the rcu read lock.h](h)}(h**Parameters**h]j)}(hjeh]h Parameters}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjeubj )}(hhh](j)}(h+``struct ipc_namespace *ns`` ipc namespace h](j)}(h``struct ipc_namespace *ns``h]j)}(hjeh]hstruct ipc_namespace *ns}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjeubj2)}(hhh]h)}(h ipc namespaceh]h ipc namespace}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj fhMhjfubah}(h]h ]h"]h$]h&]uh1j1hjeubeh}(h]h ]h"]h$]h&]uh1jhj fhMhjeubj)}(hC``struct ipc_ids *ids`` the table of ids where to look for the ipc h](j)}(h``struct ipc_ids *ids``h]j)}(hj1fh]hstruct ipc_ids *ids}(hj3fhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/fubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhj+fubj2)}(hhh]h)}(h*the table of ids where to look for the ipch]h*the table of ids where to look for the ipc}(hjJfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFfhMhjGfubah}(h]h ]h"]h$]h&]uh1j1hj+fubeh}(h]h ]h"]h$]h&]uh1jhjFfhMhjeubj)}(h)``int id`` the id of the ipc to retrieve h](j)}(h ``int id``h]j)}(hjjfh]hint id}(hjlfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhfubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjdfubj2)}(hhh]h)}(hthe id of the ipc to retrieveh]hthe id of the ipc to retrieve}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhMhjfubah}(h]h ]h"]h$]h&]uh1j1hjdfubeh}(h]h ]h"]h$]h&]uh1jhjfhMhjeubj)}(h``int cmd`` the cmd to check h](j)}(h ``int cmd``h]j)}(hjfh]hint cmd}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjfubj2)}(hhh]h)}(hthe cmd to checkh]hthe cmd to check}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhMhjfubah}(h]h ]h"]h$]h&]uh1j1hjfubeh}(h]h ]h"]h$]h&]uh1jhjfhMhjeubj)}(h2``struct ipc64_perm *perm`` the permission to set h](j)}(h``struct ipc64_perm *perm``h]j)}(hjfh]hstruct ipc64_perm *perm}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjfubj2)}(hhh]h)}(hthe permission to seth]hthe permission to set}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhMhjfubah}(h]h ]h"]h$]h&]uh1j1hjfubeh}(h]h ]h"]h$]h&]uh1jhjfhMhjeubj)}(h>``int extra_perm`` one extra permission parameter used by msq h](j)}(h``int extra_perm``h]j)}(hjgh]hint extra_perm}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjgubj2)}(hhh]h)}(h*one extra permission parameter used by msqh]h*one extra permission parameter used by msq}(hj.ghhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*ghMhj+gubah}(h]h ]h"]h$]h&]uh1j1hjgubeh}(h]h ]h"]h$]h&]uh1jhj*ghMhjeubeh}(h]h ]h"]h$]h&]uh1j hjeubh)}(h**Description**h]j)}(hjPgh]h Description}(hjRghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNgubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjeubh)}(hThis function does some common audit and permissions check for some IPC_XXX cmd and is called from semctl_down, shmctl_down and msgctl_down.h]hThis function does some common audit and permissions check for some IPC_XXX cmd and is called from semctl_down, shmctl_down and msgctl_down.}(hjfghhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjeubj )}(hhh]j)}(hIt: - retrieves the ipc object with the given id in the given table. - performs some audit and permission check, depending on the given cmd - returns a pointer to the ipc object or otherwise, the corresponding error. h](j)}(hIt:h]hIt:}(hj|ghhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjxgubj2)}(hhh]j)}(hhh](j)}(h>retrieves the ipc object with the given id in the given table.h]h)}(hjgh]h>retrieves the ipc object with the given id in the given table.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjgubah}(h]h ]h"]h$]h&]uh1jhjgubj)}(hDperforms some audit and permission check, depending on the given cmdh]h)}(hjgh]hDperforms some audit and permission check, depending on the given cmd}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjgubah}(h]h ]h"]h$]h&]uh1jhjgubj)}(hKreturns a pointer to the ipc object or otherwise, the corresponding error. h]h)}(hJreturns a pointer to the ipc object or otherwise, the corresponding error.h]hJreturns a pointer to the ipc object or otherwise, the corresponding error.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjgubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]jjuh1jhjghMhjgubah}(h]h ]h"]h$]h&]uh1j1hjxgubeh}(h]h ]h"]h$]h&]uh1jhjghMhjugubah}(h]h ]h"]h$]h&]uh1j hjeubh)}(h6Call holding the both the rwsem and the rcu read lock.h]h6Call holding the both the rwsem and the rcu read lock.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjeubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ipc_parse_version (C function)c.ipc_parse_versionhNtauh1hhj2hhhNhNubj)}(hhh](j)}(h int ipc_parse_version (int *cmd)h]j)}(hint ipc_parse_version(int *cmd)h](j )}(hinth]hint}(hj!hhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hj0hhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhhj/hhMubj{)}(hipc_parse_versionh]j)}(hipc_parse_versionh]hipc_parse_version}(hjBhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>hubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhhj/hhMubj)}(h (int *cmd)h]j)}(hint *cmdh](j )}(hinth]hint}(hj^hhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZhubj2)}(h h]h }(hjlhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZhubj)}(hjh]h*}(hjzhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhubj)}(hcmdh]hcmd}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjVhubah}(h]h ]h"]h$]h&]jjuh1jhjhhhhj/hhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhhj/hhMubah}(h]jhah ](jjeh"]h$]h&]jj)jhuh1jhj/hhMhjhhhubj)}(hhh]h)}(hipc call versionh]hipc call version}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjhhhubah}(h]h ]h"]h$]h&]uh1jhjhhhhj/hhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjhjjhjjjuh1jhhhj2hNhNubj)}(h**Parameters** ``int *cmd`` pointer to command **Description** Return IPC_64 for new style IPC and IPC_OLD for old style IPC. The **cmd** value is turned from an encoding command and version into just the command code.h](h)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjhubj )}(hhh]j)}(h ``int *cmd`` pointer to command h](j)}(h ``int *cmd``h]j)}(hjhh]hint *cmd}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjhubj2)}(hhh]h)}(hpointer to commandh]hpointer to command}(hj ihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihMhjiubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhjihMhjhubah}(h]h ]h"]h$]h&]uh1j hjhubh)}(h**Description**h]j)}(hj-ih]h Description}(hj/ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+iubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjhubh)}(hReturn IPC_64 for new style IPC and IPC_OLD for old style IPC. The **cmd** value is turned from an encoding command and version into just the command code.h](hCReturn IPC_64 for new style IPC and IPC_OLD for old style IPC. The }(hjCihhhNhNubj)}(h**cmd**h]hcmd}(hjKihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCiubhQ value is turned from an encoding command and version into just the command code.}(hjCihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j sysvipc_find_ipc (C function)c.sysvipc_find_ipchNtauh1hhj2hhhNhNubj)}(hhh](j)}(hJstruct kern_ipc_perm * sysvipc_find_ipc (struct ipc_ids *ids, loff_t *pos)h]j)}(hHstruct kern_ipc_perm *sysvipc_find_ipc(struct ipc_ids *ids, loff_t *pos)h](j)}(hjAh]hstruct}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjihhhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjihhhjihMubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjimodnameN classnameNj] j` )}jc ]jf )}jY sysvipc_find_ipcsbc.sysvipc_find_ipcasbuh1hhjihhhjihMubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjihhhjihMubj)}(hjh]h*}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjihhhjihMubj{)}(hsysvipc_find_ipch]j)}(hjih]hsysvipc_find_ipc}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjihhhjihMubj)}(h"(struct ipc_ids *ids, loff_t *pos)h](j)}(hstruct ipc_ids *idsh](j)}(hjAh]hstruct}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj2)}(h h]h }(hj jhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiubh)}(hhh]j)}(hipc_idsh]hipc_ids}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjjmodnameN classnameNj] j` )}jc ]jic.sysvipc_find_ipcasbuh1hhjiubj2)}(h h]h }(hj:jhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiubj)}(hjh]h*}(hjHjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj)}(hidsh]hids}(hjUjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjiubj)}(h loff_t *posh](h)}(hhh]j)}(hloff_th]hloff_t}(hjqjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjsjmodnameN classnameNj] j` )}jc ]jic.sysvipc_find_ipcasbuh1hhjjjubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjjubj)}(hjh]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjjubj)}(hposh]hpos}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjiubeh}(h]h ]h"]h$]h&]jjuh1jhjihhhjihMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj|ihhhjihMubah}(h]jwiah ](jjeh"]h$]h&]jj)jhuh1jhjihMhjyihhubj)}(hhh]h)}(h0Find and lock the ipc structure based on seq posh]h0Find and lock the ipc structure based on seq pos}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjjhhubah}(h]h ]h"]h$]h&]uh1jhjyihhhjihMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjjjuh1jhhhj2hNhNubj)}(hX5**Parameters** ``struct ipc_ids *ids`` ipc identifier set ``loff_t *pos`` expected position **Description** The function finds an ipc structure, based on the sequence file position **pos**. If there is no ipc structure at position **pos**, then the successor is selected. If a structure is found, then it is locked (both rcu_read_lock() and ipc_lock_object()) and **pos** is set to the position needed to locate the found ipc structure. If nothing is found (i.e. EOF), **pos** is not modified. The function returns the found ipc structure, or NULL at EOF.h](h)}(h**Parameters**h]j)}(hjjh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjjubj )}(hhh](j)}(h+``struct ipc_ids *ids`` ipc identifier set h](j)}(h``struct ipc_ids *ids``h]j)}(hjkh]hstruct ipc_ids *ids}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjkubj2)}(hhh]h)}(hipc identifier seth]hipc identifier set}(hj.khhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*khMhj+kubah}(h]h ]h"]h$]h&]uh1j1hjkubeh}(h]h ]h"]h$]h&]uh1jhj*khMhj kubj)}(h"``loff_t *pos`` expected position h](j)}(h``loff_t *pos``h]j)}(hjNkh]h loff_t *pos}(hjPkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLkubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjHkubj2)}(hhh]h)}(hexpected positionh]hexpected position}(hjgkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjckhMhjdkubah}(h]h ]h"]h$]h&]uh1j1hjHkubeh}(h]h ]h"]h$]h&]uh1jhjckhMhj kubeh}(h]h ]h"]h$]h&]uh1j hjjubh)}(h**Description**h]j)}(hjkh]h Description}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjjubh)}(hXThe function finds an ipc structure, based on the sequence file position **pos**. If there is no ipc structure at position **pos**, then the successor is selected. If a structure is found, then it is locked (both rcu_read_lock() and ipc_lock_object()) and **pos** is set to the position needed to locate the found ipc structure. If nothing is found (i.e. EOF), **pos** is not modified.h](hIThe function finds an ipc structure, based on the sequence file position }(hjkhhhNhNubj)}(h**pos**h]hpos}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubh+. If there is no ipc structure at position }(hjkhhhNhNubj)}(h**pos**h]hpos}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubh, then the successor is selected. If a structure is found, then it is locked (both rcu_read_lock() and ipc_lock_object()) and }(hjkhhhNhNubj)}(h**pos**h]hpos}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubhb is set to the position needed to locate the found ipc structure. If nothing is found (i.e. EOF), }(hjkhhhNhNubj)}(h**pos**h]hpos}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubh is not modified.}(hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjjubh)}(h=The function returns the found ipc structure, or NULL at EOF.h]h=The function returns the found ipc structure, or NULL at EOF.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhO/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:196: ./ipc/util.chMhjjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubeh}(h] ipc-utilitiesah ]h"] ipc utilitiesah$]h&]uh1hhj2hhhhhKubeh}(h]kernel-ipc-facilitiesah ]h"]kernel ipc facilitiesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h FIFO Bufferh]h FIFO Buffer}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhhhhhKubh)}(hhh](h)}(hkfifo interfaceh]hkfifo interface}(hj0lhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-lhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j DECLARE_KFIFO_PTR (C macro)c.DECLARE_KFIFO_PTRhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hDECLARE_KFIFO_PTRh]j)}(hDECLARE_KFIFO_PTRh]j{)}(hDECLARE_KFIFO_PTRh]j)}(hjQlh]hDECLARE_KFIFO_PTR}(hj[lhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWlubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjSlhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKoubah}(h]h ]h"]h$]h&]jjjuh1jjjhjOlhhhjnlhKoubah}(h]jJlah ](jjeh"]h$]h&]jj)jhuh1jhjnlhKohjLlhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjLlhhhjnlhKoubeh}(h]h ](jmacroeh"]h$]h&]jjjjljjljjjuh1jhhhj-lhNhNubh)}(h"``DECLARE_KFIFO_PTR (fifo, type)``h]j)}(hjlh]hDECLARE_KFIFO_PTR (fifo, type)}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKqhj-lhhubj)}(h'macro to declare a fifo pointer object h]h)}(h¯o to declare a fifo pointer objecth]h¯o to declare a fifo pointer object}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKohjlubah}(h]h ]h"]h$]h&]uh1jhjlhKohj-lhhubj)}(hZ**Parameters** ``fifo`` name of the declared fifo ``type`` type of the fifo elementsh](h)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKshjlubj )}(hhh](j)}(h#``fifo`` name of the declared fifo h](j)}(h``fifo``h]j)}(hjlh]hfifo}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKphjlubj2)}(hhh]h)}(hname of the declared fifoh]hname of the declared fifo}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhKphjlubah}(h]h ]h"]h$]h&]uh1j1hjlubeh}(h]h ]h"]h$]h&]uh1jhjlhKphjlubj)}(h"``type`` type of the fifo elementsh](j)}(h``type``h]j)}(hjmh]htype}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKrhjmubj2)}(hhh]h)}(htype of the fifo elementsh]htype of the fifo elements}(hj3mhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKqhj0mubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhj/mhKrhjlubeh}(h]h ]h"]h$]h&]uh1j hjlubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j DECLARE_KFIFO (C macro)c.DECLARE_KFIFOhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h DECLARE_KFIFOh]j)}(h DECLARE_KFIFOh]j{)}(h DECLARE_KFIFOh]j)}(hjnmh]h DECLARE_KFIFO}(hjxmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtmubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjpmhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKvubah}(h]h ]h"]h$]h&]jjjuh1jjjhjlmhhhjmhKvubah}(h]jgmah ](jjeh"]h$]h&]jj)jhuh1jhjmhKvhjimhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjimhhhjmhKvubeh}(h]h ](jmacroeh"]h$]h&]jjjjmjjmjjjuh1jhhhj-lhNhNubh)}(h$``DECLARE_KFIFO (fifo, type, size)``h]j)}(hjmh]h DECLARE_KFIFO (fifo, type, size)}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKxhj-lhhubj)}(hmacro to declare a fifo object h]h)}(hmacro to declare a fifo objecth]hmacro to declare a fifo object}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKvhjmubah}(h]h ]h"]h$]h&]uh1jhjmhKvhj-lhhubj)}(h**Parameters** ``fifo`` name of the declared fifo ``type`` type of the fifo elements ``size`` the number of elements in the fifo, this must be a power of 2h](h)}(h**Parameters**h]j)}(hjmh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKzhjmubj )}(hhh](j)}(h#``fifo`` name of the declared fifo h](j)}(h``fifo``h]j)}(hjmh]hfifo}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKwhjmubj2)}(hhh]h)}(hname of the declared fifoh]hname of the declared fifo}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhKwhjnubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjnhKwhjmubj)}(h#``type`` type of the fifo elements h](j)}(h``type``h]j)}(hj7nh]htype}(hj9nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5nubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKxhj1nubj2)}(hhh]h)}(htype of the fifo elementsh]htype of the fifo elements}(hjPnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLnhKxhjMnubah}(h]h ]h"]h$]h&]uh1j1hj1nubeh}(h]h ]h"]h$]h&]uh1jhjLnhKxhjmubj)}(hF``size`` the number of elements in the fifo, this must be a power of 2h](j)}(h``size``h]j)}(hjpnh]hsize}(hjrnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnnubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKzhjjnubj2)}(hhh]h)}(h=the number of elements in the fifo, this must be a power of 2h]h=the number of elements in the fifo, this must be a power of 2}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKyhjnubah}(h]h ]h"]h$]h&]uh1j1hjjnubeh}(h]h ]h"]h$]h&]uh1jhjnhKzhjmubeh}(h]h ]h"]h$]h&]uh1j hjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j INIT_KFIFO (C macro) c.INIT_KFIFOhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h INIT_KFIFOh]j)}(h INIT_KFIFOh]j{)}(h INIT_KFIFOh]j)}(hjnh]h INIT_KFIFO}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhK~ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjnhhhjnhK~ubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1jhjnhK~hjnhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjnhhhjnhK~ubeh}(h]h ](jmacroeh"]h$]h&]jjjjnjjnjjjuh1jhhhj-lhNhNubh)}(h``INIT_KFIFO (fifo)``h]j)}(hjoh]hINIT_KFIFO (fifo)}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhj-lhhubj)}(h,Initialize a fifo declared by DECLARE_KFIFO h]h)}(h+Initialize a fifo declared by DECLARE_KFIFOh]h+Initialize a fifo declared by DECLARE_KFIFO}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhK~hjoubah}(h]h ]h"]h$]h&]uh1jhj(ohK~hj-lhhubj)}(h=**Parameters** ``fifo`` name of the declared fifo datatypeh](h)}(h**Parameters**h]j)}(hj5oh]h Parameters}(hj7ohhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3oubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhj/oubj )}(hhh]j)}(h+``fifo`` name of the declared fifo datatypeh](j)}(h``fifo``h]j)}(hjToh]hfifo}(hjVohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRoubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjNoubj2)}(hhh]h)}(h"name of the declared fifo datatypeh]h"name of the declared fifo datatype}(hjmohhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjjoubah}(h]h ]h"]h$]h&]uh1j1hjNoubeh}(h]h ]h"]h$]h&]uh1jhjiohKhjKoubah}(h]h ]h"]h$]h&]uh1j hj/oubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j DEFINE_KFIFO (C macro)c.DEFINE_KFIFOhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h DEFINE_KFIFOh]j)}(h DEFINE_KFIFOh]j{)}(h DEFINE_KFIFOh]j)}(hjoh]h DEFINE_KFIFO}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjohhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjohhhjohKubah}(h]joah ](jjeh"]h$]h&]jj)jhuh1jhjohKhjohhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjohhhjohKubeh}(h]h ](jmacroeh"]h$]h&]jjjjojjojjjuh1jhhhj-lhNhNubh)}(h#``DEFINE_KFIFO (fifo, type, size)``h]j)}(hjoh]hDEFINE_KFIFO (fifo, type, size)}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhj-lhhubj)}(h¯o to define and initialize a fifo h]h)}(h%macro to define and initialize a fifoh]h%macro to define and initialize a fifo}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjoubah}(h]h ]h"]h$]h&]uh1jhj phKhj-lhhubj)}(h**Parameters** ``fifo`` name of the declared fifo datatype ``type`` type of the fifo elements ``size`` the number of elements in the fifo, this must be a power of 2 **Note** the macro can be used for global and local fifo data type variables.h](h)}(h**Parameters**h]j)}(hjph]h Parameters}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjpubj )}(hhh](j)}(h,``fifo`` name of the declared fifo datatype h](j)}(h``fifo``h]j)}(hj8ph]hfifo}(hj:phhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6pubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhj2pubj2)}(hhh]h)}(h"name of the declared fifo datatypeh]h"name of the declared fifo datatype}(hjQphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMphKhjNpubah}(h]h ]h"]h$]h&]uh1j1hj2pubeh}(h]h ]h"]h$]h&]uh1jhjMphKhj/pubj)}(h#``type`` type of the fifo elements h](j)}(h``type``h]j)}(hjqph]htype}(hjsphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjopubaZh}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjkpubj2)}(hhh]h)}(htype of the fifo elementsh]htype of the fifo elements}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphKhjpubah}(h]h ]h"]h$]h&]uh1j1hjkpubeh}(h]h ]h"]h$]h&]uh1jhjphKhj/pubj)}(hG``size`` the number of elements in the fifo, this must be a power of 2 h](j)}(h``size``h]j)}(hjph]hsize}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjpubj2)}(hhh]h)}(h=the number of elements in the fifo, this must be a power of 2h]h=the number of elements in the fifo, this must be a power of 2}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphKhjpubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhjphKhj/pubeh}(h]h ]h"]h$]h&]uh1j hjpubh)}(h**Note**h]j)}(hjph]hNote}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjpubh)}(hDthe macro can be used for global and local fifo data type variables.h]hDthe macro can be used for global and local fifo data type variables.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_initialized (C macro)c.kfifo_initializedhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_initializedh]j)}(hkfifo_initializedh]j{)}(hkfifo_initializedh]j)}(hj$qh]hkfifo_initialized}(hj.qhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*qubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj&qhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhj"qhhhjAqhKubah}(h]jqah ](jjeh"]h$]h&]jj)jhuh1jhjAqhKhjqhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjqhhhjAqhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjZqjjZqjjjuh1jhhhj-lhNhNubh)}(h``kfifo_initialized (fifo)``h]j)}(hj`qh]hkfifo_initialized (fifo)}(hjbqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^qubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhj-lhhubj)}(h!Check if the fifo is initialized h]h)}(h Check if the fifo is initializedh]h Check if the fifo is initialized}(hjzqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjvqubah}(h]h ]h"]h$]h&]uh1jhjqhKhj-lhhubj)}(h**Parameters** ``fifo`` address of the fifo to check **Description** Return ``true`` if fifo is initialized, otherwise ``false``. Assumes the fifo was 0 before.h](h)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjqubj )}(hhh]j)}(h&``fifo`` address of the fifo to check h](j)}(h``fifo``h]j)}(hjqh]hfifo}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjqubj2)}(hhh]h)}(haddress of the fifo to checkh]haddress of the fifo to check}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhKhjqubah}(h]h ]h"]h$]h&]uh1j1hjqubeh}(h]h ]h"]h$]h&]uh1jhjqhKhjqubah}(h]h ]h"]h$]h&]uh1j hjqubh)}(h**Description**h]j)}(hjqh]h Description}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjqubh)}(h[Return ``true`` if fifo is initialized, otherwise ``false``. Assumes the fifo was 0 before.h](hReturn }(hjrhhhNhNubj)}(h``true``h]htrue}(hj rhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubh# if fifo is initialized, otherwise }(hjrhhhNhNubj)}(h ``false``h]hfalse}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubh . Assumes the fifo was 0 before.}(hjrhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjqubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_esize (C macro) c.kfifo_esizehNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_esizeh]j)}(h kfifo_esizeh]j{)}(h kfifo_esizeh]j)}(hjRrh]h kfifo_esize}(hj\rhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXrubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjTrhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjPrhhhjorhKubah}(h]jKrah ](jjeh"]h$]h&]jj)jhuh1jhjorhKhjMrhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjMrhhhjorhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjrjjrjjjuh1jhhhj-lhNhNubh)}(h``kfifo_esize (fifo)``h]j)}(hjrh]hkfifo_esize (fifo)}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhj-lhhubj)}(h4returns the size of the element managed by the fifo h]h)}(h3returns the size of the element managed by the fifoh]h3returns the size of the element managed by the fifo}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjrubah}(h]h ]h"]h$]h&]uh1jhjrhKhj-lhhubj)}(h9**Parameters** ``fifo`` address of the fifo to be usedh](h)}(h**Parameters**h]j)}(hjrh]h Parameters}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjrubj )}(hhh]j)}(h'``fifo`` address of the fifo to be usedh](j)}(h``fifo``h]j)}(hjrh]hfifo}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjrubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjrubah}(h]h ]h"]h$]h&]uh1j1hjrubeh}(h]h ]h"]h$]h&]uh1jhjrhKhjrubah}(h]h ]h"]h$]h&]uh1j hjrubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_recsize (C macro)c.kfifo_recsizehNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_recsizeh]j)}(h kfifo_recsizeh]j{)}(h kfifo_recsizeh]j)}(hj6sh]h kfifo_recsize}(hj@shhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvjj>vjjjuh1jhhhj-lhNhNubh)}(h``kfifo_reset_out (fifo)``h]j)}(hjDvh]hkfifo_reset_out (fifo)}(hjFvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBvubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhj-lhhubj)}(hskip fifo content h]h)}(hskip fifo contenth]hskip fifo content}(hj^vhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjZvubah}(h]h ]h"]h$]h&]uh1jhjlvhKhj-lhhubj)}(hX**Parameters** ``fifo`` address of the fifo to be used **Note** The usage of kfifo_reset_out() is safe until it will be only called from the reader thread and there is only one concurrent reader. Otherwise it is dangerous and must be handled in the same way as kfifo_reset().h](h)}(h**Parameters**h]j)}(hjyvh]h Parameters}(hj{vhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwvubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjsvubj )}(hhh]j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjvh]hfifo}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjvubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhKhjvubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjvhKhjvubah}(h]h ]h"]h$]h&]uh1j hjsvubh)}(h**Note**h]j)}(hjvh]hNote}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjsvubh)}(hThe usage of kfifo_reset_out() is safe until it will be only called from the reader thread and there is only one concurrent reader. Otherwise it is dangerous and must be handled in the same way as kfifo_reset().h]hThe usage of kfifo_reset_out() is safe until it will be only called from the reader thread and there is only one concurrent reader. Otherwise it is dangerous and must be handled in the same way as kfifo_reset().}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjsvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_len (C macro) c.kfifo_lenhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_lenh]j)}(h kfifo_lenh]j{)}(h kfifo_lenh]j)}(hjwh]h kfifo_len}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjwhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjwhhhj/whKubah}(h]j wah ](jjeh"]h$]h&]jj)jhuh1jhj/whKhj whhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj whhhj/whKubeh}(h]h ](jmacroeh"]h$]h&]jjjjHwjjHwjjjuh1jhhhj-lhNhNubh)}(h``kfifo_len (fifo)``h]j)}(hjNwh]hkfifo_len (fifo)}(hjPwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLwubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhj-lhhubj)}(h0returns the number of used elements in the fifo h]h)}(h/returns the number of used elements in the fifoh]h/returns the number of used elements in the fifo}(hjhwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjdwubah}(h]h ]h"]h$]h&]uh1jhjvwhKhj-lhhubj)}(h9**Parameters** ``fifo`` address of the fifo to be usedh](h)}(h**Parameters**h]j)}(hjwh]h Parameters}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhj}wubj )}(hhh]j)}(h'``fifo`` address of the fifo to be usedh](j)}(h``fifo``h]j)}(hjwh]hfifo}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjwubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjwubah}(h]h ]h"]h$]h&]uh1j1hjwubeh}(h]h ]h"]h$]h&]uh1jhjwhKhjwubah}(h]h ]h"]h$]h&]uh1j hj}wubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_is_empty (C macro)c.kfifo_is_emptyhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_is_emptyh]j)}(hkfifo_is_emptyh]j{)}(hkfifo_is_emptyh]j)}(hjwh]hkfifo_is_empty}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjwhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjwhhhjxhKubah}(h]jwah ](jjeh"]h$]h&]jj)jhuh1jhjxhKhjwhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjwhhhjxhKubeh}(h]h ](jmacroeh"]h$]h&]jjjj,xjj,xjjjuh1jhhhj-lhNhNubh)}(h``kfifo_is_empty (fifo)``h]j)}(hj2xh]hkfifo_is_empty (fifo)}(hj4xhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0xubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhj-lhhubj)}(h"returns true if the fifo is empty h]h)}(h!returns true if the fifo is emptyh]h!returns true if the fifo is empty}(hjLxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjHxubah}(h]h ]h"]h$]h&]uh1jhjZxhKhj-lhhubj)}(h9**Parameters** ``fifo`` address of the fifo to be usedh](h)}(h**Parameters**h]j)}(hjgxh]h Parameters}(hjixhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjexubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjaxubj )}(hhh]j)}(h'``fifo`` address of the fifo to be usedh](j)}(h``fifo``h]j)}(hjxh]hfifo}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjxubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhjxubah}(h]h ]h"]h$]h&]uh1j1hjxubeh}(h]h ]h"]h$]h&]uh1jhjxhKhj}xubah}(h]h ]h"]h$]h&]uh1j hjaxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #kfifo_is_empty_spinlocked (C macro)c.kfifo_is_empty_spinlockedhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_is_empty_spinlockedh]j)}(hkfifo_is_empty_spinlockedh]j{)}(hkfifo_is_empty_spinlockedh]j)}(hjxh]hkfifo_is_empty_spinlocked}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjxhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjxhhhjxhKubah}(h]jxah ](jjeh"]h$]h&]jj)jhuh1jhjxhKhjxhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjxhhhjxhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjyjjyjjjuh1jhhhj-lhNhNubh)}(h*``kfifo_is_empty_spinlocked (fifo, lock)``h]j)}(hjyh]h&kfifo_is_empty_spinlocked (fifo, lock)}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(h?returns true if the fifo is empty using a spinlock for locking h]h)}(h>returns true if the fifo is empty using a spinlock for lockingh]h>returns true if the fifo is empty using a spinlock for locking}(hj0yhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhKhj,yubah}(h]h ]h"]h$]h&]uh1jhj>yhKhj-lhhubj)}(he**Parameters** ``fifo`` address of the fifo to be used ``lock`` spinlock to be used for lockingh](h)}(h**Parameters**h]j)}(hjKyh]h Parameters}(hjMyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIyubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjEyubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjjyh]hfifo}(hjlyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhyubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjdyubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhMhjyubah}(h]h ]h"]h$]h&]uh1j1hjdyubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjayubj)}(h(``lock`` spinlock to be used for lockingh](j)}(h``lock``h]j)}(hjyh]hlock}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjyubj2)}(hhh]h)}(hspinlock to be used for lockingh]hspinlock to be used for locking}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjyubah}(h]h ]h"]h$]h&]uh1j1hjyubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjayubeh}(h]h ]h"]h$]h&]uh1j hjEyubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j -kfifo_is_empty_spinlocked_noirqsave (C macro)%c.kfifo_is_empty_spinlocked_noirqsavehNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h#kfifo_is_empty_spinlocked_noirqsaveh]j)}(h#kfifo_is_empty_spinlocked_noirqsaveh]j{)}(h#kfifo_is_empty_spinlocked_noirqsaveh]j)}(hjyh]h#kfifo_is_empty_spinlocked_noirqsave}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjyhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjyhhhjzhMubah}(h]jyah ](jjeh"]h$]h&]jj)jhuh1jhjzhMhjyhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjyhhhjzhMubeh}(h]h ](jmacroeh"]h$]h&]jjjj-zjj-zjjjuh1jhhhj-lhNhNubh)}(h4``kfifo_is_empty_spinlocked_noirqsave (fifo, lock)``h]j)}(hj3zh]h0kfifo_is_empty_spinlocked_noirqsave (fifo, lock)}(hj5zhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1zubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(h[returns true if the fifo is empty using a spinlock for locking, doesn't disable interrupts h]h)}(hZreturns true if the fifo is empty using a spinlock for locking, doesn't disable interruptsh]h\returns true if the fifo is empty using a spinlock for locking, doesn’t disable interrupts}(hjMzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjIzubah}(h]h ]h"]h$]h&]uh1jhj[zhMhj-lhhubj)}(he**Parameters** ``fifo`` address of the fifo to be used ``lock`` spinlock to be used for lockingh](h)}(h**Parameters**h]j)}(hjhzh]h Parameters}(hjjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfzubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjbzubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjzh]hfifo}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjzubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhMhjzubah}(h]h ]h"]h$]h&]uh1j1hjzubeh}(h]h ]h"]h$]h&]uh1jhjzhMhj~zubj)}(h(``lock`` spinlock to be used for lockingh](j)}(h``lock``h]j)}(hjzh]hlock}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjzubj2)}(hhh]h)}(hspinlock to be used for lockingh]hspinlock to be used for locking}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjzubah}(h]h ]h"]h$]h&]uh1j1hjzubeh}(h]h ]h"]h$]h&]uh1jhjzhMhj~zubeh}(h]h ]h"]h$]h&]uh1j hjbzubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_is_full (C macro)c.kfifo_is_fullhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_is_fullh]j)}(h kfifo_is_fullh]j{)}(h kfifo_is_fullh]j)}(hj{h]h kfifo_is_full}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj{hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj{hhhj1{hMubah}(h]j {ah ](jjeh"]h$]h&]jj)jhuh1jhj1{hMhj{hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj{hhhj1{hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjJ{jjJ{jjjuh1jhhhj-lhNhNubh)}(h``kfifo_is_full (fifo)``h]j)}(hjP{h]hkfifo_is_full (fifo)}(hjR{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN{ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM hj-lhhubj)}(h!returns true if the fifo is full h]h)}(h returns true if the fifo is fullh]h returns true if the fifo is full}(hjj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjf{ubah}(h]h ]h"]h$]h&]uh1jhjx{hMhj-lhhubj)}(h9**Parameters** ``fifo`` address of the fifo to be usedh](h)}(h**Parameters**h]j)}(hj{h]h Parameters}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM"hj{ubj )}(hhh]j)}(h'``fifo`` address of the fifo to be usedh](j)}(h``fifo``h]j)}(hj{h]hfifo}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM$hj{ubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj{ubah}(h]h ]h"]h$]h&]uh1j1hj{ubeh}(h]h ]h"]h$]h&]uh1jhj{hM$hj{ubah}(h]h ]h"]h$]h&]uh1j hj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_avail (C macro) c.kfifo_availhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_availh]j)}(h kfifo_availh]j{)}(h kfifo_availh]j)}(hj{h]h kfifo_avail}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj{hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM(ubah}(h]h ]h"]h$]h&]jjjuh1jjjhj{hhhj|hM(ubah}(h]j{ah ](jjeh"]h$]h&]jj)jhuh1jhj|hM(hj{hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj{hhhj|hM(ubeh}(h]h ](jmacroeh"]h$]h&]jjjj.|jj.|jjjuh1jhhhj-lhNhNubh)}(h``kfifo_avail (fifo)``h]j)}(hj4|h]hkfifo_avail (fifo)}(hj6|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2|ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM*hj-lhhubj)}(h2returns the number of unused elements in the fifo h]h)}(h1returns the number of unused elements in the fifoh]h1returns the number of unused elements in the fifo}(hjN|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM(hjJ|ubah}(h]h ]h"]h$]h&]uh1jhj\|hM(hj-lhhubj)}(h9**Parameters** ``fifo`` address of the fifo to be usedh](h)}(h**Parameters**h]j)}(hji|h]h Parameters}(hjk|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg|ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM,hjc|ubj )}(hhh]j)}(h'``fifo`` address of the fifo to be usedh](j)}(h``fifo``h]j)}(hj|h]hfifo}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM.hj|ubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM)hj|ubah}(h]h ]h"]h$]h&]uh1j1hj|ubeh}(h]h ]h"]h$]h&]uh1jhj|hM.hj|ubah}(h]h ]h"]h$]h&]uh1j hjc|ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_skip_count (C macro)c.kfifo_skip_counthNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_skip_counth]j)}(hkfifo_skip_counth]j{)}(hkfifo_skip_counth]j)}(hj|h]hkfifo_skip_count}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj|hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM8ubah}(h]h ]h"]h$]h&]jjjuh1jjjhj|hhhj|hM8ubah}(h]j|ah ](jjeh"]h$]h&]jj)jhuh1jhj|hM8hj|hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj|hhhj|hM8ubeh}(h]h ](jmacroeh"]h$]h&]jjjj}jj}jjjuh1jhhhj-lhNhNubh)}(h"``kfifo_skip_count (fifo, count)``h]j)}(hj}h]hkfifo_skip_count (fifo, count)}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM:hj-lhhubj)}(hskip output data h]h)}(hskip output datah]hskip output data}(hj2}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM8hj.}ubah}(h]h ]h"]h$]h&]uh1jhj@}hM8hj-lhhubj)}(h\**Parameters** ``fifo`` address of the fifo to be used ``count`` count of data to skiph](h)}(h**Parameters**h]j)}(hjM}h]h Parameters}(hjO}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK}ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM<hjG}ubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjl}h]hfifo}(hjn}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj}ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM9hjf}ubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hM9hj}ubah}(h]h ]h"]h$]h&]uh1j1hjf}ubeh}(h]h ]h"]h$]h&]uh1jhj}hM9hjc}ubj)}(h``count`` count of data to skiph](j)}(h ``count``h]j)}(hj}h]hcount}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM;hj}ubj2)}(hhh]h)}(hcount of data to skiph]hcount of data to skip}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM:hj}ubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhj}hM;hjc}ubeh}(h]h ]h"]h$]h&]uh1j hjG}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_skip (C macro) c.kfifo_skiphNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_skiph]j)}(h kfifo_skiph]j{)}(h kfifo_skiph]j)}(hj}h]h kfifo_skip}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj}hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMGubah}(h]h ]h"]h$]h&]jjjuh1jjjhj}hhhj~hMGubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1jhj~hMGhj}hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj}hhhj~hMGubeh}(h]h ](jmacroeh"]h$]h&]jjjj/~jj/~jjjuh1jhhhj-lhNhNubh)}(h``kfifo_skip (fifo)``h]j)}(hj5~h]hkfifo_skip (fifo)}(hj7~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3~ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMIhj-lhhubj)}(hskip output data h]h)}(hskip output datah]hskip output data}(hjO~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMGhjK~ubah}(h]h ]h"]h$]h&]uh1jhj]~hMGhj-lhhubj)}(h9**Parameters** ``fifo`` address of the fifo to be usedh](h)}(h**Parameters**h]j)}(hjj~h]h Parameters}(hjl~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh~ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMKhjd~ubj )}(hhh]j)}(h'``fifo`` address of the fifo to be usedh](j)}(h``fifo``h]j)}(hj~h]hfifo}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMMhj~ubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMHhj~ubah}(h]h ]h"]h$]h&]uh1j1hj~ubeh}(h]h ]h"]h$]h&]uh1jhj~hMMhj~ubah}(h]h ]h"]h$]h&]uh1j hjd~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_peek_len (C macro)c.kfifo_peek_lenhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_peek_lenh]j)}(hkfifo_peek_lenh]j{)}(hkfifo_peek_lenh]j)}(hj~h]hkfifo_peek_len}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj~hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj~hhhj~hMMubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhj~hMMhj~hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj~hhhj~hMMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h``kfifo_peek_len (fifo)``h]j)}(hjh]hkfifo_peek_len (fifo)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMOhj-lhhubj)}(h&gets the size of the next fifo record h]h)}(h%gets the size of the next fifo recordh]h%gets the size of the next fifo record}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMMhj/ubah}(h]h ]h"]h$]h&]uh1jhjAhMMhj-lhhubj)}(h**Parameters** ``fifo`` address of the fifo to be used **Description** This function returns the size of the next fifo record in number of bytes.h](h)}(h**Parameters**h]j)}(hjNh]h Parameters}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMQhjHubj )}(hhh]j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjmh]hfifo}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMNhjgubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMNhjubah}(h]h ]h"]h$]h&]uh1j1hjgubeh}(h]h ]h"]h$]h&]uh1jhjhMNhjdubah}(h]h ]h"]h$]h&]uh1j hjHubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMPhjHubh)}(hJThis function returns the size of the next fifo record in number of bytes.h]hJThis function returns the size of the next fifo record in number of bytes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMOhjHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_alloc (C macro) c.kfifo_allochNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_alloch]j)}(h kfifo_alloch]j{)}(h kfifo_alloch]j)}(hjh]h kfifo_alloc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM^ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM^ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM^hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhM^ubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h&``kfifo_alloc (fifo, size, gfp_mask)``h]j)}(hj#h]h"kfifo_alloc (fifo, size, gfp_mask)}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM`hj-lhhubj)}(h(dynamically allocates a new fifo buffer h]h)}(h'dynamically allocates a new fifo bufferh]h'dynamically allocates a new fifo buffer}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM^hj9ubah}(h]h ]h"]h$]h&]uh1jhjKhM^hj-lhhubj)}(hX**Parameters** ``fifo`` pointer to the fifo ``size`` the number of elements in the fifo, this must be a power of 2 ``gfp_mask`` get_free_pages mask, passed to kmalloc() **Description** This macro dynamically allocates a new fifo buffer. The number of elements will be rounded-up to a power of 2. The fifo will be release with kfifo_free(). Return 0 if no error, otherwise an error code.h](h)}(h**Parameters**h]j)}(hjXh]h Parameters}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMbhjRubj )}(hhh](j)}(h``fifo`` pointer to the fifo h](j)}(h``fifo``h]j)}(hjwh]hfifo}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM_hjqubj2)}(hhh]h)}(hpointer to the fifoh]hpointer to the fifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM_hjubah}(h]h ]h"]h$]h&]uh1j1hjqubeh}(h]h ]h"]h$]h&]uh1jhjhM_hjnubj)}(hG``size`` the number of elements in the fifo, this must be a power of 2 h](j)}(h``size``h]j)}(hjh]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM`hjubj2)}(hhh]h)}(h=the number of elements in the fifo, this must be a power of 2h]h=the number of elements in the fifo, this must be a power of 2}(hjɀhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjŀhM`hjƀubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjŀhM`hjnubj)}(h6``gfp_mask`` get_free_pages mask, passed to kmalloc() h](j)}(h ``gfp_mask``h]j)}(hjh]hgfp_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMahjubj2)}(hhh]h)}(h(get_free_pages mask, passed to kmalloc()h]h(get_free_pages mask, passed to kmalloc()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMahjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMahjnubeh}(h]h ]h"]h$]h&]uh1j hjRubh)}(h**Description**h]j)}(hj$h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMchjRubh)}(h3This macro dynamically allocates a new fifo buffer.h]h3This macro dynamically allocates a new fifo buffer.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMbhjRubh)}(hThe number of elements will be rounded-up to a power of 2. The fifo will be release with kfifo_free(). Return 0 if no error, otherwise an error code.h]hThe number of elements will be rounded-up to a power of 2. The fifo will be release with kfifo_free(). Return 0 if no error, otherwise an error code.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMdhjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_alloc_node (C macro)c.kfifo_alloc_nodehNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_alloc_nodeh]j)}(hkfifo_alloc_nodeh]j{)}(hkfifo_alloc_nodeh]j)}(hjrh]hkfifo_alloc_node}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjthhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMuubah}(h]h ]h"]h$]h&]jjjuh1jjjhjphhhjhMuubah}(h]jkah ](jjeh"]h$]h&]jj)jhuh1jhjhMuhjmhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjmhhhjhMuubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h1``kfifo_alloc_node (fifo, size, gfp_mask, node)``h]j)}(hjh]h-kfifo_alloc_node (fifo, size, gfp_mask, node)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMwhj-lhhubj)}(h7dynamically allocates a new fifo buffer on a NUMA node h]h)}(h6dynamically allocates a new fifo buffer on a NUMA nodeh]h6dynamically allocates a new fifo buffer on a NUMA node}(hjȁhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMuhjāubah}(h]h ]h"]h$]h&]uh1jhjցhMuhj-lhhubj)}(hX**Parameters** ``fifo`` pointer to the fifo ``size`` the number of elements in the fifo, this must be a power of 2 ``gfp_mask`` get_free_pages mask, passed to kmalloc() ``node`` NUMA node to allocate memory on **Description** This macro dynamically allocates a new fifo buffer with NUMA node awareness. The number of elements will be rounded-up to a power of 2. The fifo will be release with kfifo_free(). Return 0 if no error, otherwise an error code.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMyhj݁ubj )}(hhh](j)}(h``fifo`` pointer to the fifo h](j)}(h``fifo``h]j)}(hjh]hfifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMvhjubj2)}(hhh]h)}(hpointer to the fifoh]hpointer to the fifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMvhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMvhjubj)}(hG``size`` the number of elements in the fifo, this must be a power of 2 h](j)}(h``size``h]j)}(hj;h]hsize}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMwhj5ubj2)}(hhh]h)}(h=the number of elements in the fifo, this must be a power of 2h]h=the number of elements in the fifo, this must be a power of 2}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhMwhjQubah}(h]h ]h"]h$]h&]uh1j1hj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhMwhjubj)}(h6``gfp_mask`` get_free_pages mask, passed to kmalloc() h](j)}(h ``gfp_mask``h]j)}(hjth]hgfp_mask}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMxhjnubj2)}(hhh]h)}(h(get_free_pages mask, passed to kmalloc()h]h(get_free_pages mask, passed to kmalloc()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMxhjubah}(h]h ]h"]h$]h&]uh1j1hjnubeh}(h]h ]h"]h$]h&]uh1jhjhMxhjubj)}(h)``node`` NUMA node to allocate memory on h](j)}(h``node``h]j)}(hjh]hnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMyhjubj2)}(hhh]h)}(hNUMA node to allocate memory onh]hNUMA node to allocate memory on}(hjƂhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj‚hMyhjÂubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj‚hMyhjubeh}(h]h ]h"]h$]h&]uh1j hj݁ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM{hj݁ubh)}(hLThis macro dynamically allocates a new fifo buffer with NUMA node awareness.h]hLThis macro dynamically allocates a new fifo buffer with NUMA node awareness.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMzhj݁ubh)}(hThe number of elements will be rounded-up to a power of 2. The fifo will be release with kfifo_free(). Return 0 if no error, otherwise an error code.h]hThe number of elements will be rounded-up to a power of 2. The fifo will be release with kfifo_free(). Return 0 if no error, otherwise an error code.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM|hj݁ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_free (C macro) c.kfifo_freehNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_freeh]j)}(h kfifo_freeh]j{)}(h kfifo_freeh]j)}(hj6h]h kfifo_free}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj8hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj4hhhjShMubah}(h]j/ah ](jjeh"]h$]h&]jj)jhuh1jhjShMhj1hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj1hhhjShMubeh}(h]h ](jmacroeh"]h$]h&]jjjjljjljjjuh1jhhhj-lhNhNubh)}(h``kfifo_free (fifo)``h]j)}(hjrh]hkfifo_free (fifo)}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(hfrees the fifo h]h)}(hfrees the fifoh]hfrees the fifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj-lhhubj)}(h/**Parameters** ``fifo`` the fifo to be freedh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj )}(hhh]j)}(h``fifo`` the fifo to be freedh](j)}(h``fifo``h]j)}(hjƃh]hfifo}(hjȃhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjăubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(hthe fifo to be freedh]hthe fifo to be freed}(hj߃hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj܃ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjۃhMhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_init (C macro) c.kfifo_inithNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_inith]j)}(h kfifo_inith]j{)}(h kfifo_inith]j)}(hjh]h kfifo_init}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj7hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj7hMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj7hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjPjjPjjjuh1jhhhj-lhNhNubh)}(h#``kfifo_init (fifo, buffer, size)``h]j)}(hjVh]hkfifo_init (fifo, buffer, size)}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(h.initialize a fifo using a preallocated buffer h]h)}(h-initialize a fifo using a preallocated bufferh]h-initialize a fifo using a preallocated buffer}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjlubah}(h]h ]h"]h$]h&]uh1jhj~hMhj-lhhubj)}(hXk**Parameters** ``fifo`` the fifo to assign the buffer ``buffer`` the preallocated buffer to be used ``size`` the size of the internal buffer, this have to be a power of 2 **Description** This macro initializes a fifo using a preallocated buffer. The number of elements will be rounded-up to a power of 2. Return 0 if no error, otherwise an error code.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj )}(hhh](j)}(h'``fifo`` the fifo to assign the buffer h](j)}(h``fifo``h]j)}(hjh]hfifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(hthe fifo to assign the bufferh]hthe fifo to assign the buffer}(hjÄhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h.``buffer`` the preallocated buffer to be used h](j)}(h ``buffer``h]j)}(hjh]hbuffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj݄ubj2)}(hhh]h)}(h"the preallocated buffer to be usedh]h"the preallocated buffer to be used}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj݄ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hG``size`` the size of the internal buffer, this have to be a power of 2 h](j)}(h``size``h]j)}(hjh]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(h=the size of the internal buffer, this have to be a power of 2h]h=the size of the internal buffer, this have to be a power of 2}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj2ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj1hMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjWh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubh)}(h:This macro initializes a fifo using a preallocated buffer.h]h:This macro initializes a fifo using a preallocated buffer.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubh)}(hiThe number of elements will be rounded-up to a power of 2. Return 0 if no error, otherwise an error code.h]hiThe number of elements will be rounded-up to a power of 2. Return 0 if no error, otherwise an error code.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_put (C macro) c.kfifo_puthNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_puth]j)}(h kfifo_puth]j{)}(h kfifo_puth]j)}(hjh]h kfifo_put}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj…hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj…hMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj…hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjۅjjۅjjjuh1jhhhj-lhNhNubh)}(h``kfifo_put (fifo, val)``h]j)}(hjh]hkfifo_put (fifo, val)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj߅ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(hput data into the fifo h]h)}(hput data into the fifoh]hput data into the fifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubah}(h]h ]h"]h$]h&]uh1jhj hMhj-lhhubj)}(hXj**Parameters** ``fifo`` address of the fifo to be used ``val`` the data to be added **Description** This macro copies the given value into the fifo. It returns 0 if the fifo was full. Otherwise it returns the number processed elements. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hj5h]hfifo}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj/ubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMhjKubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhjJhMhj,ubj)}(h``val`` the data to be added h](j)}(h``val``h]j)}(hjnh]hval}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjhubj2)}(hhh]h)}(hthe data to be addedh]hthe data to be added}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhjhMhj,ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubh)}(hThis macro copies the given value into the fifo. It returns 0 if the fifo was full. Otherwise it returns the number processed elements.h]hThis macro copies the given value into the fifo. It returns 0 if the fifo was full. Otherwise it returns the number processed elements.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubh)}(huNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h]hwNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macro.}(hjΆhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_get (C macro) c.kfifo_gethNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_geth]j)}(h kfifo_geth]j{)}(h kfifo_geth]j)}(hjh]h kfifo_get}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjj-jj-jjjuh1jhhhj-lhNhNubh)}(h``kfifo_get (fifo, val)``h]j)}(hj3h]hkfifo_get (fifo, val)}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(hget data from the fifo h]h)}(hget data from the fifoh]hget data from the fifo}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjIubah}(h]h ]h"]h$]h&]uh1jhj[hMhj-lhhubj)}(hXn**Parameters** ``fifo`` address of the fifo to be used ``val`` address where to store the data **Description** This macro reads the data from the fifo. It returns 0 if the fifo was empty. Otherwise it returns the number processed elements. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h](h)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjbubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjh]hfifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj~ubj)}(h(``val`` address where to store the data h](j)}(h``val``h]j)}(hjh]hval}(hj‡hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(haddress where to store the datah]haddress where to store the data}(hjهhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjՇhMhjևubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjՇhMhj~ubeh}(h]h ]h"]h$]h&]uh1j hjbubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjbubh)}(hThis macro reads the data from the fifo. It returns 0 if the fifo was empty. Otherwise it returns the number processed elements.h]hThis macro reads the data from the fifo. It returns 0 if the fifo was empty. Otherwise it returns the number processed elements.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjbubh)}(huNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h]hwNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macro.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_peek (C macro) c.kfifo_peekhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_peekh]j)}(h kfifo_peekh]j{)}(h kfifo_peekh]j)}(hjIh]h kfifo_peek}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjKhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjGhhhjfhMubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jhjfhMhjDhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjDhhhjfhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h``kfifo_peek (fifo, val)``h]j)}(hjh]hkfifo_peek (fifo, val)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(h(get data from the fifo without removing h]h)}(h'get data from the fifo without removingh]h'get data from the fifo without removing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj-lhhubj)}(hX**Parameters** ``fifo`` address of the fifo to be used ``val`` address where to store the data **Description** This reads the data from the fifo without removing it from the fifo. It returns 0 if the fifo was empty. Otherwise it returns the number processed elements. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjوh]hfifo}(hjۈhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj׈ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjӈubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjӈubeh}(h]h ]h"]h$]h&]uh1jhjhMhjЈubj)}(h(``val`` address where to store the data h](j)}(h``val``h]j)}(hjh]hval}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj ubj2)}(hhh]h)}(haddress where to store the datah]haddress where to store the data}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hMhj(ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj'hMhjЈubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjMh]h Description}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubh)}(hThis reads the data from the fifo without removing it from the fifo. It returns 0 if the fifo was empty. Otherwise it returns the number processed elements.h]hThis reads the data from the fifo without removing it from the fifo. It returns 0 if the fifo was empty. Otherwise it returns the number processed elements.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubh)}(huNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h]hwNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macro.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_in (C macro) c.kfifo_inhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_inh]j)}(hkfifo_inh]j{)}(hkfifo_inh]j)}(hjh]hkfifo_in}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjщjjщjjjuh1jhhhj-lhNhNubh)}(h``kfifo_in (fifo, buf, n)``h]j)}(hj׉h]hkfifo_in (fifo, buf, n)}(hjىhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjՉubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM!hj-lhhubj)}(hput data into the fifo h]h)}(hput data into the fifoh]hput data into the fifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj-lhhubj)}(hXf**Parameters** ``fifo`` address of the fifo to be used ``buf`` the data to be added ``n`` number of elements to be added **Description** This macro copies the given buffer into the fifo and returns the number of copied elements. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM#hjubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hj+h]hfifo}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM hj%ubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hM hjAubah}(h]h ]h"]h$]h&]uh1j1hj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hM hj"ubj)}(h``buf`` the data to be added h](j)}(h``buf``h]j)}(hjdh]hbuf}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM!hj^ubj2)}(hhh]h)}(hthe data to be addedh]hthe data to be added}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhM!hjzubah}(h]h ]h"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhM!hj"ubj)}(h%``n`` number of elements to be added h](j)}(h``n``h]j)}(hjh]hn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM"hjubj2)}(hhh]h)}(hnumber of elements to be addedh]hnumber of elements to be added}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM"hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM"hj"ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj؊h]h Description}(hjڊhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj֊ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM$hjubh)}(h[This macro copies the given buffer into the fifo and returns the number of copied elements.h]h[This macro copies the given buffer into the fifo and returns the number of copied elements.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM#hjubh)}(huNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h]hwNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macro.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM&hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_in_spinlocked (C macro)c.kfifo_in_spinlockedhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_in_spinlockedh]j)}(hkfifo_in_spinlockedh]j{)}(hkfifo_in_spinlockedh]j)}(hj&h]hkfifo_in_spinlocked}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj(hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM7ubah}(h]h ]h"]h$]h&]jjjuh1jjjhj$hhhjChM7ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjChM7hj!hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj!hhhjChM7ubeh}(h]h ](jmacroeh"]h$]h&]jjjj\jj\jjjuh1jhhhj-lhNhNubh)}(h,``kfifo_in_spinlocked (fifo, buf, n, lock)``h]j)}(hjbh]h(kfifo_in_spinlocked (fifo, buf, n, lock)}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM9hj-lhhubj)}(h4put data into the fifo using a spinlock for locking h]h)}(h3put data into the fifo using a spinlock for lockingh]h3put data into the fifo using a spinlock for locking}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM7hjxubah}(h]h ]h"]h$]h&]uh1jhjhM7hj-lhhubj)}(hX-**Parameters** ``fifo`` address of the fifo to be used ``buf`` the data to be added ``n`` number of elements to be added ``lock`` pointer to the spinlock to use for locking **Description** This macro copies the given values buffer into the fifo and returns the number of copied elements.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM;hjubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjh]hfifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM8hjubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjϋhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjˋhM8hj̋ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjˋhM8hjubj)}(h``buf`` the data to be added h](j)}(h``buf``h]j)}(hjh]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM9hjubj2)}(hhh]h)}(hthe data to be addedh]hthe data to be added}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM9hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM9hjubj)}(h%``n`` number of elements to be added h](j)}(h``n``h]j)}(hj(h]hn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM:hj"ubj2)}(hhh]h)}(hnumber of elements to be addedh]hnumber of elements to be added}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM:hj>ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hM:hjubj)}(h4``lock`` pointer to the spinlock to use for locking h](j)}(h``lock``h]j)}(hjah]hlock}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM;hj[ubj2)}(hhh]h)}(h*pointer to the spinlock to use for lockingh]h*pointer to the spinlock to use for locking}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhM;hjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhM;hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM=hjubh)}(hbThis macro copies the given values buffer into the fifo and returns the number of copied elements.h]hbThis macro copies the given values buffer into the fifo and returns the number of copied elements.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM<hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'kfifo_in_spinlocked_noirqsave (C macro)c.kfifo_in_spinlocked_noirqsavehNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_in_spinlocked_noirqsaveh]j)}(hkfifo_in_spinlocked_noirqsaveh]j{)}(hkfifo_in_spinlocked_noirqsaveh]j)}(hjیh]hkfifo_in_spinlocked_noirqsave}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj݌hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjٌhhhjhMKubah}(h]jԌah ](jjeh"]h$]h&]jj)jhuh1jhjhMKhj֌hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj֌hhhjhMKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h6``kfifo_in_spinlocked_noirqsave (fifo, buf, n, lock)``h]j)}(hjh]h2kfifo_in_spinlocked_noirqsave (fifo, buf, n, lock)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMMhj-lhhubj)}(hJput data into fifo using a spinlock for locking, don't disable interrupts h]h)}(hIput data into fifo using a spinlock for locking, don't disable interruptsh]hKput data into fifo using a spinlock for locking, don’t disable interrupts}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMKhj-ubah}(h]h ]h"]h$]h&]uh1jhj?hMKhj-lhhubj)}(hX=**Parameters** ``fifo`` address of the fifo to be used ``buf`` the data to be added ``n`` number of elements to be added ``lock`` pointer to the spinlock to use for locking **Description** This is a variant of kfifo_in_spinlocked() but uses spin_lock/unlock() for locking and doesn't disable interrupts.h](h)}(h**Parameters**h]j)}(hjLh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMOhjFubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjkh]hfifo}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMMhjeubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMMhjubah}(h]h ]h"]h$]h&]uh1j1hjeubeh}(h]h ]h"]h$]h&]uh1jhjhMMhjbubj)}(h``buf`` the data to be added h](j)}(h``buf``h]j)}(hjh]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMNhjubj2)}(hhh]h)}(hthe data to be addedh]hthe data to be added}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMNhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMNhjbubj)}(h%``n`` number of elements to be added h](j)}(h``n``h]j)}(hjݍh]hn}(hjߍhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjۍubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMOhj׍ubj2)}(hhh]h)}(hnumber of elements to be addedh]hnumber of elements to be added}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMOhjubah}(h]h ]h"]h$]h&]uh1j1hj׍ubeh}(h]h ]h"]h$]h&]uh1jhjhMOhjbubj)}(h4``lock`` pointer to the spinlock to use for locking h](j)}(h``lock``h]j)}(hjh]hlock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMPhjubj2)}(hhh]h)}(h*pointer to the spinlock to use for lockingh]h*pointer to the spinlock to use for locking}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMPhj,ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj+hMPhjbubeh}(h]h ]h"]h$]h&]uh1j hjFubh)}(h**Description**h]j)}(hjQh]h Description}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMRhjFubh)}(hrThis is a variant of kfifo_in_spinlocked() but uses spin_lock/unlock() for locking and doesn't disable interrupts.h]htThis is a variant of kfifo_in_spinlocked() but uses spin_lock/unlock() for locking and doesn’t disable interrupts.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMQhjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_out (C macro) c.kfifo_outhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_outh]j)}(h kfifo_outh]j{)}(h kfifo_outh]j)}(hjh]h kfifo_out}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMcubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMcubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMchjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMcubeh}(h]h ](jmacroeh"]h$]h&]jjjjƎjjƎjjjuh1jhhhj-lhNhNubh)}(h``kfifo_out (fifo, buf, n)``h]j)}(hj̎h]hkfifo_out (fifo, buf, n)}(hjΎhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjʎubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMehj-lhhubj)}(hget data from the fifo h]h)}(hget data from the fifoh]hget data from the fifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMchjubah}(h]h ]h"]h$]h&]uh1jhjhMchj-lhhubj)}(hXg**Parameters** ``fifo`` address of the fifo to be used ``buf`` pointer to the storage buffer ``n`` max. number of elements to get **Description** This macro gets some data from the fifo and returns the numbers of elements copied. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMghjubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hj h]hfifo}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMdhjubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMdhj6ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj5hMdhjubj)}(h&``buf`` pointer to the storage buffer h](j)}(h``buf``h]j)}(hjYh]hbuf}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMehjSubj2)}(hhh]h)}(hpointer to the storage bufferh]hpointer to the storage buffer}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhMehjoubah}(h]h ]h"]h$]h&]uh1j1hjSubeh}(h]h ]h"]h$]h&]uh1jhjnhMehjubj)}(h%``n`` max. number of elements to get h](j)}(h``n``h]j)}(hjh]hn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMfhjubj2)}(hhh]h)}(hmax. number of elements to geth]hmax. number of elements to get}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMfhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMfhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj͏h]h Description}(hjϏhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjˏubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhhjubh)}(hSThis macro gets some data from the fifo and returns the numbers of elements copied.h]hSThis macro gets some data from the fifo and returns the numbers of elements copied.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMghjubh)}(huNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h]hwNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macro.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMjhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_out_spinlocked (C macro)c.kfifo_out_spinlockedhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_out_spinlockedh]j)}(hkfifo_out_spinlockedh]j{)}(hkfifo_out_spinlockedh]j)}(hjh]hkfifo_out_spinlocked}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM}ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj8hM}ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj8hM}hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj8hM}ubeh}(h]h ](jmacroeh"]h$]h&]jjjjQjjQjjjuh1jhhhj-lhNhNubh)}(h-``kfifo_out_spinlocked (fifo, buf, n, lock)``h]j)}(hjWh]h)kfifo_out_spinlocked (fifo, buf, n, lock)}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(h4get data from the fifo using a spinlock for locking h]h)}(h3get data from the fifo using a spinlock for lockingh]h3get data from the fifo using a spinlock for locking}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM}hjmubah}(h]h ]h"]h$]h&]uh1jhjhM}hj-lhhubj)}(hX&**Parameters** ``fifo`` address of the fifo to be used ``buf`` pointer to the storage buffer ``n`` max. number of elements to get ``lock`` pointer to the spinlock to use for locking **Description** This macro gets the data from the fifo and returns the numbers of elements copied.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjh]hfifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM~hjubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjĐhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM~hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM~hjubj)}(h&``buf`` pointer to the storage buffer h](j)}(h``buf``h]j)}(hjh]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjސubj2)}(hhh]h)}(hpointer to the storage bufferh]hpointer to the storage buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjސubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h%``n`` max. number of elements to get h](j)}(h``n``h]j)}(hjh]hn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(hmax. number of elements to geth]hmax. number of elements to get}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj3ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj2hMhjubj)}(h4``lock`` pointer to the spinlock to use for locking h](j)}(h``lock``h]j)}(hjVh]hlock}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjPubj2)}(hhh]h)}(h*pointer to the spinlock to use for lockingh]h*pointer to the spinlock to use for locking}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMhjlubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhjkhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubh)}(hRThis macro gets the data from the fifo and returns the numbers of elements copied.h]hRThis macro gets the data from the fifo and returns the numbers of elements copied.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (kfifo_out_spinlocked_noirqsave (C macro) c.kfifo_out_spinlocked_noirqsavehNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_out_spinlocked_noirqsaveh]j)}(hkfifo_out_spinlocked_noirqsaveh]j{)}(hkfifo_out_spinlocked_noirqsaveh]j)}(hjБh]hkfifo_out_spinlocked_noirqsave}(hjڑhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֑ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjґhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjΑhhhjhMubah}(h]jɑah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjˑhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjˑhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h7``kfifo_out_spinlocked_noirqsave (fifo, buf, n, lock)``h]j)}(hj h]h3kfifo_out_spinlocked_noirqsave (fifo, buf, n, lock)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(hNget data from the fifo using a spinlock for locking, don't disable interrupts h]h)}(hMget data from the fifo using a spinlock for locking, don't disable interruptsh]hOget data from the fifo using a spinlock for locking, don’t disable interrupts}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj"ubah}(h]h ]h"]h$]h&]uh1jhj4hMhj-lhhubj)}(hXI**Parameters** ``fifo`` address of the fifo to be used ``buf`` pointer to the storage buffer ``n`` max. number of elements to get ``lock`` pointer to the spinlock to use for locking **Description** This is a variant of kfifo_out_spinlocked() which uses spin_lock/unlock() for locking and doesn't disable interrupts.h](h)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj;ubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hj`h]hfifo}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjZubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhMhjvubah}(h]h ]h"]h$]h&]uh1j1hjZubeh}(h]h ]h"]h$]h&]uh1jhjuhMhjWubj)}(h&``buf`` pointer to the storage buffer h](j)}(h``buf``h]j)}(hjh]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(hpointer to the storage bufferh]hpointer to the storage buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjWubj)}(h%``n`` max. number of elements to get h](j)}(h``n``h]j)}(hjҒh]hn}(hjԒhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjВubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj̒ubj2)}(hhh]h)}(hmax. number of elements to geth]hmax. number of elements to get}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj̒ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjWubj)}(h4``lock`` pointer to the spinlock to use for locking h](j)}(h``lock``h]j)}(hj h]hlock}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(h*pointer to the spinlock to use for lockingh]h*pointer to the spinlock to use for locking}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj!ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjWubeh}(h]h ]h"]h$]h&]uh1j hj;ubh)}(h**Description**h]j)}(hjFh]h Description}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj;ubh)}(huThis is a variant of kfifo_out_spinlocked() which uses spin_lock/unlock() for locking and doesn't disable interrupts.h]hwThis is a variant of kfifo_out_spinlocked() which uses spin_lock/unlock() for locking and doesn’t disable interrupts.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_from_user (C macro)c.kfifo_from_userhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_from_userh]j)}(hkfifo_from_userh]j{)}(hkfifo_from_userh]j)}(hjh]hkfifo_from_user}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h-``kfifo_from_user (fifo, from, len, copied)``h]j)}(hjh]h)kfifo_from_user (fifo, from, len, copied)}(hjÓhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(h-puts some data from user space into the fifo h]h)}(h,puts some data from user space into the fifoh]h,puts some data from user space into the fifo}(hjۓhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjדubah}(h]h ]h"]h$]h&]uh1jhjhMhj-lhhubj)}(hX**Parameters** ``fifo`` address of the fifo to be used ``from`` pointer to the data to be added ``len`` the length of the data to be added ``copied`` pointer to output variable to store the number of copied bytes **Description** This macro copies at most **len** bytes from the **from** into the fifo, depending of the available space and returns -EFAULT/0. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjh]hfifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj+ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj ubj)}(h)``from`` pointer to the data to be added h](j)}(h``from``h]j)}(hjNh]hfrom}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjHubj2)}(hhh]h)}(hpointer to the data to be addedh]hpointer to the data to be added}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMhjdubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjchMhj ubj)}(h+``len`` the length of the data to be added h](j)}(h``len``h]j)}(hjh]hlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(h"the length of the data to be addedh]h"the length of the data to be added}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hJ``copied`` pointer to output variable to store the number of copied bytes h](j)}(h ``copied``h]j)}(hjh]hcopied}(hj”hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(h>pointer to output variable to store the number of copied bytesh]h>pointer to output variable to store the number of copied bytes}(hjٔhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjՔhMhj֔ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjՔhMhj ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubh)}(hThis macro copies at most **len** bytes from the **from** into the fifo, depending of the available space and returns -EFAULT/0.h](hThis macro copies at most }(hjhhhNhNubj)}(h**len**h]hlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh bytes from the }(hjhhhNhNubj)}(h**from**h]hfrom}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhG into the fifo, depending of the available space and returns -EFAULT/0.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubh)}(huNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h]hwNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macro.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_to_user (C macro)c.kfifo_to_userhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(h kfifo_to_userh]j)}(h kfifo_to_userh]j{)}(h kfifo_to_userh]j)}(hjmh]h kfifo_to_user}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjohhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjkhhhjhMubah}(h]jfah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h)``kfifo_to_user (fifo, to, len, copied)``h]j)}(hjh]h%kfifo_to_user (fifo, to, len, copied)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(h*copies data from the fifo into user space h]h)}(h)copies data from the fifo into user spaceh]h)copies data from the fifo into user space}(hjÕhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjѕhMhj-lhhubj)}(hX**Parameters** ``fifo`` address of the fifo to be used ``to`` where the data must be copied ``len`` the size of the destination buffer ``copied`` pointer to output variable to store the number of copied bytes **Description** This macro copies at most **len** bytes from the fifo into the **to** buffer and returns -EFAULT/0. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h](h)}(h**Parameters**h]j)}(hjޕh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjܕubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjؕubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjh]hfifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h%``to`` where the data must be copied h](j)}(h``to``h]j)}(hj6h]hto}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj0ubj2)}(hhh]h)}(hwhere the data must be copiedh]hwhere the data must be copied}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMhjLubah}(h]h ]h"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]uh1jhjKhMhjubj)}(h+``len`` the size of the destination buffer h](j)}(h``len``h]j)}(hjoh]hlen}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjiubj2)}(hhh]h)}(h"the size of the destination bufferh]h"the size of the destination buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjiubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hJ``copied`` pointer to output variable to store the number of copied bytes h](j)}(h ``copied``h]j)}(hjh]hcopied}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(h>pointer to output variable to store the number of copied bytesh]h>pointer to output variable to store the number of copied bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjؕubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjؕubh)}(hcThis macro copies at most **len** bytes from the fifo into the **to** buffer and returns -EFAULT/0.h](hThis macro copies at most }(hjhhhNhNubj)}(h**len**h]hlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh bytes from the fifo into the }(hjhhhNhNubj)}(h**to**h]hto}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh buffer and returns -EFAULT/0.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjؕubh)}(huNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h]hwNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macro.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjؕubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %kfifo_dma_in_prepare_mapped (C macro)c.kfifo_dma_in_prepare_mappedhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_dma_in_prepare_mappedh]j)}(hkfifo_dma_in_prepare_mappedh]j{)}(hkfifo_dma_in_prepare_mappedh]j)}(hjUh]hkfifo_dma_in_prepare_mapped}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjWhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjShhhjrhMubah}(h]jNah ](jjeh"]h$]h&]jj)jhuh1jhjrhMhjPhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjPhhhjrhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h<``kfifo_dma_in_prepare_mapped (fifo, sgl, nents, len, dma)``h]j)}(hjh]h8kfifo_dma_in_prepare_mapped (fifo, sgl, nents, len, dma)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(h"setup a scatterlist for DMA input h]h)}(h!setup a scatterlist for DMA inputh]h!setup a scatterlist for DMA input}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj-lhhubj)}(hX**Parameters** ``fifo`` address of the fifo to be used ``sgl`` pointer to the scatterlist array ``nents`` number of entries in the scatterlist array ``len`` number of elements to transfer ``dma`` mapped dma address to fill into **sgl** **Description** This macro fills a scatterlist for DMA input. It returns the number entries in the scatterlist array. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macros.h](h)}(h**Parameters**h]j)}(hjƗh]h Parameters}(hjȗhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjėubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjh]hfifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjߗubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjߗubeh}(h]h ]h"]h$]h&]uh1jhjhMhjܗubj)}(h)``sgl`` pointer to the scatterlist array h](j)}(h``sgl``h]j)}(hjh]hsgl}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(h pointer to the scatterlist arrayh]h pointer to the scatterlist array}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj4ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj3hMhjܗubj)}(h5``nents`` number of entries in the scatterlist array h](j)}(h ``nents``h]j)}(hjWh]hnents}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjQubj2)}(hhh]h)}(h*number of entries in the scatterlist arrayh]h*number of entries in the scatterlist array}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhMhjmubah}(h]h ]h"]h$]h&]uh1j1hjQubeh}(h]h ]h"]h$]h&]uh1jhjlhMhjܗubj)}(h'``len`` number of elements to transfer h](j)}(h``len``h]j)}(hjh]hlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(hnumber of elements to transferh]hnumber of elements to transfer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjܗubj)}(h0``dma`` mapped dma address to fill into **sgl** h](j)}(h``dma``h]j)}(hjɘh]hdma}(hj˘hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjǘubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjØubj2)}(hhh]h)}(h'mapped dma address to fill into **sgl**h](h mapped dma address to fill into }(hjhhhNhNubj)}(h**sgl**h]hsgl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhjޘhMhjߘubah}(h]h ]h"]h$]h&]uh1j1hjØubeh}(h]h ]h"]h$]h&]uh1jhjޘhMhjܗubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubh)}(heThis macro fills a scatterlist for DMA input. It returns the number entries in the scatterlist array.h]heThis macro fills a scatterlist for DMA input. It returns the number entries in the scatterlist array.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubh)}(hvNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macros.h]hxNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macros.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_dma_in_finish (C macro)c.kfifo_dma_in_finishhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_dma_in_finishh]j)}(hkfifo_dma_in_finishh]j{)}(hkfifo_dma_in_finishh]j)}(hj`h]hkfifo_dma_in_finish}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjbhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj^hhhj}hMubah}(h]jYah ](jjeh"]h$]h&]jj)jhuh1jhj}hMhj[hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj[hhhj}hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h#``kfifo_dma_in_finish (fifo, len)``h]j)}(hjh]hkfifo_dma_in_finish (fifo, len)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(hfinish a DMA IN operation h]h)}(hfinish a DMA IN operationh]hfinish a DMA IN operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjęhMhj-lhhubj)}(hXg**Parameters** ``fifo`` address of the fifo to be used ``len`` number of bytes to received **Description** This macro finishes a DMA IN operation. The in counter will be updated by the len parameter. No error checking will be done. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macros.h](h)}(h**Parameters**h]j)}(hjљh]h Parameters}(hjәhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjϙubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj˙ubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjh]hfifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h$``len`` number of bytes to received h](j)}(h``len``h]j)}(hj)h]hlen}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj#ubj2)}(hhh]h)}(hnumber of bytes to receivedh]hnumber of bytes to received}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj?ubah}(h]h ]h"]h$]h&]uh1j1hj#ubeh}(h]h ]h"]h$]h&]uh1jhj>hMhjubeh}(h]h ]h"]h$]h&]uh1j hj˙ubh)}(h**Description**h]j)}(hjdh]h Description}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj˙ubh)}(h|This macro finishes a DMA IN operation. The in counter will be updated by the len parameter. No error checking will be done.h]h|This macro finishes a DMA IN operation. The in counter will be updated by the len parameter. No error checking will be done.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj˙ubh)}(hvNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macros.h]hxNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macros.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM hj˙ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &kfifo_dma_out_prepare_mapped (C macro)c.kfifo_dma_out_prepare_mappedhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_dma_out_prepare_mappedh]j)}(hkfifo_dma_out_prepare_mappedh]j{)}(hkfifo_dma_out_prepare_mappedh]j)}(hjh]hkfifo_dma_out_prepare_mapped}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjϚhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjϚhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjϚhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h=``kfifo_dma_out_prepare_mapped (fifo, sgl, nents, len, dma)``h]j)}(hjh]h9kfifo_dma_out_prepare_mapped (fifo, sgl, nents, len, dma)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(h#setup a scatterlist for DMA output h]h)}(h"setup a scatterlist for DMA outputh]h"setup a scatterlist for DMA output}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj-lhhubj)}(hX_**Parameters** ``fifo`` address of the fifo to be used ``sgl`` pointer to the scatterlist array ``nents`` number of entries in the scatterlist array ``len`` number of elements to transfer ``dma`` mapped dma address to fill into **sgl** **Description** This macro fills a scatterlist for DMA output which at most **len** bytes to transfer. It returns the number entries in the scatterlist array. A zero means there is no space available and the scatterlist is not filled. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macros.h](h)}(h**Parameters**h]j)}(hj#h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjBh]hfifo}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj<ubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMhjXubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhjWhMhj9ubj)}(h)``sgl`` pointer to the scatterlist array h](j)}(h``sgl``h]j)}(hj{h]hsgl}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjuubj2)}(hhh]h)}(h pointer to the scatterlist arrayh]h pointer to the scatterlist array}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjhMhj9ubj)}(h5``nents`` number of entries in the scatterlist array h](j)}(h ``nents``h]j)}(hjh]hnents}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(h*number of entries in the scatterlist arrayh]h*number of entries in the scatterlist array}(hj͛hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjɛhMhjʛubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjɛhMhj9ubj)}(h'``len`` number of elements to transfer h](j)}(h``len``h]j)}(hjh]hlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(hnumber of elements to transferh]hnumber of elements to transfer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj9ubj)}(h0``dma`` mapped dma address to fill into **sgl** h](j)}(h``dma``h]j)}(hj&h]hdma}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM hj ubj2)}(hhh]h)}(h'mapped dma address to fill into **sgl**h](h mapped dma address to fill into }(hj?hhhNhNubj)}(h**sgl**h]hsgl}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1hhj;hM hj<ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj;hM hj9ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjoh]h Description}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM"hjubh)}(hThis macro fills a scatterlist for DMA output which at most **len** bytes to transfer. It returns the number entries in the scatterlist array. A zero means there is no space available and the scatterlist is not filled.h](hhj-lhhubj)}(hfinish a DMA OUT operation h]h)}(hfinish a DMA OUT operationh]hfinish a DMA OUT operation}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM<hj!ubah}(h]h ]h"]h$]h&]uh1jhj3hM<hj-lhhubj)}(hXi**Parameters** ``fifo`` address of the fifo to be used ``len`` number of bytes transferred **Description** This macro finishes a DMA OUT operation. The out counter will be updated by the len parameter. No error checking will be done. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macros.h](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM@hj:ubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hj_h]hfifo}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM=hjYubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthM=hjuubah}(h]h ]h"]h$]h&]uh1j1hjYubeh}(h]h ]h"]h$]h&]uh1jhjthM=hjVubj)}(h$``len`` number of bytes transferred h](j)}(h``len``h]j)}(hjh]hlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM>hjubj2)}(hhh]h)}(hnumber of bytes transferredh]hnumber of bytes transferred}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM>hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM>hjVubeh}(h]h ]h"]h$]h&]uh1j hj:ubh)}(h**Description**h]j)}(hjӝh]h Description}(hj՝hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjѝubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM@hj:ubh)}(h~This macro finishes a DMA OUT operation. The out counter will be updated by the len parameter. No error checking will be done.h]h~This macro finishes a DMA OUT operation. The out counter will be updated by the len parameter. No error checking will be done.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhM?hj:ubh)}(hvNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macros.h]hxNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macros.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMBhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_out_peek (C macro)c.kfifo_out_peekhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_out_peekh]j)}(hkfifo_out_peekh]j{)}(hkfifo_out_peekh]j)}(hj!h]hkfifo_out_peek}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj#hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMLubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj>hMLubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj>hMLhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj>hMLubeh}(h]h ](jmacroeh"]h$]h&]jjjjWjjWjjjuh1jhhhj-lhNhNubh)}(h!``kfifo_out_peek (fifo, buf, n)``h]j)}(hj]h]hkfifo_out_peek (fifo, buf, n)}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMNhj-lhhubj)}(hgets some data from the fifo h]h)}(hgets some data from the fifoh]hgets some data from the fifo}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMLhjsubah}(h]h ]h"]h$]h&]uh1jhjhMLhj-lhhubj)}(hX**Parameters** ``fifo`` address of the fifo to be used ``buf`` pointer to the storage buffer ``n`` max. number of elements to get **Description** This macro gets the data from the fifo and returns the numbers of elements copied. The data is not removed from the fifo. Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMPhjubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjh]hfifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMMhjubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjʞhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjƞhMMhjǞubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjƞhMMhjubj)}(h&``buf`` pointer to the storage buffer h](j)}(h``buf``h]j)}(hjh]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMNhjubj2)}(hhh]h)}(hpointer to the storage bufferh]hpointer to the storage buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMNhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMNhjubj)}(h%``n`` max. number of elements to get h](j)}(h``n``h]j)}(hj#h]hn}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMOhjubj2)}(hhh]h)}(hmax. number of elements to geth]hmax. number of elements to get}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMOhj9ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj8hMOhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj^h]h Description}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMQhjubh)}(hyThis macro gets the data from the fifo and returns the numbers of elements copied. The data is not removed from the fifo.h]hyThis macro gets the data from the fifo and returns the numbers of elements copied. The data is not removed from the fifo.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMPhjubh)}(huNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h]hwNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macro.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMShjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_out_linear (C macro)c.kfifo_out_linearhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_out_linearh]j)}(hkfifo_out_linearh]j{)}(hkfifo_out_linearh]j)}(hjh]hkfifo_out_linear}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMfubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjɟhMfubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjɟhMfhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjɟhMfubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h$``kfifo_out_linear (fifo, tail, n)``h]j)}(hjh]h kfifo_out_linear (fifo, tail, n)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhhj-lhhubj)}(h(gets a tail of/offset to available data h]h)}(h'gets a tail of/offset to available datah]h'gets a tail of/offset to available data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMfhjubah}(h]h ]h"]h$]h&]uh1jhjhMfhj-lhhubj)}(hXw**Parameters** ``fifo`` address of the fifo to be used ``tail`` pointer to an unsigned int to store the value of tail ``n`` max. number of elements to point at **Description** This macro obtains the offset (tail) to the available data in the fifo buffer and returns the numbers of elements available. It returns the available count till the end of data or till the end of the buffer. So that it can be used for linear data processing (like memcpy() of (**fifo->data** + **tail**) with count returned). Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMjhjubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hj<h]hfifo}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMghj6ubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMghjRubah}(h]h ]h"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhMghj3ubj)}(h?``tail`` pointer to an unsigned int to store the value of tail h](j)}(h``tail``h]j)}(hjuh]htail}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhhjoubj2)}(hhh]h)}(h5pointer to an unsigned int to store the value of tailh]h5pointer to an unsigned int to store the value of tail}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhhjubah}(h]h ]h"]h$]h&]uh1j1hjoubeh}(h]h ]h"]h$]h&]uh1jhjhMhhj3ubj)}(h*``n`` max. number of elements to point at h](j)}(h``n``h]j)}(hjh]hn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMihjubj2)}(hhh]h)}(h#max. number of elements to point ath]h#max. number of elements to point at}(hjǠhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjàhMihjĠubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjàhMihj3ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMkhjubh)}(hXEThis macro obtains the offset (tail) to the available data in the fifo buffer and returns the numbers of elements available. It returns the available count till the end of data or till the end of the buffer. So that it can be used for linear data processing (like memcpy() of (**fifo->data** + **tail**) with count returned).h](hXThis macro obtains the offset (tail) to the available data in the fifo buffer and returns the numbers of elements available. It returns the available count till the end of data or till the end of the buffer. So that it can be used for linear data processing (like memcpy() of (}(hjhhhNhNubj)}(h**fifo->data**h]h fifo->data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh + }(hjhhhNhNubj)}(h**tail**h]htail}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) with count returned).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMjhjubh)}(huNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h]hwNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macro.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMqhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfifo_out_linear_ptr (C macro)c.kfifo_out_linear_ptrhNtauh1hhj-lhhhNhNubj)}(hhh](j)}(hkfifo_out_linear_ptrh]j)}(hkfifo_out_linear_ptrh]j{)}(hkfifo_out_linear_ptrh]j)}(hj[h]hkfifo_out_linear_ptr}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj]hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjYhhhjxhMubah}(h]jTah ](jjeh"]h$]h&]jj)jhuh1jhjxhMhjVhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjVhhhjxhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhj-lhNhNubh)}(h'``kfifo_out_linear_ptr (fifo, ptr, n)``h]j)}(hjh]h#kfifo_out_linear_ptr (fifo, ptr, n)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhj-lhhubj)}(h%gets a pointer to the available data h]h)}(h$gets a pointer to the available datah]h$gets a pointer to the available data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj-lhhubj)}(hX~**Parameters** ``fifo`` address of the fifo to be used ``ptr`` pointer to data to store the pointer to tail ``n`` max. number of elements to point at **Description** Similarly to kfifo_out_linear(), this macro obtains the pointer to the available data in the fifo buffer and returns the numbers of elements available. It returns the available count till the end of available data or till the end of the buffer. So that it can be used for linear data processing (like memcpy() of **ptr** with count returned). Note that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h](h)}(h**Parameters**h]j)}(hj̡h]h Parameters}(hjΡhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjʡubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjơubj )}(hhh](j)}(h(``fifo`` address of the fifo to be used h](j)}(h``fifo``h]j)}(hjh]hfifo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(haddress of the fifo to be usedh]haddress of the fifo to be used}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h5``ptr`` pointer to data to store the pointer to tail h](j)}(h``ptr``h]j)}(hj$h]hptr}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjubj2)}(hhh]h)}(h,pointer to data to store the pointer to tailh]h,pointer to data to store the pointer to tail}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hMhj:ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj9hMhjubj)}(h*``n`` max. number of elements to point at h](j)}(h``n``h]j)}(hj]h]hn}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjWubj2)}(hhh]h)}(h#max. number of elements to point ath]h#max. number of elements to point at}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhMhjsubah}(h]h ]h"]h$]h&]uh1j1hjWubeh}(h]h ]h"]h$]h&]uh1jhjrhMhjubeh}(h]h ]h"]h$]h&]uh1j hjơubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjơubh)}(hXVSimilarly to kfifo_out_linear(), this macro obtains the pointer to the available data in the fifo buffer and returns the numbers of elements available. It returns the available count till the end of available data or till the end of the buffer. So that it can be used for linear data processing (like memcpy() of **ptr** with count returned).h](hX9Similarly to kfifo_out_linear(), this macro obtains the pointer to the available data in the fifo buffer and returns the numbers of elements available. It returns the available count till the end of available data or till the end of the buffer. So that it can be used for linear data processing (like memcpy() of }(hjhhhNhNubj)}(h**ptr**h]hptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh with count returned).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjơubh)}(huNote that with only one concurrent reader and one concurrent writer, you don't need extra locking to use these macro.h]hwNote that with only one concurrent reader and one concurrent writer, you don’t need extra locking to use these macro.}(hjϢhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:205: ./include/linux/kfifo.hhMhjơubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj-lhhhNhNubeh}(h]kfifo-interfaceah ]h"]kfifo interfaceah$]h&]uh1hhjlhhhhhKubeh}(h] fifo-bufferah ]h"] fifo bufferah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hrelay interface supporth]hrelay interface support}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hRelay interface support is designed to provide an efficient mechanism for tools and facilities to relay large amounts of data from kernel space to user space.h]hRelay interface support is designed to provide an efficient mechanism for tools and facilities to relay large amounts of data from kernel space to user space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hhh](h)}(hrelay interfaceh]hrelay interface}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_buf_full (C function)c.relay_buf_fullhNtauh1hhjhhhNhNubj)}(hhh](j)}(h*int relay_buf_full (struct rchan_buf *buf)h]j)}(h)int relay_buf_full(struct rchan_buf *buf)h](j )}(hinth]hint}(hj>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj:hhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chKubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:hhhjLhKubj{)}(hrelay_buf_fullh]j)}(hrelay_buf_fullh]hrelay_buf_full}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj:hhhjLhKubj)}(h(struct rchan_buf *buf)h]j)}(hstruct rchan_buf *bufh](j)}(hjAh]hstruct}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jasbc.relay_buf_fullasbuh1hhjwubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubj)}(hjh]h*}(hjǣhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hbufh]hbuf}(hjԣhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjsubah}(h]h ]h"]h$]h&]jjuh1jhj:hhhjLhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj6hhhjLhKubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1jhjLhKhj3hhubj)}(hhh]h)}(h$boolean, is the channel buffer full?h]h$boolean, is the channel buffer full?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhj3hhhjLhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct rchan_buf *buf`` channel buffer **Description** Returns 1 if the buffer is full, 0 otherwise.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chKhjubj )}(hhh]j)}(h)``struct rchan_buf *buf`` channel buffer h](j)}(h``struct rchan_buf *buf``h]j)}(hj?h]hstruct rchan_buf *buf}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chKhj9ubj2)}(hhh]h)}(hchannel bufferh]hchannel buffer}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThKhjUubah}(h]h ]h"]h$]h&]uh1j1hj9ubeh}(h]h ]h"]h$]h&]uh1jhjThKhj6ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjzh]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chKhjubj)}(h-Returns 1 if the buffer is full, 0 otherwise.h]h)}(hjh]h-Returns 1 if the buffer is full, 0 otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_reset (C function) c.relay_resethNtauh1hhjhhhNhNubj)}(hhh](j)}(h%void relay_reset (struct rchan *chan)h]j)}(h$void relay_reset(struct rchan *chan)h](j )}(hvoidh]hvoid}(hjȤhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjĤhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM:ubj2)}(h h]h }(hjפhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjĤhhhj֤hM:ubj{)}(h relay_reseth]j)}(h relay_reseth]h relay_reset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjĤhhhj֤hM:ubj)}(h(struct rchan *chan)h]j)}(hstruct rchan *chanh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hrchanh]hrchan}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj%modnameN classnameNj] j` )}jc ]jf )}jY jsb c.relay_resetasbuh1hhjubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hchanh]hchan}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjĤhhhj֤hM:ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj֤hM:ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj֤hM:hjhhubj)}(hhh]h)}(hreset the channelh]hreset the channel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM:hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj֤hM:ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX}**Parameters** ``struct rchan *chan`` the channel **Description** This has the effect of erasing all data from all channel buffers and restarting the channel in its initial state. The buffers are not freed, so any mappings are still in effect. NOTE. Care should be taken that the channel isn't actually being used by anything when this call is made.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM>hjubj )}(hhh]j)}(h#``struct rchan *chan`` the channel h](j)}(h``struct rchan *chan``h]j)}(hjɥh]hstruct rchan *chan}(hj˥hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjǥubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM;hjåubj2)}(hhh]h)}(h the channelh]h the channel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjޥhM;hjߥubah}(h]h ]h"]h$]h&]uh1j1hjåubeh}(h]h ]h"]h$]h&]uh1jhjޥhM;hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM=hjubj)}(hXThis has the effect of erasing all data from all channel buffers and restarting the channel in its initial state. The buffers are not freed, so any mappings are still in effect. NOTE. Care should be taken that the channel isn't actually being used by anything when this call is made.h](h)}(hThis has the effect of erasing all data from all channel buffers and restarting the channel in its initial state. The buffers are not freed, so any mappings are still in effect.h]hThis has the effect of erasing all data from all channel buffers and restarting the channel in its initial state. The buffers are not freed, so any mappings are still in effect.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM<hjubh)}(hiNOTE. Care should be taken that the channel isn't actually being used by anything when this call is made.h]hkNOTE. Care should be taken that the channel isn’t actually being used by anything when this call is made.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM@hjubeh}(h]h ]h"]h$]h&]uh1jhj,hM<hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_open (C function) c.relay_openhNtauh1hhjhhhNhNubj)}(hhh](j)}(hstruct rchan * relay_open (const char *base_filename, struct dentry *parent, size_t subbuf_size, size_t n_subbufs, const struct rchan_callbacks *cb, void *private_data)h]j)}(hstruct rchan *relay_open(const char *base_filename, struct dentry *parent, size_t subbuf_size, size_t n_subbufs, const struct rchan_callbacks *cb, void *private_data)h](j)}(hjAh]hstruct}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^hhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^hhhjohMubh)}(hhh]j)}(hrchanh]hrchan}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY relay_opensb c.relay_openasbuh1hhj^hhhjohMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^hhhjohMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^hhhjohMubj{)}(h relay_openh]j)}(hjh]h relay_open}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj^hhhjohMubj)}(h(const char *base_filename, struct dentry *parent, size_t subbuf_size, size_t n_subbufs, const struct rchan_callbacks *cb, void *private_data)h](j)}(hconst char *base_filenameh](j)}(hjh]hconst}(hjܦhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjئubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjئubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjئubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjئubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjئubj)}(h base_filenameh]h base_filename}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjئubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjԦubj)}(hstruct dentry *parenth](j)}(hjAh]hstruct}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubh)}(hhh]j)}(hdentryh]hdentry}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjYmodnameN classnameNj] j` )}jc ]j c.relay_openasbuh1hhj5ubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hparenth]hparent}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjԦubj)}(hsize_t subbuf_sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.relay_openasbuh1hhjubj2)}(h h]h }(hjʧhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h subbuf_sizeh]h subbuf_size}(hjاhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjԦubj)}(hsize_t n_subbufsh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.relay_openasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h n_subbufsh]h n_subbufs}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjԦubj)}(h const struct rchan_callbacks *cbh](j)}(hjh]hconst}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hjAh]hstruct}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubh)}(hhh]j)}(hrchan_callbacksh]hrchan_callbacks}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]j c.relay_openasbuh1hhj5ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hcbh]hcb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjԦubj)}(hvoid *private_datah](j )}(hvoidh]hvoid}(hjĨhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjҨhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h private_datah]h private_data}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjԦubeh}(h]h ]h"]h$]h&]jjuh1jhj^hhhjohMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjZhhhjohMubah}(h]jUah ](jjeh"]h$]h&]jj)jhuh1jhjohMhjWhhubj)}(hhh]h)}(hcreate a new relay channelh]hcreate a new relay channel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjWhhhjohMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj/jj/jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const char *base_filename`` base name of files to create ``struct dentry *parent`` dentry of parent directory, ``NULL`` for root directory or buffer ``size_t subbuf_size`` size of sub-buffers ``size_t n_subbufs`` number of sub-buffers ``const struct rchan_callbacks *cb`` client callback functions ``void *private_data`` user-defined data **Description** Returns channel pointer if successful, ``NULL`` otherwise. Creates a channel buffer for each cpu using the sizes and attributes specified. The created channel buffer files will be named base_filename0...base_filenameN-1. File permissions will be ``S_IRUSR``.h](h)}(h**Parameters**h]j)}(hj9h]h Parameters}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhj3ubj )}(hhh](j)}(h;``const char *base_filename`` base name of files to create h](j)}(h``const char *base_filename``h]j)}(hjXh]hconst char *base_filename}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjRubj2)}(hhh]h)}(hbase name of files to createh]hbase name of files to create}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhMhjnubah}(h]h ]h"]h$]h&]uh1j1hjRubeh}(h]h ]h"]h$]h&]uh1jhjmhMhjOubj)}(h\``struct dentry *parent`` dentry of parent directory, ``NULL`` for root directory or buffer h](j)}(h``struct dentry *parent``h]j)}(hjh]hstruct dentry *parent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjubj2)}(hhh]h)}(hAdentry of parent directory, ``NULL`` for root directory or bufferh](hdentry of parent directory, }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh for root directory or buffer}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjOubj)}(h+``size_t subbuf_size`` size of sub-buffers h](j)}(h``size_t subbuf_size``h]j)}(hjܩh]hsize_t subbuf_size}(hjީhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjکubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhj֩ubj2)}(hhh]h)}(hsize of sub-buffersh]hsize of sub-buffers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj֩ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjOubj)}(h+``size_t n_subbufs`` number of sub-buffers h](j)}(h``size_t n_subbufs``h]j)}(hjh]hsize_t n_subbufs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjubj2)}(hhh]h)}(hnumber of sub-buffersh]hnumber of sub-buffers}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj+ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj*hMhjOubj)}(h?``const struct rchan_callbacks *cb`` client callback functions h](j)}(h$``const struct rchan_callbacks *cb``h]j)}(hjNh]h const struct rchan_callbacks *cb}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjHubj2)}(hhh]h)}(hclient callback functionsh]hclient callback functions}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMhjdubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjchMhjOubj)}(h)``void *private_data`` user-defined data h](j)}(h``void *private_data``h]j)}(hjh]hvoid *private_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjubj2)}(hhh]h)}(huser-defined datah]huser-defined data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjOubeh}(h]h ]h"]h$]h&]uh1j hj3ubh)}(h**Description**h]j)}(hjªh]h Description}(hjĪhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhj3ubj)}(hXReturns channel pointer if successful, ``NULL`` otherwise. Creates a channel buffer for each cpu using the sizes and attributes specified. The created channel buffer files will be named base_filename0...base_filenameN-1. File permissions will be ``S_IRUSR``.h](h)}(h:Returns channel pointer if successful, ``NULL`` otherwise.h](h'Returns channel pointer if successful, }(hjܪhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjܪubh otherwise.}(hjܪhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjتubh)}(hCreates a channel buffer for each cpu using the sizes and attributes specified. The created channel buffer files will be named base_filename0...base_filenameN-1. File permissions will be ``S_IRUSR``.h](hCreates a channel buffer for each cpu using the sizes and attributes specified. The created channel buffer files will be named base_filename0...base_filenameN-1. File permissions will be }(hjhhhNhNubj)}(h ``S_IRUSR``h]hS_IRUSR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjتubeh}(h]h ]h"]h$]h&]uh1jhjhMhj3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  relay_switch_subbuf (C function)c.relay_switch_subbufhNtauh1hhjhhhNhNubj)}(hhh](j)}(hAsize_t relay_switch_subbuf (struct rchan_buf *buf, size_t length)h]j)}(h@size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjImodnameN classnameNj] j` )}jc ]jf )}jY relay_switch_subbufsbc.relay_switch_subbufasbuh1hhj@hhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM!ubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@hhhjhhM!ubj{)}(hrelay_switch_subbufh]j)}(hjeh]hrelay_switch_subbuf}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj@hhhjhhM!ubj)}(h&(struct rchan_buf *buf, size_t length)h](j)}(hstruct rchan_buf *bufh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jcc.relay_switch_subbufasbuh1hhjubj2)}(h h]h }(hjҫhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t lengthh](h)}(hhh]j)}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jcc.relay_switch_subbufasbuh1hhjubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlengthh]hlength}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj@hhhjhhM!ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj<hhhjhhM!ubah}(h]j7ah ](jjeh"]h$]h&]jj)jhuh1jhjhhM!hj9hhubj)}(hhh]h)}(hswitch to a new sub-bufferh]hswitch to a new sub-buffer}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM!hj\hhubah}(h]h ]h"]h$]h&]uh1jhj9hhhjhhM!ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjwjjwjjjuh1jhhhjhNhNubj)}(hX'**Parameters** ``struct rchan_buf *buf`` channel buffer ``size_t length`` size of current event **Description** Returns either the length passed in or 0 if full. Performs sub-buffer-switch tasks such as invoking callbacks, updating padding counts, waking up readers, etc.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM%hj{ubj )}(hhh](j)}(h)``struct rchan_buf *buf`` channel buffer h](j)}(h``struct rchan_buf *buf``h]j)}(hjh]hstruct rchan_buf *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM"hjubj2)}(hhh]h)}(hchannel bufferh]hchannel buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM"hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM"hjubj)}(h(``size_t length`` size of current event h](j)}(h``size_t length``h]j)}(hj٬h]h size_t length}(hj۬hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj׬ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM#hjӬubj2)}(hhh]h)}(hsize of current eventh]hsize of current event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM#hjubah}(h]h ]h"]h$]h&]uh1j1hjӬubeh}(h]h ]h"]h$]h&]uh1jhjhM#hjubeh}(h]h ]h"]h$]h&]uh1j hj{ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM%hj{ubj)}(hReturns either the length passed in or 0 if full. Performs sub-buffer-switch tasks such as invoking callbacks, updating padding counts, waking up readers, etc.h](h)}(h1Returns either the length passed in or 0 if full.h]h1Returns either the length passed in or 0 if full.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM$hj*ubh)}(hmPerforms sub-buffer-switch tasks such as invoking callbacks, updating padding counts, waking up readers, etc.h]hmPerforms sub-buffer-switch tasks such as invoking callbacks, updating padding counts, waking up readers, etc.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chM&hj*ubeh}(h]h ]h"]h$]h&]uh1jhj<hM$hj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #relay_subbufs_consumed (C function)c.relay_subbufs_consumedhNtauh1hhjhhhNhNubj)}(hhh](j)}(h[void relay_subbufs_consumed (struct rchan *chan, unsigned int cpu, size_t subbufs_consumed)h]j)}(hZvoid relay_subbufs_consumed(struct rchan *chan, unsigned int cpu, size_t subbufs_consumed)h](j )}(hvoidh]hvoid}(hjrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMcubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnhhhjhMcubj{)}(hrelay_subbufs_consumedh]j)}(hrelay_subbufs_consumedh]hrelay_subbufs_consumed}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnhhhjhMcubj)}(h?(struct rchan *chan, unsigned int cpu, size_t subbufs_consumed)h](j)}(hstruct rchan *chanh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hrchanh]hrchan}(hjͭhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjʭubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjϭmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.relay_subbufs_consumedasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hchanh]hchan}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int cpuh](j )}(hunsignedh]hunsigned}(hj!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hj=hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcpuh]hcpu}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsize_t subbufs_consumedh](h)}(hhh]j)}(hsize_th]hsize_t}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjwmodnameN classnameNj] j` )}jc ]jc.relay_subbufs_consumedasbuh1hhjnubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubj)}(hsubbufs_consumedh]hsubbufs_consumed}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjnhhhjhMcubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjjhhhjhMcubah}(h]jeah ](jjeh"]h$]h&]jj)jhuh1jhjhMchjghhubj)}(hhh]h)}(h.update the buffer's sub-buffers-consumed counth]h0update the buffer’s sub-buffers-consumed count}(hjˮhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMchjȮhhubah}(h]h ]h"]h$]h&]uh1jhjghhhjhMcubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rchan *chan`` the channel ``unsigned int cpu`` the cpu associated with the channel buffer to update ``size_t subbufs_consumed`` number of sub-buffers to add to current buf's count **Description** Adds to the channel buffer's consumed sub-buffer count. subbufs_consumed should be the number of sub-buffers newly consumed, not the total consumed. NOTE. Kernel clients don't need to call this function if the channel mode is 'overwrite'.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMghjubj )}(hhh](j)}(h#``struct rchan *chan`` the channel h](j)}(h``struct rchan *chan``h]j)}(hj h]hstruct rchan *chan}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMdhjubj2)}(hhh]h)}(h the channelh]h the channel}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMdhj"ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj!hMdhjubj)}(hJ``unsigned int cpu`` the cpu associated with the channel buffer to update h](j)}(h``unsigned int cpu``h]j)}(hjEh]hunsigned int cpu}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMehj?ubj2)}(hhh]h)}(h4the cpu associated with the channel buffer to updateh]h4the cpu associated with the channel buffer to update}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhMehj[ubah}(h]h ]h"]h$]h&]uh1j1hj?ubeh}(h]h ]h"]h$]h&]uh1jhjZhMehjubj)}(hP``size_t subbufs_consumed`` number of sub-buffers to add to current buf's count h](j)}(h``size_t subbufs_consumed``h]j)}(hj~h]hsize_t subbufs_consumed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMfhjxubj2)}(hhh]h)}(h3number of sub-buffers to add to current buf's counth]h5number of sub-buffers to add to current buf’s count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMfhjubah}(h]h ]h"]h$]h&]uh1j1hjxubeh}(h]h ]h"]h$]h&]uh1jhjhMfhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhhjubj)}(hAdds to the channel buffer's consumed sub-buffer count. subbufs_consumed should be the number of sub-buffers newly consumed, not the total consumed. NOTE. Kernel clients don't need to call this function if the channel mode is 'overwrite'.h](h)}(hAdds to the channel buffer's consumed sub-buffer count. subbufs_consumed should be the number of sub-buffers newly consumed, not the total consumed.h]hAdds to the channel buffer’s consumed sub-buffer count. subbufs_consumed should be the number of sub-buffers newly consumed, not the total consumed.}(hjӯhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMghjϯubh)}(hYNOTE. Kernel clients don't need to call this function if the channel mode is 'overwrite'.h]h_NOTE. Kernel clients don’t need to call this function if the channel mode is ‘overwrite’.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMkhjϯubeh}(h]h ]h"]h$]h&]uh1jhjhMghjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_close (C function) c.relay_closehNtauh1hhjhhhNhNubj)}(hhh](j)}(h%void relay_close (struct rchan *chan)h]j)}(h$void relay_close(struct rchan *chan)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj%hMubj{)}(h relay_closeh]j)}(h relay_closeh]h relay_close}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj%hMubj)}(h(struct rchan *chan)h]j)}(hstruct rchan *chanh](j)}(hjAh]hstruct}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubh)}(hhh]j)}(hrchanh]hrchan}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]jf )}jY j:sb c.relay_closeasbuh1hhjPubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hchanh]hchan}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjLubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj%hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj%hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj%hMhj hhubj)}(hhh]h)}(hclose the channelh]hclose the channel}(hjװhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhj԰hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj%hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h}**Parameters** ``struct rchan *chan`` the channel **Description** Closes all channel buffers and frees the channel.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjubj )}(hhh]j)}(h#``struct rchan *chan`` the channel h](j)}(h``struct rchan *chan``h]j)}(hjh]hstruct rchan *chan}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjubj2)}(hhh]h)}(h the channelh]h the channel}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj.ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj-hMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjSh]h Description}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjubj)}(h1Closes all channel buffers and frees the channel.h]h)}(hjkh]h1Closes all channel buffers and frees the channel.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjiubah}(h]h ]h"]h$]h&]uh1jhjzhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_flush (C function) c.relay_flushhNtauh1hhjhhhNhNubj)}(hhh](j)}(h%void relay_flush (struct rchan *chan)h]j)}(h$void relay_flush(struct rchan *chan)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(h relay_flushh]j)}(h relay_flushh]h relay_flush}(hj±hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct rchan *chan)h]j)}(hstruct rchan *chanh](j)}(hjAh]hstruct}(hjޱhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڱubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjڱubh)}(hhh]j)}(hrchanh]hrchan}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jısb c.relay_flushasbuh1hhjڱubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjڱubj)}(hjh]h*}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڱubj)}(hchanh]hchan}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڱubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjֱubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hclose the channelh]hclose the channel}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhj^hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjyjjyjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct rchan *chan`` the channel **Description** Flushes all channel buffers, i.e. forces buffer switch.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhj}ubj )}(hhh]j)}(h#``struct rchan *chan`` the channel h](j)}(h``struct rchan *chan``h]j)}(hjh]hstruct rchan *chan}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjubj2)}(hhh]h)}(h the channelh]h the channel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hj}ubh)}(h**Description**h]j)}(hjݲh]h Description}(hj߲hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj۲ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhj}ubj)}(h7Flushes all channel buffers, i.e. forces buffer switch.h]h)}(hjh]h7Flushes all channel buffers, i.e. forces buffer switch.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:218: ./kernel/relay.chMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #relay_mmap_prepare_buf (C function)c.relay_mmap_prepare_bufhNtauh1hhjhhhNhNubj)}(hhh](j)}(hMint relay_mmap_prepare_buf (struct rchan_buf *buf, struct vm_area_desc *desc)h]j)}(hLint relay_mmap_prepare_buf(struct rchan_buf *buf, struct vm_area_desc *desc)h](j )}(hinth]hint}(hj+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj'hhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKJubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'hhhj9hKJubj{)}(hrelay_mmap_prepare_bufh]j)}(hrelay_mmap_prepare_bufh]hrelay_mmap_prepare_buf}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj'hhhj9hKJubj)}(h2(struct rchan_buf *buf, struct vm_area_desc *desc)h](j)}(hstruct rchan_buf *bufh](j)}(hjAh]hstruct}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jNsbc.relay_mmap_prepare_bufasbuh1hhjdubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj`ubj)}(hstruct vm_area_desc *desch](j)}(hjAh]hstruct}(hjڳhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjֳubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjֳubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.relay_mmap_prepare_bufasbuh1hhjֳubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjֳubj)}(hjh]h*}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjֳubj)}(hdesch]hdesc}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjֳubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj`ubeh}(h]h ]h"]h$]h&]jjuh1jhj'hhhj9hKJubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj#hhhj9hKJubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj9hKJhj hhubj)}(hhh]j)}(hhh]j)}(h,mmap channel buffer to process address spaceh]h)}(hj`h]h,mmap channel buffer to process address space}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKJhj^ubah}(h]h ]h"]h$]h&]uh1jhj[hhhjohNubah}(h]h ]h"]h$]h&]jjuh1jhjohKJhjXhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj9hKJubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct rchan_buf *buf`` the relay channel buffer ``struct vm_area_desc *desc`` describing what to map **Description** Returns 0 if ok, negative on error Caller should already have grabbed mmap_lock.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKNhjubj )}(hhh](j)}(h3``struct rchan_buf *buf`` the relay channel buffer h](j)}(h``struct rchan_buf *buf``h]j)}(hjh]hstruct rchan_buf *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKKhjubj2)}(hhh]h)}(hthe relay channel bufferh]hthe relay channel buffer}(hjǴhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjôhKKhjĴubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjôhKKhjubj)}(h5``struct vm_area_desc *desc`` describing what to map h](j)}(h``struct vm_area_desc *desc``h]j)}(hjh]hstruct vm_area_desc *desc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKLhjubj2)}(hhh]h)}(hdescribing what to maph]hdescribing what to map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKLhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKLhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj"h]h Description}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKNhjubj)}(hQReturns 0 if ok, negative on error Caller should already have grabbed mmap_lock.h](h)}(h"Returns 0 if ok, negative on errorh]h"Returns 0 if ok, negative on error}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKMhj8ubh)}(h-Caller should already have grabbed mmap_lock.h]h-Caller should already have grabbed mmap_lock.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKOhj8ubeh}(h]h ]h"]h$]h&]uh1jhjJhKMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_alloc_buf (C function)c.relay_alloc_bufhNtauh1hhjhhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hj|hhhjhKeubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|hhhjhKeubj{)}(hrelay_alloc_bufh]j)}(hrelay_alloc_bufh]hrelay_alloc_buf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj|hhhjhKeubj)}(h%(struct rchan_buf *buf, size_t *size)h](j)}(hstruct rchan_buf *bufh](j)}(hjAh]hstruct}(hjʵhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƵubj2)}(h h]h }(hj׵hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjƵubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.relay_alloc_bufasbuh1hhjƵubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjƵubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƵubj)}(hbufh]hbuf}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƵubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjµ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&] refdomainjreftypejY reftargetjAmodnameN classnameNj] j` )}jc ]jc.relay_alloc_bufasbuh1hhj8ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubj)}(hjh]h*}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hsizeh]hsize}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjµubeh}(h]h ]h"]h$]h&]jjuh1jhj|hhhjhKeubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjxhhhjhKeubah}(h]jsah ](jjeh"]h$]h&]jj)jhuh1jhjhKehjuhhubj)}(hhh]h)}(hallocate a channel bufferh]hallocate a channel buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKehjhhubah}(h]h ]h"]h$]h&]uh1jhjuhhhjhKeubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX **Parameters** ``struct rchan_buf *buf`` the buffer struct ``size_t *size`` total size of the buffer **Description** Returns a pointer to the resulting buffer, ``NULL`` if unsuccessful. The passed in size will get page aligned, if it isn't already.h](h)}(h**Parameters**h]j)}(hjĶh]h Parameters}(hjƶhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj¶ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKihjubj )}(hhh](j)}(h,``struct rchan_buf *buf`` the buffer struct h](j)}(h``struct rchan_buf *buf``h]j)}(hjh]hstruct rchan_buf *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKfhjݶubj2)}(hhh]h)}(hthe buffer structh]hthe buffer struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKfhjubah}(h]h ]h"]h$]h&]uh1j1hjݶubeh}(h]h ]h"]h$]h&]uh1jhjhKfhjڶubj)}(h*``size_t *size`` total size of the buffer h](j)}(h``size_t *size``h]j)}(hjh]h size_t *size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKghjubj2)}(hhh]h)}(htotal size of the bufferh]htotal size of the buffer}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hKghj2ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj1hKghjڶubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjWh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKihjubj)}(hReturns a pointer to the resulting buffer, ``NULL`` if unsuccessful. The passed in size will get page aligned, if it isn't already.h]h)}(hReturns a pointer to the resulting buffer, ``NULL`` if unsuccessful. The passed in size will get page aligned, if it isn't already.h](h+Returns a pointer to the resulting buffer, }(hjqhhhNhNubj)}(h``NULL``h]hNULL}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubhR if unsuccessful. The passed in size will get page aligned, if it isn’t already.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhhjmubah}(h]h ]h"]h$]h&]uh1jhjhKhhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_create_buf (C function)c.relay_create_bufhNtauh1hhjhhhNhNubj)}(hhh](j)}(h8struct rchan_buf * relay_create_buf (struct rchan *chan)h]j)}(h6struct rchan_buf *relay_create_buf(struct rchan *chan)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKubj2)}(h h]h }(hjƷhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjŷhKubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hj׷hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԷubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjٷmodnameN classnameNj] j` )}jc ]jf )}jY relay_create_bufsbc.relay_create_bufasbuh1hhjhhhjŷhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjŷhKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjŷhKubj{)}(hrelay_create_bufh]j)}(hjh]hrelay_create_buf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjŷhKubj)}(h(struct rchan *chan)h]j)}(hstruct rchan *chanh](j)}(hjAh]hstruct}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubh)}(hhh]j)}(hrchanh]hrchan}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjRmodnameN classnameNj] j` )}jc ]jc.relay_create_bufasbuh1hhj.ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hjh]h*}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hchanh]hchan}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjŷhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjŷhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjŷhKhjhhubj)}(hhh]h)}(h(allocate and initialize a channel bufferh]h(allocate and initialize a channel buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjŷhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj˸jj˸jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct rchan *chan`` the relay channel **Description** Returns channel buffer if successful, ``NULL`` otherwise.h](h)}(h**Parameters**h]j)}(hjոh]h Parameters}(hj׸hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӸubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjϸubj )}(hhh]j)}(h)``struct rchan *chan`` the relay channel h](j)}(h``struct rchan *chan``h]j)}(hjh]hstruct rchan *chan}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjubj2)}(hhh]h)}(hthe relay channelh]hthe relay channel}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hKhjubah}(h]h ]h"]h$]h&]uh1j hjϸubh)}(h**Description**h]j)}(hj/h]h Description}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjϸubj)}(h9Returns channel buffer if successful, ``NULL`` otherwise.h]h)}(hjGh](h&Returns channel buffer if successful, }(hjIhhhNhNubj)}(h``NULL``h]hNULL}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh otherwise.}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjEubah}(h]h ]h"]h$]h&]uh1jhjhhKhjϸubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "relay_destroy_channel (C function)c.relay_destroy_channelhNtauh1hhjhhhNhNubj)}(hhh](j)}(h.void relay_destroy_channel (struct kref *kref)h]j)}(h-void relay_destroy_channel(struct kref *kref)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hrelay_destroy_channelh]j)}(hrelay_destroy_channelh]hrelay_destroy_channel}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(struct kref *kref)h]j)}(hstruct kref *krefh](j)}(hjAh]hstruct}(hj̹hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjȹubj2)}(h h]h }(hjٹhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjȹubh)}(hhh]j)}(hkrefh]hkref}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.relay_destroy_channelasbuh1hhjȹubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjȹubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjȹubj)}(hkrefh]hkref}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjȹubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjĹubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(hfree the channel structh]hfree the channel struct}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjLhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjgjjgjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct kref *kref`` target kernel reference that contains the relay channel **Description** Should only be called from kref_put().h](h)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjkubj )}(hhh]j)}(hN``struct kref *kref`` target kernel reference that contains the relay channel h](j)}(h``struct kref *kref``h]j)}(hjh]hstruct kref *kref}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjubj2)}(hhh]h)}(h7target kernel reference that contains the relay channelh]h7target kernel reference that contains the relay channel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjkubh)}(h**Description**h]j)}(hj˺h]h Description}(hjͺhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɺubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjkubj)}(h&Should only be called from kref_put().h]h)}(hjh]h&Should only be called from kref_put().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_destroy_buf (C function)c.relay_destroy_bufhNtauh1hhjhhhNhNubj)}(hhh](j)}(h.void relay_destroy_buf (struct rchan_buf *buf)h]j)}(h-void relay_destroy_buf(struct rchan_buf *buf)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj'hKubj{)}(hrelay_destroy_bufh]j)}(hrelay_destroy_bufh]hrelay_destroy_buf}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj'hKubj)}(h(struct rchan_buf *buf)h]j)}(hstruct rchan_buf *bufh](j)}(hjAh]hstruct}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjvmodnameN classnameNj] j` )}jc ]jf )}jY j<sbc.relay_destroy_bufasbuh1hhjRubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjNubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj'hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj'hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj'hKhjhhubj)}(hhh]h)}(h1destroy an rchan_buf struct and associated bufferh]h1destroy an rchan_buf struct and associated buffer}(hjٻhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjֻhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj'hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h=**Parameters** ``struct rchan_buf *buf`` the buffer structh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjubj )}(hhh]j)}(h+``struct rchan_buf *buf`` the buffer structh](j)}(h``struct rchan_buf *buf``h]j)}(hjh]hstruct rchan_buf *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjubj2)}(hhh]h)}(hthe buffer structh]hthe buffer struct}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhj0ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj/hKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_remove_buf (C function)c.relay_remove_bufhNtauh1hhjhhhNhNubj)}(hhh](j)}(h)void relay_remove_buf (struct kref *kref)h]j)}(h(void relay_remove_buf(struct kref *kref)h](j )}(hvoidh]hvoid}(hjthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjphhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjphhhjhKubj{)}(hrelay_remove_bufh]j)}(hrelay_remove_bufh]hrelay_remove_buf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjphhhjhKubj)}(h(struct kref *kref)h]j)}(hstruct kref *krefh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hkrefh]hkref}(hjϼhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj̼ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjѼmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.relay_remove_bufasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hkrefh]hkref}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjphhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjlhhhjhKubah}(h]jgah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjihhubj)}(hhh]h)}(hremove a channel bufferh]hremove a channel buffer}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhj1hhubah}(h]h ]h"]h$]h&]uh1jhjihhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjLjjLjjjuh1jhhhjhNhNubj)}(hX **Parameters** ``struct kref *kref`` target kernel reference that contains the relay buffer **Description** Removes the file from the filesystem, which also frees the rchan_buf_struct and the channel buffer. Should only be called from kref_put().h](h)}(h**Parameters**h]j)}(hjVh]h Parameters}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjPubj )}(hhh]j)}(hM``struct kref *kref`` target kernel reference that contains the relay buffer h](j)}(h``struct kref *kref``h]j)}(hjuh]hstruct kref *kref}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjoubj2)}(hhh]h)}(h6target kernel reference that contains the relay bufferh]h6target kernel reference that contains the relay buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjoubeh}(h]h ]h"]h$]h&]uh1jhjhKhjlubah}(h]h ]h"]h$]h&]uh1j hjPubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjPubj)}(hRemoves the file from the filesystem, which also frees the rchan_buf_struct and the channel buffer. Should only be called from kref_put().h]h)}(hRemoves the file from the filesystem, which also frees the rchan_buf_struct and the channel buffer. Should only be called from kref_put().h]hRemoves the file from the filesystem, which also frees the rchan_buf_struct and the channel buffer. Should only be called from kref_put().}(hjʽhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjƽubah}(h]h ]h"]h$]h&]uh1jhjؽhKhjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_buf_empty (C function)c.relay_buf_emptyhNtauh1hhjhhhNhNubj)}(hhh](j)}(h+int relay_buf_empty (struct rchan_buf *buf)h]j)}(h*int relay_buf_empty(struct rchan_buf *buf)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj hKubj{)}(hrelay_buf_emptyh]j)}(hrelay_buf_emptyh]hrelay_buf_empty}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj hKubj)}(h(struct rchan_buf *buf)h]j)}(hstruct rchan_buf *bufh](j)}(hjAh]hstruct}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj\modnameN classnameNj] j` )}jc ]jf )}jY j"sbc.relay_buf_emptyasbuh1hhj8ubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj4ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hKhjhhubj)}(hhh]h)}(h%boolean, is the channel buffer empty?h]h%boolean, is the channel buffer empty?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj׾jj׾jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct rchan_buf *buf`` channel buffer **Description** Returns 1 if the buffer is empty, 0 otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj߾ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhj۾ubj )}(hhh]j)}(h)``struct rchan_buf *buf`` channel buffer h](j)}(h``struct rchan_buf *buf``h]j)}(hjh]hstruct rchan_buf *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjubj2)}(hhh]h)}(hchannel bufferh]hchannel buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hj۾ubh)}(h**Description**h]j)}(hj;h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhj۾ubj)}(h.Returns 1 if the buffer is empty, 0 otherwise.h]h)}(hjSh]h.Returns 1 if the buffer is empty, 0 otherwise.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chKhjQubah}(h]h ]h"]h$]h&]uh1jhjbhKhj۾ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j wakeup_readers (C function)c.wakeup_readershNtauh1hhjhhhNhNubj)}(hhh](j)}(h+void wakeup_readers (struct irq_work *work)h]j)}(h*void wakeup_readers(struct irq_work *work)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM ubj{)}(hwakeup_readersh]j)}(hwakeup_readersh]hwakeup_readers}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM ubj)}(h(struct irq_work *work)h]j)}(hstruct irq_work *workh](j)}(hjAh]hstruct}(hjƿhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj¿ubj2)}(h h]h }(hjӿhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj¿ubh)}(hhh]j)}(hirq_workh]hirq_work}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.wakeup_readersasbuh1hhj¿ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj¿ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj¿ubj)}(hworkh]hwork}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj¿ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]j|ah ](jjeh"]h$]h&]jj)jhuh1jhjhM hj~hhubj)}(hhh]h)}(h$wake up readers waiting on a channelh]h$wake up readers waiting on a channel}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chM hjFhhubah}(h]h ]h"]h$]h&]uh1jhj~hhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjajjajjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct irq_work *work`` contains the channel buffer **Description** This is the function used to defer reader wakingh](h)}(h**Parameters**h]j)}(hjkh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjeubj )}(hhh]j)}(h6``struct irq_work *work`` contains the channel buffer h](j)}(h``struct irq_work *work``h]j)}(hjh]hstruct irq_work *work}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chM hjubj2)}(hhh]h)}(hcontains the channel bufferh]hcontains the channel buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1j hjeubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chM hjeubj)}(h0This is the function used to defer reader wakingh]h)}(hjh]h0This is the function used to defer reader waking}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chM hjubah}(h]h ]h"]h$]h&]uh1jhjhM hjeubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __relay_reset (C function)c.__relay_resethNtauh1hhjhhhNhNubj)}(hhh](j)}(h=void __relay_reset (struct rchan_buf *buf, unsigned int init)h]j)}(hah"]h$]h&]uh1j1hjhhhj!hMubj{)}(h __relay_reseth]j)}(h __relay_reseth]h __relay_reset}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj!hMubj)}(h*(struct rchan_buf *buf, unsigned int init)h](j)}(hstruct rchan_buf *bufh](j)}(hjAh]hstruct}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjpmodnameN classnameNj] j` )}jc ]jf )}jY j6sbc.__relay_resetasbuh1hhjLubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubj)}(hunsigned int inith](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hinith]hinit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj!hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj!hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj!hMhjhhubj)}(hhh]h)}(hreset a channel bufferh]hreset a channel buffer}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhj!hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj!hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj<jj<jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct rchan_buf *buf`` the channel buffer ``unsigned int init`` 1 if this is a first-time initialization **Description** See relay_reset() for description of effect.h](h)}(h**Parameters**h]j)}(hjFh]h Parameters}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhj@ubj )}(hhh](j)}(h-``struct rchan_buf *buf`` the channel buffer 2h](j)}(h``struct rchan_buf *buf``h]j)}(hjeh]hstruct rchan_buf *buf}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhj_ubj2)}(hhh]h)}(hthe channel bufferh]hthe channel buffer}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhMhj{ubah}(h]h ]h"]h$]h&]uh1j1hj_ubeh}(h]h ]h"]h$]h&]uh1jhjzhMhj\ubj)}(h?``unsigned int init`` 1 if this is a first-time initialization h](j)}(h``unsigned int init``h]j)}(hjh]hunsigned int init}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj2)}(hhh]h)}(h(1 if this is a first-time initializationh]h(1 if this is a first-time initialization}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj\ubeh}(h]h ]h"]h$]h&]uh1j hj@ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhj@ubj)}(h,See relay_reset() for description of effect.h]h)}(hjh]h,See relay_reset() for description of effect.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_close_buf (C function)c.relay_close_bufhNtauh1hhjhhhNhNubj)}(hhh](j)}(h,void relay_close_buf (struct rchan_buf *buf)h]j)}(h+void relay_close_buf(struct rchan_buf *buf)h](j )}(hvoidh]hvoid}(hj'hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#hhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#hhhj5hMubj{)}(hrelay_close_bufh]j)}(hrelay_close_bufh]hrelay_close_buf}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj#hhhj5hMubj)}(h(struct rchan_buf *buf)h]j)}(hstruct rchan_buf *bufh](j)}(hjAh]hstruct}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jJsbc.relay_close_bufasbuh1hhj`ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubah}(h]h ]h"]h$]h&]jjuh1jhj#hhhj5hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj5hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj5hMhjhhubj)}(hhh]h)}(hclose a channel bufferh]hclose a channel buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj5hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rchan_buf *buf`` channel buffer **Description** Marks the buffer finalized and restores the default callbacks. The channel buffer and channel buffer data structure are then freed automatically when the last reference is given up.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj )}(hhh]j)}(h)``struct rchan_buf *buf`` channel buffer h](j)}(h``struct rchan_buf *buf``h]j)}(hj(h]hstruct rchan_buf *buf}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhj"ubj2)}(hhh]h)}(hchannel bufferh]hchannel buffer}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj>ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjch]h Description}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj)}(hMarks the buffer finalized and restores the default callbacks. The channel buffer and channel buffer data structure are then freed automatically when the last reference is given up.h]h)}(hMarks the buffer finalized and restores the default callbacks. The channel buffer and channel buffer data structure are then freed automatically when the last reference is given up.h]hMarks the buffer finalized and restores the default callbacks. The channel buffer and channel buffer data structure are then freed automatically when the last reference is given up.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjyubah}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_stats (C function) c.relay_statshNtauh1hhjhhhNhNubj)}(hhh](j)}(h2size_t relay_stats (struct rchan *chan, int flags)h]j)}(h1size_t relay_stats(struct rchan *chan, int flags)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY relay_statssb c.relay_statsasbuh1hhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(h relay_statsh]j)}(hjh]h relay_stats}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct rchan *chan, int flags)h](j)}(hstruct rchan *chanh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hrchanh]hrchan}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj$modnameN classnameNj] j` )}jc ]j c.relay_statsasbuh1hhjubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hchanh]hchan}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int flagsh](j )}(hinth]hint}(hjthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hget channel buffer statisticsh]hget channel buffer statistics}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct rchan *chan`` the channel ``int flags`` select particular information to get **Description** Returns the count of certain field that caller specifies.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj )}(hhh](j)}(h#``struct rchan *chan`` the channel h](j)}(h``struct rchan *chan``h]j)}(hjh]hstruct rchan *chan}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj2)}(hhh]h)}(h the channelh]h the channel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h3``int flags`` select particular information to get h](j)}(h ``int flags``h]j)}(hj4h]h int flags}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhj.ubj2)}(hhh]h)}(h$select particular information to geth]h$select particular information to get}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhMhjJubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjoh]h Description}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj)}(h9Returns the count of certain field that caller specifies.h]h)}(hjh]h9Returns the count of certain field that caller specifies.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_file_open (C function)c.relay_file_openhNtauh1hhjhhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjhhhjhMubj{)}(hrelay_file_openh]j)}(hrelay_file_openh]hrelay_file_open}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h((struct inode *inode, struct file *filp)h](j)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.relay_file_openasbuh1hhjubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinodeh]hinode}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct file *filph](j)}(hjAh]hstruct}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j4c.relay_file_openasbuh1hhjhubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj)}(hfilph]hfilp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hopen file op for relay filesh]hopen file op for relay files}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct inode *inode`` the inode ``struct file *filp`` the file **Description** Increments the channel buffer refcount.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhj ubj )}(hhh](j)}(h"``struct inode *inode`` the inode h](j)}(h``struct inode *inode``h]j)}(hj.h]hstruct inode *inode}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhj(ubj2)}(hhh]h)}(h the inodeh]h the inode}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMhjDubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhjChMhj%ubj)}(h``struct file *filp`` the file h](j)}(h``struct file *filp``h]j)}(hjgh]hstruct file *filp}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjaubj2)}(hhh]h)}(hthe fileh]hthe file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hMhj}ubah}(h]h ]h"]h$]h&]uh1j1hjaubeh}(h]h ]h"]h$]h&]uh1jhj|hMhj%ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhj ubj)}(h'Increments the channel buffer refcount.h]h)}(hjh]h'Increments the channel buffer refcount.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $relay_file_mmap_prepare (C function)c.relay_file_mmap_preparehNtauh1hhjhhhNhNubj)}(hhh](j)}(h7int relay_file_mmap_prepare (struct vm_area_desc *desc)h]j)}(h6int relay_file_mmap_prepare(struct vm_area_desc *desc)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hrelay_file_mmap_prepareh]j)}(hrelay_file_mmap_prepareh]hrelay_file_mmap_prepare}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct vm_area_desc *desc)h]j)}(hstruct vm_area_desc *desch](j)}(hjAh]hstruct}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjMmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.relay_file_mmap_prepareasbuh1hhj)ubj2)}(h h]h }(hjkhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hdesch]hdesc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj%ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hmmap file op for relay filesh]hmmap file op for relay files}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct vm_area_desc *desc`` describing what to map **Description** Calls upon relay_mmap_prepare_buf() to map the file into user space.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj )}(hhh]j)}(h5``struct vm_area_desc *desc`` describing what to map h](j)}(h``struct vm_area_desc *desc``h]j)}(hjh]hstruct vm_area_desc *desc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj2)}(hhh]h)}(hdescribing what to maph]hdescribing what to map}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj,h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj)}(hDCalls upon relay_mmap_prepare_buf() to map the file into user space.h]h)}(hjDh]hDCalls upon relay_mmap_prepare_buf() to map the file into user space.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjBubah}(h]h ]h"]h$]h&]uh1jhjShMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_file_poll (C function)c.relay_file_pollhNtauh1hhjhhhNhNubj)}(hhh](j)}(h>__poll_t relay_file_poll (struct file *filp, poll_table *wait)h]j)}(h=__poll_t relay_file_poll(struct file *filp, poll_table *wait)h](h)}(hhh]j)}(h__poll_th]h__poll_t}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY relay_file_pollsbc.relay_file_pollasbuh1hhjvhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvhhhjhMubj{)}(hrelay_file_pollh]j)}(hjh]hrelay_file_poll}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjvhhhjhMubj)}(h%(struct file *filp, poll_table *wait)h](j)}(hstruct file *filph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.relay_file_pollasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfilph]hfilp}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hpoll_table *waith](h)}(hhh]j)}(h poll_tableh]h poll_table}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjAmodnameN classnameNj] j` )}jc ]jc.relay_file_pollasbuh1hhj8ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubj)}(hjh]h*}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hwaith]hwait}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjvhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjrhhhjhMubah}(h]jmah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjohhubj)}(hhh]h)}(hpoll file op for relay filesh]hpoll file op for relay files}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjohhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h}**Parameters** ``struct file *filp`` the file ``poll_table *wait`` poll table **Description** Poll implemention.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj )}(hhh](j)}(h``struct file *filp`` the file h](j)}(h``struct file *filp``h]j)}(hjh]hstruct file *filp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj2)}(hhh]h)}(hthe fileh]hthe file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h ``poll_table *wait`` poll table h](j)}(h``poll_table *wait``h]j)}(hjh]hpoll_table *wait}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj2)}(hhh]h)}(h poll tableh]h poll table}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj2ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj1hMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjWh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj)}(hPoll implemention.h]h)}(hjoh]hPoll implemention.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjmubah}(h]h ]h"]h$]h&]uh1jhj~hMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j relay_file_release (C function)c.relay_file_releasehNtauh1hhjhhhNhNubj)}(hhh](j)}(h?int relay_file_release (struct inode *inode, struct file *filp)h]j)}(h>int relay_file_release(struct inode *inode, struct file *filp)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hrelay_file_releaseh]j)}(hrelay_file_releaseh]hrelay_file_release}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h((struct inode *inode, struct file *filp)h](j)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.relay_file_releaseasbuh1hhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinodeh]hinode}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct file *filph](j)}(hjAh]hstruct}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubh)}(hhh]j)}(hfileh]hfile}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]jc.relay_file_releaseasbuh1hhjPubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hfilph]hfilp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hrelease file op for relay filesh]hrelease file op for relay files}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct inode *inode`` the inode ``struct file *filp`` the file **Description** Decrements the channel refcount, as the filesystem is no longer using it.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj )}(hhh](j)}(h"``struct inode *inode`` the inode h](j)}(h``struct inode *inode``h]j)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj2)}(hhh]h)}(h the inodeh]h the inode}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj,ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj+hMhj ubj)}(h``struct file *filp`` the file h](j)}(h``struct file *filp``h]j)}(hjOh]hstruct file *filp}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjIubj2)}(hhh]h)}(hthe fileh]hthe file}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhMhjeubah}(h]h ]h"]h$]h&]uh1j1hjIubeh}(h]h ]h"]h$]h&]uh1jhjdhMhj ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj)}(hIDecrements the channel refcount, as the filesystem is no longer using it.h]h)}(hIDecrements the channel refcount, as the filesystem is no longer using it.h]hIDecrements the channel refcount, as the filesystem is no longer using it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )relay_file_read_subbuf_avail (C function)c.relay_file_read_subbuf_availhNtauh1hhjhhhNhNubj)}(hhh](j)}(hLsize_t relay_file_read_subbuf_avail (size_t read_pos, struct rchan_buf *buf)h]j)}(hKsize_t relay_file_read_subbuf_avail(size_t read_pos, struct rchan_buf *buf)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY relay_file_read_subbuf_availsbc.relay_file_read_subbuf_availasbuh1hhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMpubj{)}(hrelay_file_read_subbuf_availh]j)}(hjh]hrelay_file_read_subbuf_avail}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMpubj)}(h((size_t read_pos, struct rchan_buf *buf)h](j)}(hsize_t read_posh](h)}(hhh]j)}(hsize_th]hsize_t}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj0modnameN classnameNj] j` )}jc ]jc.relay_file_read_subbuf_availasbuh1hhj'ubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'ubj)}(hread_posh]hread_pos}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj#ubj)}(hstruct rchan_buf *bufh](j)}(hjAh]hstruct}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjoubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.relay_file_read_subbuf_availasbuh1hhjoubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjoubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj#ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMpubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMpubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMphjhhubj)}(hhh]h)}(h$return bytes available in sub-bufferh]h$return bytes available in sub-buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMphjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMpubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj)}(hj**Parameters** ``size_t read_pos`` file read position ``struct rchan_buf *buf`` relay channel bufferh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMthjubj )}(hhh](j)}(h'``size_t read_pos`` file read position h](j)}(h``size_t read_pos``h]j)}(hj5h]hsize_t read_pos}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMqhj/ubj2)}(hhh]h)}(hfile read positionh]hfile read position}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMqhjKubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhjJhMqhj,ubj)}(h.``struct rchan_buf *buf`` relay channel bufferh](j)}(h``struct rchan_buf *buf``h]j)}(hjnh]hstruct rchan_buf *buf}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMshjhubj2)}(hhh]h)}(hrelay channel bufferh]hrelay channel buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMrhjubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhjhMshj,ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &relay_file_read_start_pos (C function)c.relay_file_read_start_poshNtauh1hhjhhhNhNubj)}(hhh](j)}(h8size_t relay_file_read_start_pos (struct rchan_buf *buf)h]j)}(h7size_t relay_file_read_start_pos(struct rchan_buf *buf)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY relay_file_read_start_possbc.relay_file_read_start_posasbuh1hhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hrelay_file_read_start_posh]j)}(hjh]hrelay_file_read_start_pos}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct rchan_buf *buf)h]j)}(hstruct rchan_buf *bufh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj:modnameN classnameNj] j` )}jc ]jc.relay_file_read_start_posasbuh1hhjubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufh]hbuf}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h%find the first available byte to readh]h%find the first available byte to read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct rchan_buf *buf`` relay channel buffer **Description** If the read_pos is in the middle of padding, return the position of the first actually available byte, otherwise return the original value.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj )}(hhh]j)}(h/``struct rchan_buf *buf`` relay channel buffer h](j)}(h``struct rchan_buf *buf``h]j)}(hjh]hstruct rchan_buf *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj2)}(hhh]h)}(hrelay channel bufferh]hrelay channel buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj)}(hIf the read_pos is in the middle of padding, return the position of the first actually available byte, otherwise return the original value.h]h)}(hIf the read_pos is in the middle of padding, return the position of the first actually available byte, otherwise return the original value.h]hIf the read_pos is in the middle of padding, return the position of the first actually available byte, otherwise return the original value.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhj-ubah}(h]h ]h"]h$]h&]uh1jhj?hMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $relay_file_read_end_pos (C function)c.relay_file_read_end_poshNtauh1hhjhhhNhNubj)}(hhh](j)}(hUsize_t relay_file_read_end_pos (struct rchan_buf *buf, size_t read_pos, size_t count)h]j)}(hTsize_t relay_file_read_end_pos(struct rchan_buf *buf, size_t read_pos, size_t count)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjkmodnameN classnameNj] j` )}jc ]jf )}jY relay_file_read_end_possbc.relay_file_read_end_posasbuh1hhjbhhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbhhhjhMubj{)}(hrelay_file_read_end_posh]j)}(hjh]hrelay_file_read_end_pos}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjbhhhjhMubj)}(h6(struct rchan_buf *buf, size_t read_pos, size_t count)h](j)}(hstruct rchan_buf *bufh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h rchan_bufh]h rchan_buf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.relay_file_read_end_posasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsize_t read_posh](h)}(hhh]j)}(hsize_th]hsize_t}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj-modnameN classnameNj] j` )}jc ]jc.relay_file_read_end_posasbuh1hhj$ubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(hread_posh]hread_pos}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjumodnameN classnameNj] j` )}jc ]jc.relay_file_read_end_posasbuh1hhjlubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjbhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj^hhhjhMubah}(h]jYah ](jjeh"]h$]h&]jj)jhuh1jhjhMhj[hhubj)}(hhh]h)}(hreturn the new read positionh]hreturn the new read position}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj[hhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct rchan_buf *buf`` relay channel buffer ``size_t read_pos`` file read position ``size_t count`` number of bytes to be readh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj )}(hhh](j)}(h/``struct rchan_buf *buf`` relay channel buffer h](j)}(h``struct rchan_buf *buf``h]j)}(hj h]hstruct rchan_buf *buf}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubj2)}(hhh]h)}(hrelay channel bufferh]hrelay channel buffer}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h'``size_t read_pos`` file read position h](j)}(h``size_t read_pos``h]j)}(hjCh]hsize_t read_pos}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhj=ubj2)}(hhh]h)}(hfile read positionh]hfile read position}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMhjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhMhjubj)}(h+``size_t count`` number of bytes to be readh](j)}(h``size_t count``h]j)}(hj|h]h size_t count}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjvubj2)}(hhh]h)}(hnumber of bytes to be readh]hnumber of bytes to be read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:221: ./kernel/relay.chMhjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]relay-interfaceah ]h"]relay interfaceah$]h&]uh1hhjhhhhhKubeh}(h]relay-interface-supportah ]h"]relay interface supportah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hModule Supporth]hModule Support}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hKernel module auto-loadingh]hKernel module auto-loading}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __request_module (C function)c.__request_modulehNtauh1hhjhhhNhNubj)}(hhh](j)}(h6int __request_module (bool wait, const char *fmt, ...)h]j)}(h5int __request_module(bool wait, const char *fmt, ...)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:230: ./kernel/module/kmod.chKuubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKuubj{)}(h__request_moduleh]j)}(h__request_moduleh]h__request_module}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKuubj)}(h!(bool wait, const char *fmt, ...)h](j)}(h bool waith](j )}(hj8h]hbool}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjAubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubj)}(hwaith]hwait}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(hconst char *fmth](j)}(hjh]hconst}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjuubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjuubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjuubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj)}(hfmth]hfmt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(h...h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKuubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKuubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKuhjhhubj)}(hhh]h)}(htry to load a kernel moduleh]htry to load a kernel module}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:230: ./kernel/module/kmod.chKuhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKuubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``bool wait`` wait (or not) for the operation to complete ``const char *fmt`` printf style format string for the name of the module ``...`` arguments as specified in the format string **Description** Load a module using the user mode module loader. The function returns zero on success or a negative errno code or positive exit code from "modprobe" on failure. Note that a successful module load does not mean the module did not then unload and exit on an error of its own. Callers must check that the service they requested is now available not blindly invoke it. If module auto-loading support is disabled then this function simply returns -ENOENT.h](h)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:230: ./kernel/module/kmod.chKyhjubj )}(hhh](j)}(h:``bool wait`` wait (or not) for the operation to complete h](j)}(h ``bool wait``h]j)}(hj@h]h bool wait}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:230: ./kernel/module/kmod.chKvhj:ubj2)}(hhh]h)}(h+wait (or not) for the operation to completeh]h+wait (or not) for the operation to complete}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhKvhjVubah}(h]h ]h"]h$]h&]uh1j1hj:ubeh}(h]h ]h"]h$]h&]uh1jhjUhKvhj7ubj)}(hJ``const char *fmt`` printf style format string for the name of the module h](j)}(h``const char *fmt``h]j)}(hjyh]hconst char *fmt}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:230: ./kernel/module/kmod.chKwhjsubj2)}(hhh]h)}(h5printf style format string for the name of the moduleh]h5printf style format string for the name of the module}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKwhjubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjhKwhj7ubj)}(h4``...`` arguments as specified in the format string h](j)}(h``...``h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:230: ./kernel/module/kmod.chKxhjubj2)}(hhh]h)}(h+arguments as specified in the format stringh]h+arguments as specified in the format string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKxhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKxhj7ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:230: ./kernel/module/kmod.chKzhjubh)}(hXlLoad a module using the user mode module loader. The function returns zero on success or a negative errno code or positive exit code from "modprobe" on failure. Note that a successful module load does not mean the module did not then unload and exit on an error of its own. Callers must check that the service they requested is now available not blindly invoke it.h]hXpLoad a module using the user mode module loader. The function returns zero on success or a negative errno code or positive exit code from “modprobe” on failure. Note that a successful module load does not mean the module did not then unload and exit on an error of its own. Callers must check that the service they requested is now available not blindly invoke it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:230: ./kernel/module/kmod.chKyhjubh)}(hUIf module auto-loading support is disabled then this function simply returns -ENOENT.h]hUIf module auto-loading support is disabled then this function simply returns -ENOENT.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:230: ./kernel/module/kmod.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]kernel-module-auto-loadingah ]h"]kernel module auto-loadingah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hModule debuggingh]hModule debugging}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hhhhhKubh)}(hEnabling CONFIG_MODULE_STATS enables module debugging statistics which are useful to monitor and root cause memory pressure issues with module loading. These statistics are useful to allow us to improve production workloads.h]hEnabling CONFIG_MODULE_STATS enables module debugging statistics which are useful to monitor and root cause memory pressure issues with module loading. These statistics are useful to allow us to improve production workloads.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:236: ./kernel/module/stats.chKhj0hhubh)}(hX9The current module debugging statistics supported help keep track of module loading failures to enable improvements either for kernel module auto-loading usage (request_module()) or interactions with userspace. Statistics are provided to track all possible failures in the finit_module() path and memory wasted in this process space. Each of the failure counters are associated to a type of module loading failure which is known to incur a certain amount of memory allocation loss. In the worst case loading a module will fail after a 3 step memory allocation process:h]hX9The current module debugging statistics supported help keep track of module loading failures to enable improvements either for kernel module auto-loading usage (request_module()) or interactions with userspace. Statistics are provided to track all possible failures in the finit_module() path and memory wasted in this process space. Each of the failure counters are associated to a type of module loading failure which is known to incur a certain amount of memory allocation loss. In the worst case loading a module will fail after a 3 step memory allocation process:}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:236: ./kernel/module/stats.chKhj0hhubj)}(hXa) memory allocated with kernel_read_file_from_fd() b) module decompression processes the file read from kernel_read_file_from_fd(), and vmap() is used to map the decompressed module to a new local buffer which represents a copy of the decompressed module passed from userspace. The buffer from kernel_read_file_from_fd() is freed right away. c) layout_and_allocate() allocates space for the final resting place where we would keep the module if it were to be processed successfully. h]jG)}(hhh](j)}(h0memory allocated with kernel_read_file_from_fd()h]h)}(hjhh]h0memory allocated with kernel_read_file_from_fd()}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:236: ./kernel/module/stats.chK#hjfubah}(h]h ]h"]h$]h&]uh1jhjcubj)}(hXmodule decompression processes the file read from kernel_read_file_from_fd(), and vmap() is used to map the decompressed module to a new local buffer which represents a copy of the decompressed module passed from userspace. The buffer from kernel_read_file_from_fd() is freed right away.h]h)}(hXmodule decompression processes the file read from kernel_read_file_from_fd(), and vmap() is used to map the decompressed module to a new local buffer which represents a copy of the decompressed module passed from userspace. The buffer from kernel_read_file_from_fd() is freed right away.h]hXmodule decompression processes the file read from kernel_read_file_from_fd(), and vmap() is used to map the decompressed module to a new local buffer which represents a copy of the decompressed module passed from userspace. The buffer from kernel_read_file_from_fd() is freed right away.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:236: ./kernel/module/stats.chK$hj~ubah}(h]h ]h"]h$]h&]uh1jhjcubj)}(hlayout_and_allocate() allocates space for the final resting place where we would keep the module if it were to be processed successfully. h]h)}(hlayout_and_allocate() allocates space for the final resting place where we would keep the module if it were to be processed successfully.h]hlayout_and_allocate() allocates space for the final resting place where we would keep the module if it were to be processed successfully.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:236: ./kernel/module/stats.chK)hjubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]j}H loweralphajHhjHj:7uh1jGhj_ubah}(h]h ]h"]h$]h&]uh1jhjwhK#hj0hhubh)}(hXRIf a failure occurs after these three different allocations only one counter will be incremented with the summation of the allocated bytes freed incurred during this failure. Likewise, if module loading failed only after step b) a separate counter is used and incremented for the bytes freed and not used during both of those allocations.h]hXRIf a failure occurs after these three different allocations only one counter will be incremented with the summation of the allocated bytes freed incurred during this failure. Likewise, if module loading failed only after step b) a separate counter is used and incremented for the bytes freed and not used during both of those allocations.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:236: ./kernel/module/stats.chK-hj0hhubh)}(hX3Virtual memory space can be limited, for example on x86 virtual memory size defaults to 128 MiB. We should strive to limit and avoid wasting virtual memory allocations when possible. These module debugging statistics help to evaluate how much memory is being wasted on bootup due to module loading failures.h]hX3Virtual memory space can be limited, for example on x86 virtual memory size defaults to 128 MiB. We should strive to limit and avoid wasting virtual memory allocations when possible. These module debugging statistics help to evaluate how much memory is being wasted on bootup due to module loading failures.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:236: ./kernel/module/stats.chK3hj0hhubh)}(hyAll counters are designed to be incremental. Atomic counters are used so to remain simple and avoid delays and deadlocks.h]hyAll counters are designed to be incremental. Atomic counters are used so to remain simple and avoid delays and deadlocks.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:236: ./kernel/module/stats.chK9hj0hhubh)}(hhh](h)}(h4dup_failed_modules - tracks duplicate failed modulesh]h4dup_failed_modules - tracks duplicate failed modules}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hX;Linked list of modules which failed to be loaded because an already existing module with the same name was already being processed or already loaded. The finit_module() system call incurs heavy virtual memory allocations. In the worst case an finit_module() system call can end up allocating virtual memory 3 times:h]hX;Linked list of modules which failed to be loaded because an already existing module with the same name was already being processed or already loaded. The finit_module() system call incurs heavy virtual memory allocations. In the worst case an finit_module() system call can end up allocating virtual memory 3 times:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:242: ./kernel/module/stats.chK@hjhhubj)}(h1) kernel_read_file_from_fd() call uses vmalloc() 2) optional module decompression uses vmap() 3) layout_and allocate() can use vzalloc() or an arch specific variation of vmalloc to deal with ELF sections requiring special permissions h]jG)}(hhh](j)}(h.kernel_read_file_from_fd() call uses vmalloc()h]h)}(hjh]h.kernel_read_file_from_fd() call uses vmalloc()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:242: ./kernel/module/stats.chKFhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h)optional module decompression uses vmap()h]h)}(hj+h]h)optional module decompression uses vmap()}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:242: ./kernel/module/stats.chKGhj)ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hlayout_and allocate() can use vzalloc() or an arch specific variation of vmalloc to deal with ELF sections requiring special permissions h]h)}(hlayout_and allocate() can use vzalloc() or an arch specific variation of vmalloc to deal with ELF sections requiring special permissionsh]hlayout_and allocate() can use vzalloc() or an arch specific variation of vmalloc to deal with ELF sections requiring special permissions}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:242: ./kernel/module/stats.chKHhjAubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]j}Hj~HjHhjHj:7uh1jGhj ubah}(h]h ]h"]h$]h&]uh1jhj"hKFhjhhubh)}(hIn practice on a typical boot today most finit_module() calls fail due to the module with the same name already being loaded or about to be processed. All virtual memory allocated to these failed modules will be freed with no functional use.h]hIn practice on a typical boot today most finit_module() calls fail due to the module with the same name already being loaded or about to be processed. All virtual memory allocated to these failed modules will be freed with no functional use.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:242: ./kernel/module/stats.chKKhjhhubh)}(hX&To help with this the dup_failed_modules allows us to track modules which failed to load due to the fact that a module was already loaded or being processed. There are only two points at which we can fail such calls, we list them below along with the number of virtual memory allocation calls:h]hX&To help with this the dup_failed_modules allows us to track modules which failed to load due to the fact that a module was already loaded or being processed. There are only two points at which we can fail such calls, we list them below along with the number of virtual memory allocation calls:}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:242: ./kernel/module/stats.chKPhjhhubj)}(hXa) FAIL_DUP_MOD_BECOMING: at the end of early_mod_check() before layout_and_allocate(). - with module decompression: 2 virtual memory allocation calls - without module decompression: 1 virtual memory allocation calls b) FAIL_DUP_MOD_LOAD: after layout_and_allocate() on add_unformed_module() - with module decompression 3 virtual memory allocation calls - without module decompression 2 virtual memory allocation calls h]jG)}(hhh](j)}(hFAIL_DUP_MOD_BECOMING: at the end of early_mod_check() before layout_and_allocate(). - with module decompression: 2 virtual memory allocation calls - without module decompression: 1 virtual memory allocation callsh]h)}(hFAIL_DUP_MOD_BECOMING: at the end of early_mod_check() before layout_and_allocate(). - with module decompression: 2 virtual memory allocation calls - without module decompression: 1 virtual memory allocation callsh]hFAIL_DUP_MOD_BECOMING: at the end of early_mod_check() before layout_and_allocate(). - with module decompression: 2 virtual memory allocation calls - without module decompression: 1 virtual memory allocation calls}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:242: ./kernel/module/stats.chKVhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hFAIL_DUP_MOD_LOAD: after layout_and_allocate() on add_unformed_module() - with module decompression 3 virtual memory allocation calls - without module decompression 2 virtual memory allocation calls h]h)}(hFAIL_DUP_MOD_LOAD: after layout_and_allocate() on add_unformed_module() - with module decompression 3 virtual memory allocation calls - without module decompression 2 virtual memory allocation callsh]hFAIL_DUP_MOD_LOAD: after layout_and_allocate() on add_unformed_module() - with module decompression 3 virtual memory allocation calls - without module decompression 2 virtual memory allocation calls}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:242: ./kernel/module/stats.chKZhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]j}HjjHhjHj:7uh1jGhjubah}(h]h ]h"]h$]h&]uh1jhjhKVhjhhubh)}(hWe should strive to get this list to be as small as possible. If this list is not empty it is a reflection of possible work or optimizations possible either in-kernel or in userspace.h]hWe should strive to get this list to be as small as possible. If this list is not empty it is a reflection of possible work or optimizations possible either in-kernel or in userspace.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:242: ./kernel/module/stats.chK^hjhhubeh}(h]2dup-failed-modules-tracks-duplicate-failed-modulesah ]h"]4dup_failed_modules - tracks duplicate failed modulesah$]h&]uh1hhj0hhhhhKubh)}(hhh](h)}(h"module statistics debugfs countersh]h"module statistics debugfs counters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hThe total amount of wasted virtual memory allocation space during module loading can be computed by adding the total from the summation:h]hThe total amount of wasted virtual memory allocation space during module loading can be computed by adding the total from the summation:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKghjhhubj)}(ht* **invalid_kread_bytes** + **invalid_decompress_bytes** + **invalid_becoming_bytes** + **invalid_mod_bytes** h]j)}(hhh]j)}(hl**invalid_kread_bytes** + **invalid_decompress_bytes** + **invalid_becoming_bytes** + **invalid_mod_bytes** h]h)}(hk**invalid_kread_bytes** + **invalid_decompress_bytes** + **invalid_becoming_bytes** + **invalid_mod_bytes**h](j)}(h**invalid_kread_bytes**h]hinvalid_kread_bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh + }(hj hhhNhNubj)}(h**invalid_decompress_bytes**h]hinvalid_decompress_bytes}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh + }hj sbj)}(h**invalid_becoming_bytes**h]hinvalid_becoming_bytes}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh + }hj sbj)}(h**invalid_mod_bytes**h]hinvalid_mod_bytes}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKjhjubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjYhKjhjubah}(h]h ]h"]h$]h&]uh1jhjYhKjhjhhubh)}(hPThe following debugfs counters are available to inspect module loading failures:h]hPThe following debugfs counters are available to inspect module loading failures:}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKohjhhubj)}(hX * total_mod_size: total bytes ever used by all modules we've dealt with on this system * total_text_size: total bytes of the .text and .init.text ELF section sizes we've dealt with on this system * invalid_kread_bytes: bytes allocated and then freed on failures which happen due to the initial kernel_read_file_from_fd(). kernel_read_file_from_fd() uses vmalloc(). These should typically not happen unless your system is under memory pressure. * invalid_decompress_bytes: number of bytes allocated and freed due to memory allocations in the module decompression path that use vmap(). These typically should not happen unless your system is under memory pressure. * invalid_becoming_bytes: total number of bytes allocated and freed used to read the kernel module userspace wants us to read before we promote it to be processed to be added to our **modules** linked list. These failures can happen if we had a check in between a successful kernel_read_file_from_fd() call and right before we allocate the our private memory for the module which would be kept if the module is successfully loaded. The most common reason for this failure is when userspace is racing to load a module which it does not yet see loaded. The first module to succeed in add_unformed_module() will add a module to our :c:type:`modules` list and subsequent loads of modules with the same name will error out at the end of early_mod_check(). The check for module_patient_check_exists() at the end of early_mod_check() prevents duplicate allocations on layout_and_allocate() for modules already being processed. These duplicate failed modules are non-fatal, however they typically are indicative of userspace not seeing a module in userspace loaded yet and unnecessarily trying to load a module before the kernel even has a chance to begin to process prior requests. Although duplicate failures can be non-fatal, we should try to reduce vmalloc() pressure proactively, so ideally after boot this will be close to as 0 as possible. If module decompression was used we also add to this counter the cost of the initial kernel_read_file_from_fd() of the compressed module. If module decompression was not used the value represents the total allocated and freed bytes in kernel_read_file_from_fd() calls for these type of failures. These failures can occur because: * module_sig_check() - module signature checks * elf_validity_cache_copy() - some ELF validation issue * early_mod_check(): * blacklisting * failed to rewrite section headers * version magic * live patch requirements didn't check out * the module was detected as being already present * invalid_mod_bytes: these are the total number of bytes allocated and freed due to failures after we did all the sanity checks of the module which userspace passed to us and after our first check that the module is unique. A module can still fail to load if we detect the module is loaded after we allocate space for it with layout_and_allocate(), we do this check right before processing the module as live and run its initialization routines. Note that you have a failure of this type it also means the respective kernel_read_file_from_fd() memory space was also freed and not used, and so we increment this counter with twice the size of the module. Additionally if you used module decompression the size of the compressed module is also added to this counter. * modcount: how many modules we've loaded in our kernel life time * failed_kreads: how many modules failed due to failed kernel_read_file_from_fd() * failed_decompress: how many failed module decompression attempts we've had. These really should not happen unless your compression / decompression might be broken. * failed_becoming: how many modules failed after we kernel_read_file_from_fd() it and before we allocate memory for it with layout_and_allocate(). This counter is never incremented if you manage to validate the module and call layout_and_allocate() for it. * failed_load_modules: how many modules failed once we've allocated our private space for our module using layout_and_allocate(). These failures should hopefully mostly be dealt with already. Races in theory could still exist here, but it would just mean the kernel had started processing two threads concurrently up to early_mod_check() and one thread won. These failures are good signs the kernel or userspace is doing something seriously stupid or that could be improved. We should strive to fix these, but it is perhaps not easy to fix them. A recent example are the modules requests incurred for frequency modules, a separate module request was being issued for each CPU on a system. h](j)}(hX * total_mod_size: total bytes ever used by all modules we've dealt with on this system * total_text_size: total bytes of the .text and .init.text ELF section sizes we've dealt with on this system * invalid_kread_bytes: bytes allocated and then freed on failures which happen due to the initial kernel_read_file_from_fd(). kernel_read_file_from_fd() uses vmalloc(). These should typically not happen unless your system is under memory pressure. * invalid_decompress_bytes: number of bytes allocated and freed due to memory allocations in the module decompression path that use vmap(). These typically should not happen unless your system is under memory pressure. * invalid_becoming_bytes: total number of bytes allocated and freed used to read the kernel module userspace wants us to read before we promote it to be processed to be added to our **modules** linked list. These failures can happen if we had a check in between a successful kernel_read_file_from_fd() call and right before we allocate the our private memory for the module which would be kept if the module is successfully loaded. The most common reason for this failure is when userspace is racing to load a module which it does not yet see loaded. The first module to succeed in add_unformed_module() will add a module to our :c:type:`modules` list and subsequent loads of modules with the same name will error out at the end of early_mod_check(). The check for module_patient_check_exists() at the end of early_mod_check() prevents duplicate allocations on layout_and_allocate() for modules already being processed. These duplicate failed modules are non-fatal, however they typically are indicative of userspace not seeing a module in userspace loaded yet and unnecessarily trying to load a module before the kernel even has a chance to begin to process prior requests. Although duplicate failures can be non-fatal, we should try to reduce vmalloc() pressure proactively, so ideally after boot this will be close to as 0 as possible. If module decompression was used we also add to this counter the cost of the initial kernel_read_file_from_fd() of the compressed module. If module decompression was not used the value represents the total allocated and freed bytes in kernel_read_file_from_fd() calls for these type of failures. These failures can occur because: * module_sig_check() - module signature checks * elf_validity_cache_copy() - some ELF validation issue * early_mod_check(): * blacklisting * failed to rewrite section headers * version magic * live patch requirements didn't check out * the module was detected as being already present * invalid_mod_bytes: these are the total number of bytes allocated and freed due to failures after we did all the sanity checks of the module which userspace passed to us and after our first check that the module is unique. A module can still fail to load if we detect the module is loaded after we allocate space for it with layout_and_allocate(), we do this check right before processing the module as live and run its initialization routines. Note that you have a failure of this type it also means the respective kernel_read_file_from_fd() memory space was also freed and not used, and so we increment this counter with twice the size of the module. Additionally if you used module decompression the size of the compressed module is also added to this counter. h](j)}(hhh](j)}(hTtotal_mod_size: total bytes ever used by all modules we've dealt with on this systemh]h)}(hTtotal_mod_size: total bytes ever used by all modules we've dealt with on this systemh]hVtotal_mod_size: total bytes ever used by all modules we’ve dealt with on this system}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKrhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hjtotal_text_size: total bytes of the .text and .init.text ELF section sizes we've dealt with on this systemh]h)}(hjtotal_text_size: total bytes of the .text and .init.text ELF section sizes we've dealt with on this systemh]hltotal_text_size: total bytes of the .text and .init.text ELF section sizes we’ve dealt with on this system}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKthjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hinvalid_kread_bytes: bytes allocated and then freed on failures which happen due to the initial kernel_read_file_from_fd(). kernel_read_file_from_fd() uses vmalloc(). These should typically not happen unless your system is under memory pressure.h]h)}(hinvalid_kread_bytes: bytes allocated and then freed on failures which happen due to the initial kernel_read_file_from_fd(). kernel_read_file_from_fd() uses vmalloc(). These should typically not happen unless your system is under memory pressure.h]hinvalid_kread_bytes: bytes allocated and then freed on failures which happen due to the initial kernel_read_file_from_fd(). kernel_read_file_from_fd() uses vmalloc(). These should typically not happen unless your system is under memory pressure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKvhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hinvalid_decompress_bytes: number of bytes allocated and freed due to memory allocations in the module decompression path that use vmap(). These typically should not happen unless your system is under memory pressure.h]h)}(hinvalid_decompress_bytes: number of bytes allocated and freed due to memory allocations in the module decompression path that use vmap(). These typically should not happen unless your system is under memory pressure.h]hinvalid_decompress_bytes: number of bytes allocated and freed due to memory allocations in the module decompression path that use vmap(). These typically should not happen unless your system is under memory pressure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKzhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hXinvalid_becoming_bytes: total number of bytes allocated and freed used to read the kernel module userspace wants us to read before we promote it to be processed to be added to our **modules** linked list. These failures can happen if we had a check in between a successful kernel_read_file_from_fd() call and right before we allocate the our private memory for the module which would be kept if the module is successfully loaded. The most common reason for this failure is when userspace is racing to load a module which it does not yet see loaded. The first module to succeed in add_unformed_module() will add a module to our :c:type:`modules` list and subsequent loads of modules with the same name will error out at the end of early_mod_check(). The check for module_patient_check_exists() at the end of early_mod_check() prevents duplicate allocations on layout_and_allocate() for modules already being processed. These duplicate failed modules are non-fatal, however they typically are indicative of userspace not seeing a module in userspace loaded yet and unnecessarily trying to load a module before the kernel even has a chance to begin to process prior requests. Although duplicate failures can be non-fatal, we should try to reduce vmalloc() pressure proactively, so ideally after boot this will be close to as 0 as possible. If module decompression was used we also add to this counter the cost of the initial kernel_read_file_from_fd() of the compressed module. If module decompression was not used the value represents the total allocated and freed bytes in kernel_read_file_from_fd() calls for these type of failures. These failures can occur because: h]h)}(hXinvalid_becoming_bytes: total number of bytes allocated and freed used to read the kernel module userspace wants us to read before we promote it to be processed to be added to our **modules** linked list. These failures can happen if we had a check in between a successful kernel_read_file_from_fd() call and right before we allocate the our private memory for the module which would be kept if the module is successfully loaded. The most common reason for this failure is when userspace is racing to load a module which it does not yet see loaded. The first module to succeed in add_unformed_module() will add a module to our :c:type:`modules` list and subsequent loads of modules with the same name will error out at the end of early_mod_check(). The check for module_patient_check_exists() at the end of early_mod_check() prevents duplicate allocations on layout_and_allocate() for modules already being processed. These duplicate failed modules are non-fatal, however they typically are indicative of userspace not seeing a module in userspace loaded yet and unnecessarily trying to load a module before the kernel even has a chance to begin to process prior requests. Although duplicate failures can be non-fatal, we should try to reduce vmalloc() pressure proactively, so ideally after boot this will be close to as 0 as possible. If module decompression was used we also add to this counter the cost of the initial kernel_read_file_from_fd() of the compressed module. If module decompression was not used the value represents the total allocated and freed bytes in kernel_read_file_from_fd() calls for these type of failures. These failures can occur because:h](hinvalid_becoming_bytes: total number of bytes allocated and freed used to read the kernel module userspace wants us to read before we promote it to be processed to be added to our }(hjhhhNhNubj)}(h **modules**h]hmodules}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX linked list. These failures can happen if we had a check in between a successful kernel_read_file_from_fd() call and right before we allocate the our private memory for the module which would be kept if the module is successfully loaded. The most common reason for this failure is when userspace is racing to load a module which it does not yet see loaded. The first module to succeed in add_unformed_module() will add a module to our }(hjhhhNhNubh)}(h:c:type:`modules`h]j)}(hj h]hmodules}(hj hhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjmodulesuh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chK~hjubhX list and subsequent loads of modules with the same name will error out at the end of early_mod_check(). The check for module_patient_check_exists() at the end of early_mod_check() prevents duplicate allocations on layout_and_allocate() for modules already being processed. These duplicate failed modules are non-fatal, however they typically are indicative of userspace not seeing a module in userspace loaded yet and unnecessarily trying to load a module before the kernel even has a chance to begin to process prior requests. Although duplicate failures can be non-fatal, we should try to reduce vmalloc() pressure proactively, so ideally after boot this will be close to as 0 as possible. If module decompression was used we also add to this counter the cost of the initial kernel_read_file_from_fd() of the compressed module. If module decompression was not used the value represents the total allocated and freed bytes in kernel_read_file_from_fd() calls for these type of failures. These failures can occur because:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj'hK~hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhKrhjubj)}(hX(* module_sig_check() - module signature checks * elf_validity_cache_copy() - some ELF validation issue * early_mod_check(): * blacklisting * failed to rewrite section headers * version magic * live patch requirements didn't check out * the module was detected as being already present h]j)}(hhh](j)}(h,module_sig_check() - module signature checksh]h)}(hjGh]h,module_sig_check() - module signature checks}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjEubah}(h]h ]h"]h$]h&]uh1jhjBubj)}(h5elf_validity_cache_copy() - some ELF validation issueh]h)}(hj_h]h5elf_validity_cache_copy() - some ELF validation issue}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhj]ubah}(h]h ]h"]h$]h&]uh1jhjBubj)}(hearly_mod_check(): * blacklisting * failed to rewrite section headers * version magic * live patch requirements didn't check out * the module was detected as being already present h](h)}(hearly_mod_check():h]hearly_mod_check():}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjuubj)}(hhh](j)}(h blacklistingh]h)}(hjh]h blacklisting}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h!failed to rewrite section headersh]h)}(hjh]h!failed to rewrite section headers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h version magich]h)}(hjh]h version magic}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h(live patch requirements didn't check outh]h)}(hjh]h*live patch requirements didn’t check out}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h1the module was detected as being already present h]h)}(h0the module was detected as being already presenth]h0the module was detected as being already present}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhKhjuubeh}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]jjuh1jhjVhKhj>ubah}(h]h ]h"]h$]h&]uh1jhjVhKhjubj)}(hhh]j)}(hXinvalid_mod_bytes: these are the total number of bytes allocated and freed due to failures after we did all the sanity checks of the module which userspace passed to us and after our first check that the module is unique. A module can still fail to load if we detect the module is loaded after we allocate space for it with layout_and_allocate(), we do this check right before processing the module as live and run its initialization routines. Note that you have a failure of this type it also means the respective kernel_read_file_from_fd() memory space was also freed and not used, and so we increment this counter with twice the size of the module. Additionally if you used module decompression the size of the compressed module is also added to this counter. h]h)}(hXinvalid_mod_bytes: these are the total number of bytes allocated and freed due to failures after we did all the sanity checks of the module which userspace passed to us and after our first check that the module is unique. A module can still fail to load if we detect the module is loaded after we allocate space for it with layout_and_allocate(), we do this check right before processing the module as live and run its initialization routines. Note that you have a failure of this type it also means the respective kernel_read_file_from_fd() memory space was also freed and not used, and so we increment this counter with twice the size of the module. Additionally if you used module decompression the size of the compressed module is also added to this counter.h]hXinvalid_mod_bytes: these are the total number of bytes allocated and freed due to failures after we did all the sanity checks of the module which userspace passed to us and after our first check that the module is unique. A module can still fail to load if we detect the module is loaded after we allocate space for it with layout_and_allocate(), we do this check right before processing the module as live and run its initialization routines. Note that you have a failure of this type it also means the respective kernel_read_file_from_fd() memory space was also freed and not used, and so we increment this counter with twice the size of the module. Additionally if you used module decompression the size of the compressed module is also added to this counter.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhj1hKhjubeh}(h]h ]h"]h$]h&]uh1jhjhKrhj{ubj)}(hhh](j)}(h?modcount: how many modules we've loaded in our kernel life timeh]h)}(hjIh]hAmodcount: how many modules we’ve loaded in our kernel life time}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjGubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hOfailed_kreads: how many modules failed due to failed kernel_read_file_from_fd()h]h)}(hjah]hOfailed_kreads: how many modules failed due to failed kernel_read_file_from_fd()}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhj_ubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hfailed_decompress: how many failed module decompression attempts we've had. These really should not happen unless your compression / decompression might be broken.h]h)}(hfailed_decompress: how many failed module decompression attempts we've had. These really should not happen unless your compression / decompression might be broken.h]hfailed_decompress: how many failed module decompression attempts we’ve had. These really should not happen unless your compression / decompression might be broken.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjwubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hfailed_becoming: how many modules failed after we kernel_read_file_from_fd() it and before we allocate memory for it with layout_and_allocate(). This counter is never incremented if you manage to validate the module and call layout_and_allocate() for it.h]h)}(hfailed_becoming: how many modules failed after we kernel_read_file_from_fd() it and before we allocate memory for it with layout_and_allocate(). This counter is never incremented if you manage to validate the module and call layout_and_allocate() for it.h]hfailed_becoming: how many modules failed after we kernel_read_file_from_fd() it and before we allocate memory for it with layout_and_allocate(). This counter is never incremented if you manage to validate the module and call layout_and_allocate() for it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hXfailed_load_modules: how many modules failed once we've allocated our private space for our module using layout_and_allocate(). These failures should hopefully mostly be dealt with already. Races in theory could still exist here, but it would just mean the kernel had started processing two threads concurrently up to early_mod_check() and one thread won. These failures are good signs the kernel or userspace is doing something seriously stupid or that could be improved. We should strive to fix these, but it is perhaps not easy to fix them. A recent example are the modules requests incurred for frequency modules, a separate module request was being issued for each CPU on a system. h]h)}(hXfailed_load_modules: how many modules failed once we've allocated our private space for our module using layout_and_allocate(). These failures should hopefully mostly be dealt with already. Races in theory could still exist here, but it would just mean the kernel had started processing two threads concurrently up to early_mod_check() and one thread won. These failures are good signs the kernel or userspace is doing something seriously stupid or that could be improved. We should strive to fix these, but it is perhaps not easy to fix them. A recent example are the modules requests incurred for frequency modules, a separate module request was being issued for each CPU on a system.h]hXfailed_load_modules: how many modules failed once we’ve allocated our private space for our module using layout_and_allocate(). These failures should hopefully mostly be dealt with already. Races in theory could still exist here, but it would just mean the kernel had started processing two threads concurrently up to early_mod_check() and one thread won. These failures are good signs the kernel or userspace is doing something seriously stupid or that could be improved. We should strive to fix these, but it is perhaps not easy to fix them. A recent example are the modules requests incurred for frequency modules, a separate module request was being issued for each CPU on a system.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:248: ./kernel/module/stats.chKhjubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]jjuh1jhjXhKhj{ubeh}(h]h ]h"]h$]h&]uh1jhjhKrhjhhubeh}(h]"module-statistics-debugfs-countersah ]h"]"module statistics debugfs countersah$]h&]uh1hhj0hhhhhKubeh}(h]module-debuggingah ]h"]module debuggingah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hInter Module supporth]hInter Module support}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(h:Refer to the files in kernel/module/ for more information.h]h:Refer to the files in kernel/module/ for more information.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]inter-module-supportah ]h"]inter module supportah$]h&]uh1hhjhhhhhKubeh}(h]module-supportah ]h"]module supportah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hHardware Interfacesh]hHardware Interfaces}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubh)}(hhh](h)}(h DMA Channelsh]h DMA Channels}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j request_dma (C function) c.request_dmahNtauh1hhjhhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjDhhhjVhKBubj{)}(h request_dmah]j)}(h request_dmah]h request_dma}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjDhhhjVhKBubj)}(h+(unsigned int dmanr, const char *device_id)h](j)}(hunsigned int dmanrh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdmanrh]hdmanr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj}ubj)}(hconst char *device_idh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h device_idh]h device_id}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj}ubeh}(h]h ]h"]h$]h&]jjuh1jhjDhhhjVhKBubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj@hhhjVhKBubah}(h]j;ah ](jjeh"]h$]h&]jj)jhuh1jhjVhKBhj=hhubj)}(hhh]h)}(h(request and reserve a system DMA channelh]h(request and reserve a system DMA channel}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:262: ./kernel/dma.chKBhjAhhubah}(h]h ]h"]h$]h&]uh1jhj=hhhjVhKBubeh}(h]h ](jfunctioneh"]h$]h&]jjjj\jj\jjjuh1jhhhjhNhNubj)}(h**Parameters** ``unsigned int dmanr`` DMA channel number ``const char * device_id`` reserving device ID string, used in /proc/dmah](h)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:262: ./kernel/dma.chKFhj`ubj )}(hhh](j)}(h*``unsigned int dmanr`` DMA channel number h](j)}(h``unsigned int dmanr``h]j)}(hjh]hunsigned int dmanr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:262: ./kernel/dma.chKChjubj2)}(hhh]h)}(hDMA channel numberh]hDMA channel number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKChjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKChj|ubj)}(hH``const char * device_id`` reserving device ID string, used in /proc/dmah](j)}(h``const char * device_id``h]j)}(hjh]hconst char * device_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:262: ./kernel/dma.chKEhjubj2)}(hhh]h)}(h-reserving device ID string, used in /proc/dmah]h-reserving device ID string, used in /proc/dma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:262: ./kernel/dma.chKDhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKEhj|ubeh}(h]h ]h"]h$]h&]uh1j hj`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j free_dma (C function) c.free_dmahNtauh1hhjhhhNhNubj)}(hhh](j)}(h"void free_dma (unsigned int dmanr)h]j)}(h!void free_dma(unsigned int dmanr)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:262: ./kernel/dma.chKUubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj&hKUubj{)}(hfree_dmah]j)}(hfree_dmah]hfree_dma}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj&hKUubj)}(h(unsigned int dmanr)h]j)}(hunsigned int dmanrh](j )}(hunsignedh]hunsigned}(hjUhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj )}(hinth]hint}(hjqhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hdmanrh]hdmanr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj&hKUubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj&hKUubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj&hKUhj hhubj)}(hhh]h)}(h"free a reserved system DMA channelh]h"free a reserved system DMA channel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:262: ./kernel/dma.chKUhjhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj&hKUubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h;**Parameters** ``unsigned int dmanr`` DMA channel numberh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:262: ./kernel/dma.chKYhjubj )}(hhh]j)}(h)``unsigned int dmanr`` DMA channel numberh](j)}(h``unsigned int dmanr``h]j)}(hjh]hunsigned int dmanr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:262: ./kernel/dma.chK[hjubj2)}(hhh]h)}(hDMA channel numberh]hDMA channel number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:262: ./kernel/dma.chKVhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hK[hjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h] dma-channelsah ]h"] dma channelsah$]h&]uh1hhj hhhhhMubh)}(hhh](h)}(hResources Managementh]hResources Management}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhhhhhM ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &request_resource_conflict (C function)c.request_resource_conflicthNtauh1hhjAhhhNhNubj)}(hhh](j)}(hYstruct resource * request_resource_conflict (struct resource *root, struct resource *new)h]j)}(hWstruct resource *request_resource_conflict(struct resource *root, struct resource *new)h](j)}(hjAh]hstruct}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjghhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjghhhjxhMubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY request_resource_conflictsbc.request_resource_conflictasbuh1hhjghhhjxhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjghhhjxhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjghhhjxhMubj{)}(hrequest_resource_conflicth]j)}(hjh]hrequest_resource_conflict}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjghhhjxhMubj)}(h-(struct resource *root, struct resource *new)h](j)}(hstruct resource *rooth](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.request_resource_conflictasbuh1hhjubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrooth]hroot}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct resource *newh](j)}(hjAh]hstruct}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubh)}(hhh]j)}(hresourceh]hresource}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjumodnameN classnameNj] j` )}jc ]jc.request_resource_conflictasbuh1hhjQubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(hnewh]hnew}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjghhhjxhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjchhhjxhMubah}(h]j^ah ](jjeh"]h$]h&]jj)jhuh1jhjxhMhj`hhubj)}(hhh]h)}(h-request and reserve an I/O or memory resourceh]h-request and reserve an I/O or memory resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj`hhhjxhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjAhNhNubj)}(h**Parameters** ``struct resource *root`` root resource descriptor ``struct resource *new`` resource descriptor desired by caller **Description** Returns 0 for success, conflict resource on error.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubj )}(hhh](j)}(h3``struct resource *root`` root resource descriptor h](j)}(h``struct resource *root``h]j)}(hjh]hstruct resource *root}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubj2)}(hhh]h)}(hroot resource descriptorh]hroot resource descriptor}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj-ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj,hMhjubj)}(h?``struct resource *new`` resource descriptor desired by caller h](j)}(h``struct resource *new``h]j)}(hjPh]hstruct resource *new}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjJubj2)}(hhh]h)}(h%resource descriptor desired by callerh]h%resource descriptor desired by caller}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMhjfubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjehMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubh)}(h2Returns 0 for success, conflict resource on error.h]h2Returns 0 for success, conflict resource on error.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j find_next_res (C function)c.find_next_reshNtauh1hhjAhhhNhNubj)}(hhh](j)}(hint find_next_res (struct resource *parent, resource_size_t start, resource_size_t end, unsigned long flags, unsigned long desc, struct resource *res)h]j)}(hint find_next_res(struct resource *parent, resource_size_t start, resource_size_t end, unsigned long flags, unsigned long desc, struct resource *res)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMLubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMLubj{)}(h find_next_resh]j)}(h find_next_resh]h find_next_res}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMLubj)}(h(struct resource *parent, resource_size_t start, resource_size_t end, unsigned long flags, unsigned long desc, struct resource *res)h](j)}(hstruct resource *parenth](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hresourceh]hresource}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj-modnameN classnameNj] j` )}jc ]jf )}jY jsbc.find_next_resasbuh1hhj ubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hparenth]hparent}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hresource_size_t starth](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jGc.find_next_resasbuh1hhj{ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hresource_size_t endh](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jGc.find_next_resasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hendh]hend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long flagsh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hlongh]hlong}(hj+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hflagsh]hflags}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long desch](j )}(hunsignedh]hunsigned}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj )}(hlongh]hlong}(hj|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj)}(hdesch]hdesc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct resource *resh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jGc.find_next_resasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hresh]hres}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMLubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMLubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMLhjhhubj)}(hhh]h)}(hCFinds the lowest resource that covers part of [**start**..**end**].h](h/Finds the lowest resource that covers part of [}(hj2hhhNhNubj)}(h **start**h]hstart}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh ..**end**].}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMLhj/hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMLubeh}(h]h ](jfunctioneh"]h$]h&]jjjj\jj\jjjuh1jhhhjAhNhNubj)}(hX**Parameters** ``struct resource *parent`` resource tree root to search ``resource_size_t start`` start address of the resource searched for ``resource_size_t end`` end address of same resource ``unsigned long flags`` flags which the resource must have ``unsigned long desc`` descriptor the resource must have ``struct resource *res`` return ptr, if resource found **Description** If a resource is found, returns 0 and *****res is overwritten with the part of the resource that's within [**start**..**end**]; if none is found, returns -ENODEV. Returns -EINVAL for invalid parameters. The caller must specify **start**, **end**, **flags**, and **desc** (which may be IORES_DESC_NONE).h](h)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMPhj`ubj )}(hhh](j)}(h9``struct resource *parent`` resource tree root to search h](j)}(h``struct resource *parent``h]j)}(hjh]hstruct resource *parent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMShjubj2)}(hhh]h)}(hresource tree root to searchh]hresource tree root to search}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMShjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMShj|ubj)}(hE``resource_size_t start`` start address of the resource searched for h](j)}(h``resource_size_t start``h]j)}(hjh]hresource_size_t start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMThjubj2)}(hhh]h)}(h*start address of the resource searched forh]h*start address of the resource searched for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMThjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMThj|ubj)}(h5``resource_size_t end`` end address of same resource h](j)}(h``resource_size_t end``h]j)}(hjh]hresource_size_t end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMUhjubj2)}(hhh]h)}(hend address of same resourceh]hend address of same resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMUhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMUhj|ubj)}(h;``unsigned long flags`` flags which the resource must have h](j)}(h``unsigned long flags``h]j)}(hj0h]hunsigned long flags}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMVhj*ubj2)}(hhh]h)}(h"flags which the resource must haveh]h"flags which the resource must have}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhMVhjFubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhjEh>MVhj|ubj)}(h9``unsigned long desc`` descriptor the resource must have h](j)}(h``unsigned long desc``h]j)}(hjih]hunsigned long desc}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMWhjcubj2)}(hhh]h)}(h!descriptor the resource must haveh]h!descriptor the resource must have}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hMWhjubah}(h]h ]h"]h$]h&]uh1j1hjcubeh}(h]h ]h"]h$]h&]uh1jhj~hMWhj|ubj)}(h7``struct resource *res`` return ptr, if resource found h](j)}(h``struct resource *res``h]j)}(hjh]hstruct resource *res}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMXhjubj2)}(hhh]h)}(hreturn ptr, if resource foundh]hreturn ptr, if resource found}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMXhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMXhj|ubeh}(h]h ]h"]h$]h&]uh1j hj`ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMZhj`ubh)}(hIf a resource is found, returns 0 and *****res is overwritten with the part of the resource that's within [**start**..**end**]; if none is found, returns -ENODEV. Returns -EINVAL for invalid parameters.h](h&If a resource is found, returns 0 and }(hjhhhNhNubj)}(hN*****res is overwritten with the part of the resource that's within [**start**h]hL***res is overwritten with the part of the resource that’s within [**start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhW..**end**]; if none is found, returns -ENODEV. Returns -EINVAL for invalid parameters.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMMhj`ubh)}(hcThe caller must specify **start**, **end**, **flags**, and **desc** (which may be IORES_DESC_NONE).h](hThe caller must specify }(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, }hjsbj)}(h **flags**h]hflags}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, and }(hjhhhNhNubj)}(h**desc**h]hdesc}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh (which may be IORES_DESC_NONE).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMRhj`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  reallocate_resource (C function)c.reallocate_resourcehNtauh1hhjAhhhNhNubj)}(hhh](j)}(hint reallocate_resource (struct resource *root, struct resource *old, resource_size_t newsize, struct resource_constraint *constraint)h]j)}(hint reallocate_resource(struct resource *root, struct resource *old, resource_size_t newsize, struct resource_constraint *constraint)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chM)ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM)ubj{)}(hreallocate_resourceh]j)}(hreallocate_resourceh]hreallocate_resource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM)ubj)}(hn(struct resource *root, struct resource *old, resource_size_t newsize, struct resource_constraint *constraint)h](j)}(hstruct resource *rooth](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.reallocate_resourceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrooth]hroot}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct resource *oldh](j)}(hjAh]hstruct}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubh)}(hhh]j)}(hresourceh]hresource}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjZmodnameN classnameNj] j` )}jc ]jc.reallocate_resourceasbuh1hhj6ubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(holdh]hold}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hresource_size_t newsizeh](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.reallocate_resourceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnewsizeh]hnewsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h&struct resource_constraint *constrainth](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresource_constrainth]hresource_constraint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.reallocate_resourceasbuh1hhjubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h constrainth]h constraint}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM)ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM)ubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhjhM)hjhhubj)}(hhh]h)}(hallocate a slot in the resource tree given range & alignment. The resource will be relocated if the new size cannot be reallocated in the current location.h]hallocate a slot in the resource tree given range & alignment. The resource will be relocated if the new size cannot be reallocated in the current location.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chM)hjphhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM)ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjAhNhNubj)}(hX-**Parameters** ``struct resource *root`` root resource descriptor ``struct resource *old`` resource descriptor desired by caller ``resource_size_t newsize`` new size of the resource descriptor ``struct resource_constraint *constraint`` the memory range and alignment constraints to be met.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chM-hjubj )}(hhh](j)}(h3``struct resource *root`` root resource descriptor h](j)}(h``struct resource *root``h]j)}(hjh]hstruct resource *root}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chM-hjubj2)}(hhh]h)}(hroot resource descriptorh]hroot resource descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM-hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM-hjubj)}(h?``struct resource *old`` resource descriptor desired by caller h](j)}(h``struct resource *old``h]j)}(hjh]hstruct resource *old}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chM.hjubj2)}(hhh]h)}(h%resource descriptor desired by callerh]h%resource descriptor desired by caller}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM.hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM.hjubj)}(h@``resource_size_t newsize`` new size of the resource descriptor h](j)}(h``resource_size_t newsize``h]j)}(hj&h]hresource_size_t newsize}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chM/hj ubj2)}(hhh]h)}(h#new size of the resource descriptorh]h#new size of the resource descriptor}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hM/hj<ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj;hM/hjubj)}(h```struct resource_constraint *constraint`` the memory range and alignment constraints to be met.h](j)}(h*``struct resource_constraint *constraint``h]j)}(hj_h]h&struct resource_constraint *constraint}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chM1hjYubj2)}(hhh]h)}(h5the memory range and alignment constraints to be met.h]h5the memory range and alignment constraints to be met.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chM0hjuubah}(h]h ]h"]h$]h&]uh1j1hjYubeh}(h]h ]h"]h$]h&]uh1jhjthM1hjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lookup_resource (C function)c.lookup_resourcehNtauh1hhjAhhhNhNubj)}(hhh](j)}(hPstruct resource * lookup_resource (struct resource *root, resource_size_t start)h]j)}(hNstruct resource *lookup_resource(struct resource *root, resource_size_t start)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY lookup_resourcesbc.lookup_resourceasbuh1hhjhhhjhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj{)}(hlookup_resourceh]j)}(hjh]hlookup_resource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h.(struct resource *root, resource_size_t start)h](j)}(hstruct resource *rooth](j)}(hjAh]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubh)}(hhh]j)}(hresourceh]hresource}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjSmodnameN classnameNj] j` )}jc ]jc.lookup_resourceasbuh1hhj/ubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hrooth]hroot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(hresource_size_t starth](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.lookup_resourceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h5find an existing resource by a resource start addressh]h5find an existing resource by a resource start address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjAhNhNubj)}(h**Parameters** ``struct resource *root`` root resource descriptor ``resource_size_t start`` resource start address **Description** Returns a pointer to the resource if found, NULL otherwiseh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubj )}(hhh](j)}(h3``struct resource *root`` root resource descriptor h](j)}(h``struct resource *root``h]j)}(hj=h]hstruct resource *root}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj7ubj2)}(hhh]h)}(hroot resource descriptorh]hroot resource descriptor}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhjSubah}(h]h ]h"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhMhj4ubj)}(h1``resource_size_t start`` resource start address h](j)}(h``resource_size_t start``h]j)}(hjvh]hresource_size_t start}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjpubj2)}(hhh]h)}(hresource start addressh]hresource start address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhjhMhj4ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubh)}(h:Returns a pointer to the resource if found, NULL otherwiseh]h:Returns a pointer to the resource if found, NULL otherwise}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %insert_resource_conflict (C function)c.insert_resource_conflicthNtauh1hhjAhhhNhNubj)}(hhh](j)}(hZstruct resource * insert_resource_conflict (struct resource *parent, struct resource *new)h]j)}(hXstruct resource *insert_resource_conflict(struct resource *parent, struct resource *new)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY insert_resource_conflictsbc.insert_resource_conflictasbuh1hhjhhhjhMubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj)}(hjh]h*}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj{)}(hinsert_resource_conflicth]j)}(hj3h]hinsert_resource_conflict}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h/(struct resource *parent, struct resource *new)h](j)}(hstruct resource *parenth](j)}(hjAh]hstruct}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j1c.insert_resource_conflictasbuh1hhjlubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hparenth]hparent}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubj)}(hstruct resource *newh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j1c.insert_resource_conflictasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnewh]hnew}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h%Inserts resource in the resource treeh]h%Inserts resource in the resource tree}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj^hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjyjjyjjjuh1jhhhjAhNhNubj)}(hXT**Parameters** ``struct resource *parent`` parent of the new resource ``struct resource *new`` new resource to insert **Description** Returns 0 on success, conflict resource if the resource can't be inserted. This function is equivalent to request_resource_conflict when no conflict happens. If a conflict happens, and the conflicting resources entirely fit within the range of the new resource, then the new resource is inserted and the conflicting resources become children of the new resource. This function is intended for producers of resources, such as FW modules and bus drivers.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj}ubj )}(hhh](j)}(h7``struct resource *parent`` parent of the new resource h](j)}(h``struct resource *parent``h]j)}(hjh]hstruct resource *parent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubj2)}(hhh]h)}(hparent of the new resourceh]hparent of the new resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h0``struct resource *new`` new resource to insert h](j)}(h``struct resource *new``h]j)}(hjh]hstruct resource *new}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubj2)}(hhh]h)}(hnew resource to inserth]hnew resource to insert}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hj}ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj}ubh)}(hJReturns 0 on success, conflict resource if the resource can't be inserted.h]hLReturns 0 on success, conflict resource if the resource can’t be inserted.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj}ubh)}(hXThis function is equivalent to request_resource_conflict when no conflict happens. If a conflict happens, and the conflicting resources entirely fit within the range of the new resource, then the new resource is inserted and the conflicting resources become children of the new resource.h]hXThis function is equivalent to request_resource_conflict when no conflict happens. If a conflict happens, and the conflicting resources entirely fit within the range of the new resource, then the new resource is inserted and the conflicting resources become children of the new resource.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj}ubh)}(hYThis function is intended for producers of resources, such as FW modules and bus drivers.h]hYThis function is intended for producers of resources, such as FW modules and bus drivers.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j resource_alignment (C function)c.resource_alignmenthNtauh1hhjAhhhNhNubj)}(hhh](j)}(h?resource_size_t resource_alignment (const struct resource *res)h]j)}(h>resource_size_t resource_alignment(const struct resource *res)h](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj~modnameN classnameNj] j` )}jc ]jf )}jY resource_alignmentsbc.resource_alignmentasbuh1hhjuhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjuhhhjhMubj{)}(hresource_alignmenth]j)}(hjh]hresource_alignment}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjuhhhjhMubj)}(h(const struct resource *res)h]j)}(hconst struct resource *resh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.resource_alignmentasbuh1hhjubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hresh]hres}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjuhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjqhhhjhMubah}(h]jlah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjnhhubj)}(hhh]h)}(hcalculate resource's alignmenth]h calculate resource’s alignment}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjdhhubah}(h]h ]h"]h$]h&]uh1jhjnhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjAhNhNubj)}(h**Parameters** ``const struct resource *res`` resource pointer **Description** Returns alignment on success, 0 (invalid alignment) on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubj )}(hhh]j)}(h0``const struct resource *res`` resource pointer h](j)}(h``const struct resource *res``h]j)}(hjh]hconst struct resource *res}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubj2)}(hhh]h)}(hresource pointerh]hresource pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubh)}(h?Returns alignment on success, 0 (invalid alignment) on failure.h]h?Returns alignment on success, 0 (invalid alignment) on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *release_mem_region_adjustable (C function)c.release_mem_region_adjustablehNtauh1hhjAhhhNhNubj)}(hhh](j)}(hPvoid release_mem_region_adjustable (resource_size_t start, resource_size_t size)h]j)}(hOvoid release_mem_region_adjustable(resource_size_t start, resource_size_t size)h](j )}(hvoidh]hvoid}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$hhhj6hMubj{)}(hrelease_mem_region_adjustableh]j)}(hrelease_mem_region_adjustableh]hrelease_mem_region_adjustable}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj$hhhj6hMubj)}(h-(resource_size_t start, resource_size_t size)h](j)}(hresource_size_t starth](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjjmodnameN classnameNj] j` )}jc ]jf )}jY jKsbc.release_mem_region_adjustableasbuh1hhjaubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(hresource_size_t sizeh](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.release_mem_region_adjustableasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubeh}(h]h ]h"]h$]h&]jjuh1jhj$hhhj6hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj6hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj6hMhjhhubj)}(hhh]h)}(h+release a previously reserved memory regionh]h+release a previously reserved memory region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj6hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjAhNhNubj)}(hX**Parameters** ``resource_size_t start`` resource start address ``resource_size_t size`` resource region size **Description** This interface is intended for memory hot-delete. The requested region is released from a currently busy memory resource. The requested region must either match exactly or fit into a single busy resource entry. In the latter case, the remaining resource is adjusted accordingly. **Note** - Additional release conditions, such as overlapping region, can be supported after they are confirmed as valid cases. - When a busy memory resource gets split into two entries, its children are reassigned to the correct parent based on their range. If a child memory resource overlaps with more than one parent, enhance the logic as needed.h](h)}(h**Parameters**h]j)}(hj*h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj$ubj )}(hhh](j)}(h1``resource_size_t start`` resource start address h](j)}(h``resource_size_t start``h]j)}(hjIh]hresource_size_t start}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjCubj2)}(hhh]h)}(hresource start addressh]hresource start address}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hMhj_ubah}(h]h ]h"]h$]h&]uh1j1hjCubeh}(h]h ]h"]h$]h&]uh1jhj^hMhj@ubj)}(h.``resource_size_t size`` resource region size h](j)}(h``resource_size_t size``h]j)}(hjh]hresource_size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj|ubj2)}(hhh]h)}(hresource region sizeh]hresource region size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj|ubeh}(h]h ]h"]h$]h&]uh1jhjhMhj@ubeh}(h]h ]h"]h$]h&]uh1j hj$ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj$ubh)}(hXThis interface is intended for memory hot-delete. The requested region is released from a currently busy memory resource. The requested region must either match exactly or fit into a single busy resource entry. In the latter case, the remaining resource is adjusted accordingly.h]hXThis interface is intended for memory hot-delete. The requested region is released from a currently busy memory resource. The requested region must either match exactly or fit into a single busy resource entry. In the latter case, the remaining resource is adjusted accordingly.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj$ubh)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhj$ubj)}(hhh](j)}(htAdditional release conditions, such as overlapping region, can be supported after they are confirmed as valid cases.h]h)}(htAdditional release conditions, such as overlapping region, can be supported after they are confirmed as valid cases.h]htAdditional release conditions, such as overlapping region, can be supported after they are confirmed as valid cases.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hWhen a busy memory resource gets split into two entries, its children are reassigned to the correct parent based on their range. If a child memory resource overlaps with more than one parent, enhance the logic as needed.h]h)}(hWhen a busy memory resource gets split into two entries, its children are reassigned to the correct parent based on their range. If a child memory resource overlaps with more than one parent, enhance the logic as needed.h]hWhen a busy memory resource gets split into two entries, its children are reassigned to the correct parent based on their range. If a child memory resource overlaps with more than one parent, enhance the logic as needed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhMhj$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &merge_system_ram_resource (C function)c.merge_system_ram_resourcehNtauh1hhjAhhhNhNubj)}(hhh](j)}(h5void merge_system_ram_resource (struct resource *res)h]j)}(h4void merge_system_ram_resource(struct resource *res)h](j )}(hvoidh]hvoid}(hjUhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjQhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMJubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQhhhjchMJubj{)}(hmerge_system_ram_resourceh]j)}(hmerge_system_ram_resourceh]hmerge_system_ram_resource}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjQhhhjchMJubj)}(h(struct resource *res)h]j)}(hstruct resource *resh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jxsbc.merge_system_ram_resourceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hresh]hres}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjQhhhjchMJubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjMhhhjchMJubah}(h]jHah ](jjeh"]h$]h&]jj)jhuh1jhjchMJhjJhhubj)}(hhh]h)}(h]mark the System RAM resource mergeable and try to merge it with adjacent, mergeable resourcesh]h]mark the System RAM resource mergeable and try to merge it with adjacent, mergeable resources}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMJhjhhubah}(h]h ]h"]h$]h&]uh1jhjJhhhjchMJubeh}(h]h ](jfunctioneh"]h$]h&]jjjj-jj-jjjuh1jhhhjAhNhNubj)}(hX**Parameters** ``struct resource *res`` resource descriptor **Description** This interface is intended for memory hotplug, whereby lots of contiguous system ram resources are added (e.g., via add_memory*()) by a driver, and the actual resource boundaries are not of interest (e.g., it might be relevant for DIMMs). Only resources that are marked mergeable, that have the same parent, and that don't have any children are considered. All mergeable resources must be immutable during the request. **Note** - The caller has to make sure that no pointers to resources that are marked mergeable are used anymore after this call - the resource might be freed and the pointer might be stale! - release_mem_region_adjustable() will split on demand on memory hotunplugh](h)}(h**Parameters**h]j)}(hj7h]h Parameters}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMNhj1ubj )}(hhh]j)}(h-``struct resource *res`` resource descriptor h](j)}(h``struct resource *res``h]j)}(hjVh]hstruct resource *res}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMLhjPubj2)}(hhh]h)}(hresource descriptorh]hresource descriptor}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMLhjlubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhjkhMLhjMubah}(h]h ]h"]h$]h&]uh1j hj1ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMNhj1ubh)}(hXThis interface is intended for memory hotplug, whereby lots of contiguous system ram resources are added (e.g., via add_memory*()) by a driver, and the actual resource boundaries are not of interest (e.g., it might be relevant for DIMMs). Only resources that are marked mergeable, that have the same parent, and that don't have any children are considered. All mergeable resources must be immutable during the request.h]hXThis interface is intended for memory hotplug, whereby lots of contiguous system ram resources are added (e.g., via add_memory*()) by a driver, and the actual resource boundaries are not of interest (e.g., it might be relevant for DIMMs). Only resources that are marked mergeable, that have the same parent, and that don’t have any children are considered. All mergeable resources must be immutable during the request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMMhj1ubh)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMThj1ubj)}(hhh](j)}(hThe caller has to make sure that no pointers to resources that are marked mergeable are used anymore after this call - the resource might be freed and the pointer might be stale!h]h)}(hThe caller has to make sure that no pointers to resources that are marked mergeable are used anymore after this call - the resource might be freed and the pointer might be stale!h]hThe caller has to make sure that no pointers to resources that are marked mergeable are used anymore after this call - the resource might be freed and the pointer might be stale!}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMUhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hHrelease_mem_region_adjustable() will split on demand on memory hotunplugh]h)}(hjh]hHrelease_mem_region_adjustable() will split on demand on memory hotunplug}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:268: ./kernel/resource.chMXhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhMUhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j request_resource (C function)c.request_resourcehNtauh1hhjAhhhNhNubj)}(hhh](j)}(hBint request_resource (struct resource *root, struct resource *new)h]j)}(hAint request_resource(struct resource *root, struct resource *new)h](j )}(hinth]hint}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM&ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$hhhj6hM&ubj{)}(hrequest_resourceh]j)}(hrequest_resourceh]hrequest_resource}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj$hhhj6hM&ubj)}(h-(struct resource *root, struct resource *new)h](j)}(hstruct resource *rooth](j)}(hjAh]hstruct}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jKsbc.request_resourceasbuh1hhjaubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj)}(hrooth]hroot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(hstruct resource *newh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.request_resourceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnewh]hnew}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubeh}(h]h ]h"]h$]h&]jjuh1jhj$hhhj6hM&ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj6hM&ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj6hM&hjhhubj)}(hhh]h)}(h-request and reserve an I/O or memory resourceh]h-request and reserve an I/O or memory resource}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM&hjUhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj6hM&ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjpjjpjjjuh1jhhhjAhNhNubj)}(h**Parameters** ``struct resource *root`` root resource descriptor ``struct resource *new`` resource descriptor desired by caller **Description** Returns 0 for success, negative error code on error.h](h)}(h**Parameters**h]j)}(hjzh]h Parameters}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM*hjtubj )}(hhh](j)}(h3``struct resource *root`` root resource descriptor h](j)}(h``struct resource *root``h]j)}(hjh]hstruct resource *root}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM'hjubj2)}(hhh]h)}(hroot resource descriptorh]hroot resource descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM'hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM'hjubj)}(h?``struct resource *new`` resource descriptor desired by caller h](j)}(h``struct resource *new``h]j)}(hjh]hstruct resource *new}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM(hjubj2)}(hhh]h)}(h%resource descriptor desired by callerh]h%resource descriptor desired by caller}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM(hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM(hjubeh}(h]h ]h"]h$]h&]uh1j hjtubh)}(h**Description**h]j)}(hj h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM*hjtubh)}(h4Returns 0 for success, negative error code on error.h]h4Returns 0 for success, negative error code on error.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM)hjtubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j release_resource (C function)c.release_resourcehNtauh1hhjAhhhNhNubj)}(hhh](j)}(h+int release_resource (struct resource *old)h]j)}(h*int release_resource(struct resource *old)h](j )}(hinth]hint}(hjRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjNhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM7ubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNhhhj`hM7ubj{)}(hrelease_resourceh]j)}(hrelease_resourceh]hrelease_resource}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjNhhhj`hM7ubj)}(h(struct resource *old)h]j)}(hstruct resource *oldh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jusbc.release_resourceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(holdh]hold}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjNhhhj`hM7ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjJhhhj`hM7ubah}(h]jEah ](jjeh"]h$]h&]jj)jhuh1jhj`hM7hjGhhubj)}(hhh]h)}(h&release a previously reserved resourceh]h&release a previously reserved resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM7hjhhubah}(h]h ]h"]h$]h&]uh1jhjGhhhj`hM7ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj*jj*jjjuh1jhhhjAhNhNubj)}(h;**Parameters** ``struct resource *old`` resource pointerh](h)}(h**Parameters**h]j)}(hj4h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM;hj.ubj )}(hhh]j)}(h)``struct resource *old`` resource pointerh](j)}(h``struct resource *old``h]j)}(hjSh]hstruct resource *old}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM=hjMubj2)}(hhh]h)}(hresource pointerh]hresource pointer}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM8hjiubah}(h]h ]h"]h$]h&]uh1j1hjMubeh}(h]h ]h"]h$]h&]uh1jhjhhM=hjJubah}(h]h ]h"]h$]h&]uh1j hj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  walk_iomem_res_desc (C function)c.walk_iomem_res_deschNtauh1hhjAhhhNhNubj)}(hhh](j)}(hint walk_iomem_res_desc (unsigned long desc, unsigned long flags, u64 start, u64 end, void *arg, int (*func)(struct resource *, void *))h]j)}(hint walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end, void *arg, int (*func)(struct resource*, void*))h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hwalk_iomem_res_desch]j)}(hwalk_iomem_res_desch]hwalk_iomem_res_desc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hn(unsigned long desc, unsigned long flags, u64 start, u64 end, void *arg, int (*func)(struct resource*, void*))h](j)}(hunsigned long desch](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdesch]hdesc}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long flagsh](j )}(hunsignedh]hunsigned}(hj;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj7ubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7ubj )}(hlongh]hlong}(hjWhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj7ubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7ubj)}(hflagsh]hflags}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h u64 starth](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.walk_iomem_res_descasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hu64 endh](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.walk_iomem_res_descasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hendh]hend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h void *argh](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hargh]harg}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h$int (*func)(struct resource*, void*)h](j )}(hinth]hint}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj)}(hj7h]h(}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hfunch]hfunc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hj:7h]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hj7h]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.walk_iomem_res_descasbuh1hhj\ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hj7h]h,}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj )}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\ubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hj:7h]h)}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hOWalks through iomem resources and calls func() with matching resource ranges. *h]hOWalks through iomem resources and calls func() with matching resource ranges. *}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjchhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj~jj~jjjuh1jhhhjAhNhNubj)}(hXv**Parameters** ``unsigned long desc`` I/O resource descriptor. Use IORES_DESC_NONE to skip **desc** check. ``unsigned long flags`` I/O resource flags ``u64 start`` start addr ``u64 end`` end addr ``void *arg`` function argument for the callback **func** ``int (*func)(struct resource *, void *)`` callback function that is called for each qualifying resource area **Description** All the memory ranges which overlap start,end and also match flags and desc are valid candidates. **NOTE** For a new descriptor search, define a new IORES_DESC in and set it in 'desc' of a target resource entry.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj )}(hhh](j)}(h\``unsigned long desc`` I/O resource descriptor. Use IORES_DESC_NONE to skip **desc** check. h](j)}(h``unsigned long desc``h]j)}(hjh]hunsigned long desc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj2)}(hhh]h)}(hDI/O resource descriptor. Use IORES_DESC_NONE to skip **desc** check.h](h5I/O resource descriptor. Use IORES_DESC_NONE to skip }(hjhhhNhNubj)}(h**desc**h]hdesc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh check.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h+``unsigned long flags`` I/O resource flags h](j)}(h``unsigned long flags``h]j)}(hjh]hunsigned long flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj2)}(hhh]h)}(hI/O resource flagsh]hI/O resource flags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``u64 start`` start addr h](j)}(h ``u64 start``h]j)}(hj+h]h u64 start}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj%ubj2)}(hhh]h)}(h start addrh]h start addr}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhjAubah}(h]h ]h"]h$]h&]uh1j1hj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhjubj)}(h``u64 end`` end addr h](j)}(h ``u64 end``h]j)}(hjdh]hu64 end}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj^ubj2)}(hhh]h)}(hend addrh]hend addr}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhMhjzubah}(h]h ]h"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjubj)}(h:``void *arg`` function argument for the callback **func** h](j)}(h ``void *arg``h]j)}(hjh]h void *arg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj2)}(hhh]h)}(h+function argument for the callback **func**h](h#function argument for the callback }(hjhhhNhNubj)}(h**func**h]hfunc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hn``int (*func)(struct resource *, void *)`` callback function that is called for each qualifying resource area h](j)}(h*``int (*func)(struct resource *, void *)``h]j)}(hjh]h&int (*func)(struct resource *, void *)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj2)}(hhh]h)}(hBcallback function that is called for each qualifying resource areah]hBcallback function that is called for each qualifying resource area}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubh)}(haAll the memory ranges which overlap start,end and also match flags and desc are valid candidates.h]haAll the memory ranges which overlap start,end and also match flags and desc are valid candidates.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubh)}(h**NOTE**h]j)}(hjFh]hNOTE}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubh)}(hyFor a new descriptor search, define a new IORES_DESC in and set it in 'desc' of a target resource entry.h]h}For a new descriptor search, define a new IORES_DESC in and set it in ‘desc’ of a target resource entry.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j region_intersects (C function)c.region_intersectshNtauh1hhjAhhhNhNubj)}(hhh](j)}(hcint region_intersects (resource_size_t start, size_t size, unsigned long flags, unsigned long desc)h]j)}(hbint region_intersects(resource_size_t start, size_t size, unsigned long flags, unsigned long desc)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hregion_intersectsh]j)}(hregion_intersectsh]hregion_intersects}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hM(resource_size_t start, size_t size, unsigned long flags, unsigned long desc)h](j)}(hresource_size_t starth](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.region_intersectsasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.region_intersectsasbuh1hhjubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long flagsh](j )}(hunsignedh]hunsigned}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjVubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubj )}(hlongh]hlong}(hjvhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjVubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long desch](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdesch]hdesc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h5determine intersection of region with known resourcesh]h5determine intersection of region with known resources}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj%jj%jjjuh1jhhhjAhNhNubj)}(hX**Parameters** ``resource_size_t start`` region start address ``size_t size`` size of region ``unsigned long flags`` flags of resource (in iomem_resource) ``unsigned long desc`` descriptor of resource (in iomem_resource) or IORES_DESC_NONE **Description** Check if the specified region partially overlaps or fully eclipses a resource identified by **flags** and **desc** (optional with IORES_DESC_NONE). Return REGION_DISJOINT if the region does not overlap **flags**/**desc**, return REGION_MIXED if the region overlaps **flags**/**desc** and another resource, and return REGION_INTERSECTS if the region overlaps **flags**/**desc** and no other defined resource. Note that REGION_INTERSECTS is also returned in the case when the specified region overlaps RAM and undefined memory holes. region_intersect() is used by memory remapping functions to ensure the user is not remapping RAM and is a vast speed up over walking through the resource table page by page.h](h)}(h**Parameters**h]j)}(hj/h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj)ubj )}(hhh](j)}(h/``resource_size_t start`` region start address h](j)}(h``resource_size_t start``h]j)}(hjNh]hresource_size_t start}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjHubj2)}(hhh]h)}(hregion start addressh]hregion start address}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMhjdubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjchMhjEubj)}(h``size_t size`` size of region h](j)}(h``size_t size``h]j)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj2)}(hhh]h)}(hsize of regionh]hsize of region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjEubj)}(h>``unsigned long flags`` flags of resource (in iomem_resource) h](j)}(h``unsigned long flags``h]j)}(hjh]hunsigned long flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj2)}(hhh]h)}(h%flags of resource (in iomem_resource)h]h%flags of resource (in iomem_resource)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjEubj)}(hU``unsigned long desc`` descriptor of resource (in iomem_resource) or IORES_DESC_NONE h](j)}(h``unsigned long desc``h]j)}(hjh]hunsigned long desc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj2)}(hhh]h)}(h=descriptor of resource (in iomem_resource) or IORES_DESC_NONEh]h=descriptor of resource (in iomem_resource) or IORES_DESC_NONE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjEubeh}(h]h ]h"]h$]h&]uh1j hj)ubh)}(h**Description**h]j)}(hj4h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj)ubh)}(hXCheck if the specified region partially overlaps or fully eclipses a resource identified by **flags** and **desc** (optional with IORES_DESC_NONE). Return REGION_DISJOINT if the region does not overlap **flags**/**desc**, return REGION_MIXED if the region overlaps **flags**/**desc** and another resource, and return REGION_INTERSECTS if the region overlaps **flags**/**desc** and no other defined resource. Note that REGION_INTERSECTS is also returned in the case when the specified region overlaps RAM and undefined memory holes.h](h\Check if the specified region partially overlaps or fully eclipses a resource identified by }(hjJhhhNhNubj)}(h **flags**h]hflags}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh and }(hjJhhhNhNubj)}(h**desc**h]hdesc}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubhX (optional with IORES_DESC_NONE). Return REGION_DISJOINT if the region does not overlap }(hjJhhhNhNubj)}(h **flags**h]hflags}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh/}(hjJhhhNhNubj)}(h**desc**h]hdesc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh-, return REGION_MIXED if the region overlaps }(hjJhhhNhNubj)}(h **flags**h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh/}hjJsbj)}(h**desc**h]hdesc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubhK and another resource, and return REGION_INTERSECTS if the region overlaps }(hjJhhhNhNubj)}(h **flags**h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh/}hjJsbj)}(h**desc**h]hdesc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh and no other defined resource. Note that REGION_INTERSECTS is also returned in the case when the specified region overlaps RAM and undefined memory holes.}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj)ubh)}(hregion_intersect() is used by memory remapping functions to ensure the user is not remapping RAM and is a vast speed up over walking through the resource table page by page.h]hregion_intersect() is used by memory remapping functions to ensure the user is not remapping RAM and is a vast speed up over walking through the resource table page by page.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  find_resource_space (C function)c.find_resource_spacehNtauh1hhjAhhhNhNubj)}(hhh](j)}(hint find_resource_space (struct resource *root, struct resource *new, resource_size_t size, struct resource_constraint *constraint)h]j)}(hint find_resource_space(struct resource *root, struct resource *new, resource_size_t size, struct resource_constraint *constraint)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj&hMubj{)}(hfind_resource_spaceh]j)}(hfind_resource_spaceh]hfind_resource_space}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj&hMubj)}(hk(struct resource *root, struct resource *new, resource_size_t size, struct resource_constraint *constraint)h](j)}(hstruct resource *rooth](j)}(hjAh]hstruct}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubh)}(hhh]j)}(hresourceh]hresource}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjumodnameN classnameNj] j` )}jc ]jf )}jY j;sbc.find_resource_spaceasbuh1hhjQubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(hrooth]hroot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(hstruct resource *newh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.find_resource_spaceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnewh]hnew}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(hresource_size_t sizeh](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj<modnameN classnameNj] j` )}jc ]jc.find_resource_spaceasbuh1hhj3ubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj)}(hsizeh]hsize}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(h&struct resource_constraint *constrainth](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubh)}(hhh]j)}(hresource_constrainth]hresource_constraint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.find_resource_spaceasbuh1hhj{ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(h constrainth]h constraint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj&hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj&hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj&hMhj hhubj)}(hhh]h)}(h%Find empty space in the resource treeh]h%Find empty space in the resource tree}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj&hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjAhNhNubj)}(hX<**Parameters** ``struct resource *root`` Root resource descriptor ``struct resource *new`` Resource descriptor awaiting an empty resource space ``resource_size_t size`` The minimum size of the empty space ``struct resource_constraint *constraint`` The range and alignment constraints to be met **Description** Finds an empty space under **root** in the resource tree satisfying range and alignment **constraints**. **Return** * ``0`` - if successful, **new** members start, end, and flags are altered. * ``-EBUSY`` - if no empty space was found.h](h)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj )}(hhh](j)}(h3``struct resource *root`` Root resource descriptor h](j)}(h``struct resource *root``h]j)}(hjAh]hstruct resource *root}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj;ubj2)}(hhh]h)}(hRoot resource descriptorh]hRoot resource descriptor}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjWubah}(h]h ]h"]h$]h&]uh1j1hj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhMhj8ubj)}(hN``struct resource *new`` Resource descriptor awaiting an empty resource space h](j)}(h``struct resource *new``h]j)}(hjzh]hstruct resource *new}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjtubj2)}(hhh]h)}(h4Resource descriptor awaiting an empty resource spaceh]h4Resource descriptor awaiting an empty resource space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjtubeh}(h]h ]h"]h$]h&]uh1jhjhMhj8ubj)}(h=``resource_size_t size`` The minimum size of the empty space h](j)}(h``resource_size_t size``h]j)}(hjh]hresource_size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj2)}(hhh]h)}(h#The minimum size of the empty spaceh]h#The minimum size of the empty space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj8ubj)}(hY``struct resource_constraint *constraint`` The range and alignment constraints to be met h](j)}(h*``struct resource_constraint *constraint``h]j)}(hjh]h&struct resource_constraint *constraint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj2)}(hhh]h)}(h-The range and alignment constraints to be meth]h-The range and alignment constraints to be met}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj8ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj'h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubh)}(hhFinds an empty space under **root** in the resource tree satisfying range and alignment **constraints**.h](hFinds an empty space under }(hj=hhhNhNubj)}(h**root**h]hroot}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh5 in the resource tree satisfying range and alignment }(hj=hhhNhNubj)}(h**constraints**h]h constraints}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubh)}(h **Return**h]j)}(hjrh]hReturn}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj)}(hhh](j)}(hQ``0`` - if successful, **new** members start, end, and flags are altered.h]h)}(hjh](j)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh - if successful, }(hjhhhNhNubj)}(h**new**h]hnew}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+ members start, end, and flags are altered.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h,``-EBUSY`` - if no empty space was found.h]h)}(hjh](j)}(h ``-EBUSY``h]h-EBUSY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh" - if no empty space was found.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j allocate_resource (C function)c.allocate_resourcehNtauh1hhjAhhhNhNubj)}(hhh](j)}(hint allocate_resource (struct resource *root, struct resource *new, resource_size_t size, resource_size_t min, resource_size_t max, resource_size_t align, resource_alignf alignf, void *alignf_data)h]j)}(hint allocate_resource(struct resource *root, struct resource *new, resource_size_t size, resource_size_t min, resource_size_t max, resource_size_t align, resource_alignf alignf, void *alignf_data)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMZubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhMZubj{)}(hallocate_resourceh]j)}(hallocate_resourceh]hallocate_resource}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhMZubj)}(h(struct resource *root, struct resource *new, resource_size_t size, resource_size_t min, resource_size_t max, resource_size_t align, resource_alignf alignf, void *alignf_data)h](j)}(hstruct resource *rooth](j)}(hjAh]hstruct}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubh)}(hhh]j)}(hresourceh]hresource}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlmodnameN classnameNj] j` )}jc ]jf )}jY j2sbc.allocate_resourceasbuh1hhjHubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hrooth]hroot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubj)}(hstruct resource *newh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.allocate_resourceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnewh]hnew}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubj)}(hresource_size_t sizeh](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj3modnameN classnameNj] j` )}jc ]jc.allocate_resourceasbuh1hhj*ubj2)}(h h]h }(hjOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj)}(hsizeh]hsize}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubj)}(hresource_size_t minh](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj{modnameN classnameNj] j` )}jc ]jc.allocate_resourceasbuh1hhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hminh]hmin}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubj)}(hresource_size_t maxh](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.allocate_resourceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hmaxh]hmax}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubj)}(hresource_size_t alignh](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jc.allocate_resourceasbuh1hhjubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(halignh]halign}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubj)}(hresource_alignf alignfh](h)}(hhh]j)}(hresource_alignfh]hresource_alignf}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjSmodnameN classnameNj] j` )}jc ]jc.allocate_resourceasbuh1hhjJubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubj)}(halignfh]halignf}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubj)}(hvoid *alignf_datah](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h alignf_datah]h alignf_data}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhjhMZubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMZubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMZhjhhubj)}(hhh]h)}(hallocate empty slot in the resource tree given range & alignment. The resource will be reallocated with a new size if it was already allocatedh]hallocate empty slot in the resource tree given range & alignment. The resource will be reallocated with a new size if it was already allocated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMZhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMZubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjAhNhNubj)}(hX**Parameters** ``struct resource *root`` root resource descriptor ``struct resource *new`` resource descriptor desired by caller ``resource_size_t size`` requested resource region size ``resource_size_t min`` minimum boundary to allocate ``resource_size_t max`` maximum boundary to allocate ``resource_size_t align`` alignment requested, in bytes ``resource_alignf alignf`` alignment function, optional, called if not NULL ``void *alignf_data`` arbitrary data to pass to the **alignf** functionh](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM^hjubj )}(hhh](j)}(h3``struct resource *root`` root resource descriptor h](j)}(h``struct resource *root``h]j)}(hj*h]hstruct resource *root}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM\hj$ubj2)}(hhh]h)}(hroot resource descriptorh]hroot resource descriptor}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hM\hj@ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj?hM\hj!ubj)}(h?``struct resource *new`` resource descriptor desired by caller h](j)}(h``struct resource *new``h]j)}(hjch]hstruct resource *new}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM]hj]ubj2)}(hhh]h)}(h%resource descriptor desired by callerh]h%resource descriptor desired by caller}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhM]hjyubah}(h]h ]h"]h$]h&]uh1j1hj]ubeh}(h]h ]h"]h$]h&]uh1jhjxhM]hj!ubj)}(h8``resource_size_t size`` requested resource region size h](j)}(h``resource_size_t size``h]j)}(hjh]hresource_size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM^hjubj2)}(hhh]h)}(hrequested resource region sizeh]hrequested resource region size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM^hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM^hj!ubj)}(h5``resource_size_t min`` minimum boundary to allocate h](j)}(h``resource_size_t min``h]j)}(hjh]hresource_size_t min}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM_hjubj2)}(hhh]h)}(hminimum boundary to allocateh]hminimum boundary to allocate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM_hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM_hj!ubj)}(h5``resource_size_t max`` maximum boundary to allocate h](j)}(h``resource_size_t max``h]j)}(hjh]hresource_size_t max}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM`hjubj2)}(hhh]h)}(hmaximum boundary to allocateh]hmaximum boundary to allocate}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hM`hj$ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj#hM`hj!ubj)}(h8``resource_size_t align`` alignment requested, in bytes h](j)}(h``resource_size_t align``h]j)}(hjGh]hresource_size_t align}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMahjAubj2)}(hhh]h)}(halignment requested, in bytesh]halignment requested, in bytes}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMahj]ubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj\hMahj!ubj)}(hL``resource_alignf alignf`` alignment function, optional, called if not NULL h](j)}(h``resource_alignf alignf``h]j)}(hjh]hresource_alignf alignf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMbhjzubj2)}(hhh]h)}(h0alignment function, optional, called if not NULLh]h0alignment function, optional, called if not NULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMbhjubah}(h]h ]h"]h$]h&]uh1j1hjzubeh}(h]h ]h"]h$]h&]uh1jhjhMbhj!ubj)}(hG``void *alignf_data`` arbitrary data to pass to the **alignf** functionh](j)}(h``void *alignf_data``h]j)}(hjh]hvoid *alignf_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMdhjubj2)}(hhh]h)}(h1arbitrary data to pass to the **alignf** functionh](harbitrary data to pass to the }(hjhhhNhNubj)}(h **alignf**h]halignf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh function}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMchjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMdhj!ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j insert_resource (C function)c.insert_resourcehNtauh1hhjAhhhNhNubj)}(hhh](j)}(hCint insert_resource (struct resource *parent, struct resource *new)h]j)}(hBint insert_resource(struct resource *parent, struct resource *new)h](j )}(hinth]hint}(hj% hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj! hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMubj2)}(h h]h }(hj4 hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj! hhhj3 hMubj{)}(hinsert_resourceh]j)}(hinsert_resourceh]hinsert_resource}(hjF hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj! hhhj3 hMubj)}(h/(struct resource *parent, struct resource *new)h](j)}(hstruct resource *parenth](j)}(hjAh]hstruct}(hjb hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ ubj2)}(h h]h }(hjo hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ ubh)}(hhh]j)}(hresourceh]hresource}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj} ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY jH sbc.insert_resourceasbuh1hhj^ ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ ubj)}(hparenth]hparent}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZ ubj)}(hstruct resource *newh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hresourceh]hresource}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]j c.insert_resourceasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hnewh]hnew}(hj+ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZ ubeh}(h]h ]h"]h$]h&]jjuh1jhj! hhhj3 hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj3 hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj3 hMhj hhubj)}(hhh]h)}(h'Inserts a resource in the resource treeh]h'Inserts a resource in the resource tree}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjR hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj3 hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjm jjm jjjuh1jhhhjAhNhNubj)}(hX(**Parameters** ``struct resource *parent`` parent of the new resource ``struct resource *new`` new resource to insert **Description** Returns 0 on success, -EBUSY if the resource can't be inserted. This function is intended for producers of resources, such as FW modules and bus drivers.h](h)}(h**Parameters**h]j)}(hjw h]h Parameters}(hjy hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjq ubj )}(hhh](j)}(h7``struct resource *parent`` parent of the new resource h](j)}(h``struct resource *parent``h]j)}(hj h]hstruct resource *parent}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj ubj2)}(hhh]h)}(hparent of the new resourceh]hparent of the new resource}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubj)}(h0``struct resource *new`` new resource to insert h](j)}(h``struct resource *new``h]j)}(hj h]hstruct resource *new}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj ubj2)}(hhh]h)}(hnew resource to inserth]hnew resource to insert}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubeh}(h]h ]h"]h$]h&]uh1j hjq ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjq ubh)}(h?Returns 0 on success, -EBUSY if the resource can't be inserted.h]hAReturns 0 on success, -EBUSY if the resource can’t be inserted.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjq ubh)}(hYThis function is intended for producers of resources, such as FW modules and bus drivers.h]hYThis function is intended for producers of resources, such as FW modules and bus drivers.}(hj/ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjq ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *insert_resource_expand_to_fit (C function)c.insert_resource_expand_to_fithNtauh1hhjAhhhNhNubj)}(hhh](j)}(hPvoid insert_resource_expand_to_fit (struct resource *root, struct resource *new)h]j)}(hOvoid insert_resource_expand_to_fit(struct resource *root, struct resource *new)h](j )}(hvoidh]hvoid}(hj^ hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZ hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMubj2)}(h h]h }(hjm hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZ hhhjl hMubj{)}(hinsert_resource_expand_to_fith]j)}(hinsert_resource_expand_to_fith]hinsert_resource_expand_to_fit}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjZ hhhjl hMubj)}(h-(struct resource *root, struct resource *new)h](j)}(hstruct resource *rooth](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hresourceh]hresource}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY j sbc.insert_resource_expand_to_fitasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hrooth]hroot}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hstruct resource *newh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hresourceh]hresource}(hj+ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj( ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj- modnameN classnameNj] j` )}jc ]j c.insert_resource_expand_to_fitasbuh1hhj ubj2)}(h h]h }(hjI hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hjW hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hnewh]hnew}(hjd hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjZ hhhjl hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjV hhhjl hMubah}(h]jQ ah ](jjeh"]h$]h&]jj)jhuh1jhjl hMhjS hhubj)}(hhh]h)}(h(Insert a resource into the resource treeh]h(Insert a resource into the resource tree}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjS hhhjl hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjAhNhNubj)}(hX**Parameters** ``struct resource *root`` root resource descriptor ``struct resource *new`` new resource to insert **Description** Insert a resource into the resource tree, possibly expanding it in order to make it encompass any conflicting resources.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj ubj )}(hhh](j)}(h3``struct resource *root`` root resource descriptor h](j)}(h``struct resource *root``h]j)}(hj h]hstruct resource *root}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj ubj2)}(hhh]h)}(hroot resource descriptorh]hroot resource descriptor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubj)}(h0``struct resource *new`` new resource to insert h](j)}(h``struct resource *new``h]j)}(hj h]hstruct resource *new}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj ubj2)}(hhh]h)}(hnew resource to inserth]hnew resource to insert}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjC h]h Description}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj ubh)}(hxInsert a resource into the resource tree, possibly expanding it in order to make it encompass any conflicting resources.h]hxInsert a resource into the resource tree, possibly expanding it in order to make it encompass any conflicting resources.}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j remove_resource (C function)c.remove_resourcehNtauh1hhjAhhhNhNubj)}(hhh](j)}(h*int remove_resource (struct resource *old)h]j)}(h)int remove_resource(struct resource *old)h](j )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM%ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj hM%ubj{)}(hremove_resourceh]j)}(hremove_resourceh]hremove_resource}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj hM%ubj)}(h(struct resource *old)h]j)}(hstruct resource *oldh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hresourceh]hresource}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY j sbc.remove_resourceasbuh1hhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(holdh]hold}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhj hhhj hM%ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hM%ubah}(h]j{ ah ](jjeh"]h$]h&]jj)jhuh1jhj hM%hj} hhubj)}(hhh]h)}(h&Remove a resource in the resource treeh]h&Remove a resource in the resource tree}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM%hjEhhubah}(h]h ]h"]h$]h&]uh1jhj} hhhj hM%ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj`jj`jjjuh1jhhhjAhNhNubj)}(hX[**Parameters** ``struct resource *old`` resource to remove **Description** Returns 0 on success, -EINVAL if the resource is not valid. This function removes a resource previously inserted by insert_resource() or insert_resource_conflict(), and moves the children (if any) up to where they were before. insert_resource() and insert_resource_conflict() insert a new resource, and move any conflicting resources down to the children of the new resource. insert_resource(), insert_resource_conflict() and remove_resource() are intended for producers of resources, such as FW modules and bus drivers.h](h)}(h**Parameters**h]j)}(hjjh]h Parameters}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM)hjdubj )}(hhh]j)}(h,``struct resource *old`` resource to remove h](j)}(h``struct resource *old``h]j)}(hjh]hstruct resource *old}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM&hjubj2)}(hhh]h)}(hresource to removeh]hresource to remove}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM&hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM&hjubah}(h]h ]h"]h$]h&]uh1j hjdubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM(hjdubh)}(h;Returns 0 on success, -EINVAL if the resource is not valid.h]h;Returns 0 on success, -EINVAL if the resource is not valid.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM'hjdubh)}(hX<This function removes a resource previously inserted by insert_resource() or insert_resource_conflict(), and moves the children (if any) up to where they were before. insert_resource() and insert_resource_conflict() insert a new resource, and move any conflicting resources down to the children of the new resource.h]hX<This function removes a resource previously inserted by insert_resource() or insert_resource_conflict(), and moves the children (if any) up to where they were before. insert_resource() and insert_resource_conflict() insert a new resource, and move any conflicting resources down to the children of the new resource.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM)hjdubh)}(hinsert_resource(), insert_resource_conflict() and remove_resource() are intended for producers of resources, such as FW modules and bus drivers.h]hinsert_resource(), insert_resource_conflict() and remove_resource() are intended for producers of resources, such as FW modules and bus drivers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM/hjdubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j adjust_resource (C function)c.adjust_resourcehNtauh1hhjAhhhNhNubj)}(hhh](j)}(hWint adjust_resource (struct resource *res, resource_size_t start, resource_size_t size)h]j)}(hVint adjust_resource(struct resource *res, resource_size_t start, resource_size_t size)h](j )}(hinth]hint}(hj'hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMdubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#hhhj5hMdubj{)}(hadjust_resourceh]j)}(hadjust_resourceh]hadjust_resource}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj#hhhj5hMdubj)}(hC(struct resource *res, resource_size_t start, resource_size_t size)h](j)}(hstruct resource *resh](j)}(hjAh]hstruct}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jJsbc.adjust_resourceasbuh1hhj`ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hresh]hres}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubj)}(hresource_size_t starth](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.adjust_resourceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubj)}(hresource_size_t sizeh](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj#modnameN classnameNj] j` )}jc ]jc.adjust_resourceasbuh1hhjubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubeh}(h]h ]h"]h$]h&]jjuh1jhj#hhhj5hMdubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj5hMdubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj5hMdhjhhubj)}(hhh]h)}(h"modify a resource's start and sizeh]h$modify a resource’s start and size}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMdhjthhubah}(h]h ]h"]h$]h&]uh1jhjhhhj5hMdubeh}(h]h ](jfunctioneh"]h$]h&]]jjjjjjjjjuh1jhhhjAhNhNubj)}(hX]**Parameters** ``struct resource *res`` resource to modify ``resource_size_t start`` new start value ``resource_size_t size`` new size **Description** Given an existing resource, change its start and size to match the arguments. Returns 0 on success, -EBUSY if it can't fit. Existing children of the resource are assumed to be immutable.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhhjubj )}(hhh](j)}(h,``struct resource *res`` resource to modify h](j)}(h``struct resource *res``h]j)}(hjh]hstruct resource *res}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMehjubj2)}(hhh]h)}(hresource to modifyh]hresource to modify}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMehjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMehjubj)}(h*``resource_size_t start`` new start value h](j)}(h``resource_size_t start``h]j)}(hjh]hresource_size_t start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMfhjubj2)}(hhh]h)}(hnew start valueh]hnew start value}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMfhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMfhjubj)}(h"``resource_size_t size`` new size h](j)}(h``resource_size_t size``h]j)}(hj*h]hresource_size_t size}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMghj$ubj2)}(hhh]h)}(hnew sizeh]hnew size}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMghj@ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj?hMghjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjeh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMihjubh)}(hGiven an existing resource, change its start and size to match the arguments. Returns 0 on success, -EBUSY if it can't fit. Existing children of the resource are assumed to be immutable.h]hGiven an existing resource, change its start and size to match the arguments. Returns 0 on success, -EBUSY if it can’t fit. Existing children of the resource are assumed to be immutable.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __request_region (C function)c.__request_regionhNtauh1hhjAhhhNhNubj)}(hhh](j)}(hstruct resource * __request_region (struct resource *parent, resource_size_t start, resource_size_t n, const char *name, int flags)h]j)}(hstruct resource *__request_region(struct resource *parent, resource_size_t start, resource_size_t n, const char *name, int flags)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMXubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMXubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY __request_regionsbc.__request_regionasbuh1hhjhhhjhMXubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMXubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMXubj{)}(h__request_regionh]j)}(hjh]h__request_region}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMXubj)}(h`(struct resource *parent, resource_size_t start, resource_size_t n, const char *name, int flags)h](j)}(hstruct resource *parenth](j)}(hjAh]hstruct}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hresourceh]hresource}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjDmodnameN classnameNj] j` )}jc ]jc.__request_regionasbuh1hhj ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hparenth]hparent}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hresource_size_t starth](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.__request_regionasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hresource_size_t nh](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.__request_regionasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]hn}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *nameh](j)}(hjh]hconst}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnameh]hname}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int flagsh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj|ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|ubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMXubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMXubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMXhjhhubj)}(hhh]h)}(h!create a new busy resource regionh]h!create a new busy resource region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMXhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMXubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjAhNhNubj)}(hX**Parameters** ``struct resource *parent`` parent resource descriptor ``resource_size_t start`` resource start address ``resource_size_t n`` resource region size ``const char *name`` reserving caller's ID string ``int flags`` IO resource flagsh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM\hjubj )}(hhh](j)}(h7``struct resource *parent`` parent resource descriptor h](j)}(h``struct resource *parent``h]j)}(hjh]hstruct resource *parent}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMYhjubj2)}(hhh]h)}(hparent resource descriptorh]hparent resource descriptor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMYhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMYhjubj)}(h1``resource_size_t start`` resource start address h](j)}(h``resource_size_t start``h]j)}(hj@h]hresource_size_t start}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMZhj:ubj2)}(hhh]h)}(hresource start addressh]hresource start address}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhMZhjVubah}(h]h ]h"]h$]h&]uh1j1hj:ubeh}(h]h ]h"]h$]h&]uh1jhjUhMZhjubj)}(h+``resource_size_t n`` resource region size h](j)}(h``resource_size_t n``h]j)}(hjyh]hresource_size_t n}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM[hjsubj2)}(hhh]h)}(hresource region sizeh]hresource region size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM[hjubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjhM[hjubj)}(h2``const char *name`` reserving caller's ID string h](j)}(h``const char *name``h]j)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM\hjubj2)}(hhh]h)}(hreserving caller's ID stringh]hreserving caller’s ID string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM\hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM\hjubj)}(h``int flags`` IO resource flagsh](j)}(h ``int flags``h]j)}(hjh]h int flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM^hjubj2)}(hhh]h)}(hIO resource flagsh]hIO resource flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM]hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM^hjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __release_region (C function)c.__release_regionhNtauh1hhjAhhhNhNubj)}(hhh](j)}(hYvoid __release_region (struct resource *parent, resource_size_t start, resource_size_t n)h]j)}(hXvoid __release_region(struct resource *parent, resource_size_t start, resource_size_t n)h](j )}(hvoidh]hvoid}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjAhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMzubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAhhhjShMzubj{)}(h__release_regionh]j)}(h__release_regionh]h__release_region}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjAhhhjShMzubj)}(hC(struct resource *parent, resource_size_t start, resource_size_t n)h](j)}(hstruct resource *parenth](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jhsbc.__release_regionasbuh1hhj~ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj)}(hparenth]hparent}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjzubj)}(hresource_size_t starth](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.__release_regionasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hstarth]hstart}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjzubj)}(hresource_size_t nh](h)}(hhh]j)}(hresource_size_th]hresource_size_t}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjAmodnameN classnameNj] j` )}jc ]jc.__release_regionasbuh1hhj8ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubj)}(hjh]hn}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjzubeh}(h]h ]h"]h$]h&]jjuh1jhjAhhhjShMzubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj=hhhjShMzubah}(h]j8ah ](jjeh"]h$]h&]jj)jhuh1jhjShMzhj:hhubj)}(hhh]h)}(h-release a previously reserved resource regionh]h-release a previously reserved resource region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMzhjhhubah}(h]h ]h"]h$]h&]uh1jhj:hhhjShMzubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjAhNhNubj)}(h**Parameters** ``struct resource *parent`` parent resource descriptor ``resource_size_t start`` resource start address ``resource_size_t n`` resource region size **Description** The described resource region must match a currently busy region.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM~hjubj )}(hhh](j)}(h7``struct resource *parent`` parent resource descriptor h](j)}(h``struct resource *parent``h]j)}(hjh]hstruct resource *parent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM{hjubj2)}(hhh]h)}(hparent resource descriptorh]hparent resource descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM{hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM{hjubj)}(h1``resource_size_t start`` resource start address h](j)}(h``resource_size_t start``h]j)}(hjh]hresource_size_t start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM|hjubj2)}(hhh]h)}(hresource start addressh]hresource start address}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hM|hj$ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj#hM|hjubj)}(h+``resource_size_t n`` resource region size h](j)}(h``resource_size_t n``h]j)}(hjGh]hresource_size_t n}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM}hjAubj2)}(hhh]h)}(hresource region sizeh]hresource region size}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM}hj]ubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj\hM}hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubh)}(hAThe described resource region must match a currently busy region.h]hAThe described resource region must match a currently busy region.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM~hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "devm_request_resource (C function)c.devm_request_resourcehNtauh1hhjAhhhNhNubj)}(hhh](j)}(h[int devm_request_resource (struct device *dev, struct resource *root, struct resource *new)h]j)}(hZint devm_request_resource(struct device *dev, struct resource *root, struct resource *new)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hdevm_request_resourceh]j)}(hdevm_request_resourceh]hdevm_request_resource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hA(struct device *dev, struct resource *root, struct resource *new)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdeviceh]hdevice}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj$modnameN classnameNj] j` )}jc ]jf )}jY jsbc.devm_request_resourceasbuh1hhjubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdevh]hdev}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct resource *rooth](j)}(hjAh]hstruct}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j>c.devm_request_resourceasbuh1hhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hrooth]hroot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct resource *newh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j>c.devm_request_resourceasbuh1hhjubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnewh]hnew}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h-request and reserve an I/O or memory resourceh]h-request and reserve an I/O or memory resource}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjdhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjAhNhNubj)}(hXR**Parameters** ``struct device *dev`` device for which to request the resource ``struct resource *root`` root of the resource tree from which to request the resource ``struct resource *new`` descriptor of the resource to request **Description** This is a device-managed version of request_resource(). There is usually no need to release resources requested by this function explicitly since that will be taken care of when the device is unbound from its driver. If for some reason the resource needs to be released explicitly, because of ordering issues for example, drivers must call devm_release_resource() rather than the regular release_resource(). When a conflict is detected between any existing resources and the newly requested resource, an error message will be printed. Returns 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj )}(hhh](j)}(h@``struct device *dev`` device for which to request the resource h](j)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj2)}(hhh]h)}(h(device for which to request the resourceh]h(device for which to request the resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hW``struct resource *root`` root of the resource tree from which to request the resource h](j)}(h``struct resource *root``h]j)}(hjh]hstruct resource *root}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj2)}(hhh]h)}(hah"]h$]h&]uh1j1hjhhhjhMubj{)}(hdevm_release_resourceh]j)}(hdevm_release_resourceh]hdevm_release_resource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h*(struct device *dev, struct resource *new)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.devm_release_resourceasbuh1hhjubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdevh]hdev}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct resource *newh](j)}(hjAh]hstruct}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j/c.devm_release_resourceasbuh1hhjcubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hnewh]hnew}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h'release a previously requested resourceh]h'release a previously requested resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjAhNhNubj)}(h**Parameters** ``struct device *dev`` device for which to release the resource ``struct resource *new`` descriptor of the resource to release **Description** Releases a resource previously requested using devm_request_resource().h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubj )}(hhh](j)}(h@``struct device *dev`` device for which to release the resource h](j)}(h``struct device *dev``h]j)}(hj)h]hstruct device *dev}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj#ubj2)}(hhh]h)}(h(device for which to release the resourceh]h(device for which to release the resource}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj?ubah}(h]h ]h"]h$]h&]uh1j1hj#ubeh}(h]h ]h"]h$]h&]uh1jhj>hMhj ubj)}(h?``struct resource *new`` descriptor of the resource to release h](j)}(h``struct resource *new``h]j)}(hjbh]hstruct resource *new}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhj\ubj2)}(hhh]h)}(h%descriptor of the resource to releaseh]h%descriptor of the resource to release}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhMhjxubah}(h]h ]h"]h$]h&]uh1j1hj\ubeh}(h]h ]h"]h$]h&]uh1jhjwhMhj ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubh)}(hGReleases a resource previously requested using devm_request_resource().h]hGReleases a resource previously requested using devm_request_resource().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )devm_request_free_mem_region (C function)c.devm_request_free_mem_regionhNtauh1hhjAhhhNhNubj)}(hhh](j)}(hnstruct resource * devm_request_free_mem_region (struct device *dev, struct resource *base, unsigned long size)h]j)}(hlstruct resource *devm_request_free_mem_region(struct device *dev, struct resource *base, unsigned long size)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM1ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM1ubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY devm_request_free_mem_regionsbc.devm_request_free_mem_regionasbuh1hhjhhhjhM1ubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM1ubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM1ubj{)}(hdevm_request_free_mem_regionh]j)}(hjh]hdevm_request_free_mem_region}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM1ubj)}(h?(struct device *dev, struct resource *base, unsigned long size)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubh)}(hhh]j)}(hdeviceh]hdevice}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj|modnameN classnameNj] j` )}jc ]jc.devm_request_free_mem_regionasbuh1hhjXubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubj)}(hstruct resource *baseh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.devm_request_free_mem_regionasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbaseh]hbase}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubj)}(hunsigned long sizeh](j )}(hunsignedh]hunsigned}(hj<hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj8ubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubj )}(hlongh]hlong}(hjXhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj8ubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubj)}(hsizeh]hsize}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM1ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM1ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM1hjhhubj)}(hhh]h)}(h*find free region for device private memoryh]h*find free region for device private memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM1hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM1ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjAhNhNubj)}(hX**Parameters** ``struct device *dev`` device struct to bind the resource to ``struct resource *base`` resource tree to look in ``unsigned long size`` size in bytes of the device memory to add **Description** This function tries to find an empty range of physical address big enough to contain the new resource, so that it can later be hotplugged as ZONE_DEVICE memory, which in turn allocates struct pages.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM5hjubj )}(hhh](j)}(h=``struct device *dev`` device struct to bind the resource to h](j)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM3hjubj2)}(hhh]h)}(h%device struct to bind the resource toh]h%device struct to bind the resource to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM3hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM3hjubj)}(h3``struct resource *base`` resource tree to look in h](j)}(h``struct resource *base``h]j)}(hjh]hstruct resource *base}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM5hjubj2)}(hhh]h)}(hresource tree to look inh]hresource tree to look in}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hM5hj.ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj-hM5hjubj)}(hA``unsigned long size`` size in bytes of the device memory to add h](j)}(h``unsigned long size``h]j)}(hjQh]hunsigned long size}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM4hjKubj2)}(hhh]h)}(h)size in bytes of the device memory to addh]h)size in bytes of the device memory to add}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhM4hjgubah}(h]h ]h"]h$]h&]uh1j1hjKubeh}(h]h ]h"]h$]h&]uh1jhjfhM4hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM6hjubh)}(hThis function tries to find an empty range of physical address big enough to contain the new resource, so that it can later be hotplugged as ZONE_DEVICE memory, which in turn allocates struct pages.h]hThis function tries to find an empty range of physical address big enough to contain the new resource, so that it can later be hotplugged as ZONE_DEVICE memory, which in turn allocates struct pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chM6hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "alloc_free_mem_region (C function)c.alloc_free_mem_regionhNtauh1hhjAhhhNhNubj)}(hhh](j)}(hzstruct resource * alloc_free_mem_region (struct resource *base, unsigned long size, unsigned long align, const char *name)h]j)}(hxstruct resource *alloc_free_mem_region(struct resource *base, unsigned long size, unsigned long align, const char *name)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMQubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMQubh)}(hhh]j)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY alloc_free_mem_regionsbc.alloc_free_mem_regionasbuh1hhjhhhjhMQubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMQubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMQubj{)}(halloc_free_mem_regionh]j)}(hj h]halloc_free_mem_region}(hj0 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj, ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMQubj)}(hR(struct resource *base, unsigned long size, unsigned long align, const char *name)h](j)}(hstruct resource *baseh](j)}(hjAh]hstruct}(hjK hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG ubj2)}(h h]h }(hjX hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjG ubh)}(hhh]j)}(hresourceh]hresource}(hji hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjk modnameN classnameNj] j` )}jc ]j c.alloc_free_mem_regionasbuh1hhjG ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjG ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG ubj)}(hbaseh]hbase}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjC ubj)}(hunsigned long sizeh](j )}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hlongh]hlong}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hsizeh]hsize}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjC ubj)}(hunsigned long alignh](j )}(hunsignedh]hunsigned}(hj !hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!ubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!ubj )}(hlongh]hlong}(hj(!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!ubj2)}(h h]h }(hj6!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!ubj)}(halignh]halign}(hjD!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjC ubj)}(hconst char *nameh](j)}(hjh]hconst}(hj]!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY!ubj2)}(h h]h }(hjj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjY!ubj )}(hcharh]hchar}(hjx!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjY!ubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjY!ubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY!ubj)}(hnameh]hname}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjC ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMQubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMQubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMQhjhhubj)}(hhh]h)}(h'find a free region relative to **base**h](hfind a free region relative to }(hj!hhhNhNubj)}(h**base**h]hbase}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMQhj!hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMQubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!jj!jjjuh1jhhhjAhNhNubj)}(hX"**Parameters** ``struct resource *base`` resource that will parent the new resource ``unsigned long size`` size in bytes of memory to allocate from **base** ``unsigned long align`` alignment requirements for the allocation ``const char *name`` resource name **Description** Buses like CXL, that can dynamically instantiate new memory regions, need a method to allocate physical address space for those regions. Allocate and insert a new resource to cover a free, unclaimed by a descendant of **base**, range in the span of **base**.h](h)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMUhj!ubj )}(hhh](j)}(hE``struct resource *base`` resource that will parent the new resource h](j)}(h``struct resource *base``h]j)}(hj"h]hstruct resource *base}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMRhj"ubj2)}(hhh]h)}(h*resource that will parent the new resourceh]h*resource that will parent the new resource}(hj3"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/"hMRhj0"ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj/"hMRhj"ubj)}(hI``unsigned long size`` size in bytes of memory to allocate from **base** h](j)}(h``unsigned long size``h]j)}(hjS"h]hunsigned long size}(hjU"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ"ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMShjM"ubj2)}(hhh]h)}(h1size in bytes of memory to allocate from **base**h](h)size in bytes of memory to allocate from }(hjl"hhhNhNubj)}(h**base**h]hbase}(hjt"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl"ubeh}(h]h ]h"]h$]h&]uh1hhjh"hMShji"ubah}(h]h ]h"]h$]h&]uh1j1hjM"ubeh}(h]h ]h"]h$]h&]uh1jhjh"hMShj"ubj)}(hB``unsigned long align`` alignment requirements for the allocation h](j)}(h``unsigned long align``h]j)}(hj"h]hunsigned long align}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMThj"ubj2)}(hhh]h)}(h)alignment requirements for the allocationh]h)alignment requirements for the allocation}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMThj"ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hMThj"ubj)}(h#``const char *name`` resource name h](j)}(h``const char *name``h]j)}(hj"h]hconst char *name}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMUhj"ubj2)}(hhh]h)}(h resource nameh]h resource name}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMUhj"ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hMUhj"ubeh}(h]h ]h"]h$]h&]uh1j hj!ubh)}(h**Description**h]j)}(hj#h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj #ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMWhj!ubh)}(hXBuses like CXL, that can dynamically instantiate new memory regions, need a method to allocate physical address space for those regions. Allocate and insert a new resource to cover a free, unclaimed by a descendant of **base**, range in the span of **base**.h](hBuses like CXL, that can dynamically instantiate new memory regions, need a method to allocate physical address space for those regions. Allocate and insert a new resource to cover a free, unclaimed by a descendant of }(hj$#hhhNhNubj)}(h**base**h]hbase}(hj,#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$#ubh, range in the span of }(hj$#hhhNhNubj)}(h**base**h]hbase}(hj>#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$#ubh.}(hj$#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:271: ./kernel/resource.chMVhj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubeh}(h]resources-managementah ]h"]resources managementah$]h&]uh1hhj hhhhhM ubh)}(hhh](h)}(h MTRR Handlingh]h MTRR Handling}(hji#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjf#hhhhhMubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j arch_phys_wc_add (C function)c.arch_phys_wc_addhNtauh1hhjf#hhhNhNubj)}(hhh](j)}(h=int arch_phys_wc_add (unsigned long base, unsigned long size)h]j)}(hah"]h$]h&]uh1j1hj#hhhj#hMubj{)}(harch_phys_wc_addh]j)}(harch_phys_wc_addh]harch_phys_wc_add}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj#hhhj#hMubj)}(h((unsigned long base, unsigned long size)h](j)}(hunsigned long baseh](j )}(hunsignedh]hunsigned}(hj#hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#ubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#ubj )}(hlongh]hlong}(hj#hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#ubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#ubj)}(hbaseh]hbase}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj#ubj)}(hunsigned long sizeh](j )}(hunsignedh]hunsigned}(hj$hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hj,$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj )}(hlongh]hlong}(hj:$hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hjH$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(hsizeh]hsize}(hjV$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj#ubeh}(h]h ]h"]h$]h&]jjuh1jhj#hhhj#hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj#hhhj#hMubah}(h]j#ah ](jjeh"]h$]h&]jj)jhuh1jhj#hMhj#hhubj)}(hhh]h)}(h5add a WC MTRR and handle errors if PAT is unavailableh]h5add a WC MTRR and handle errors if PAT is unavailable}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:277: ./arch/x86/kernel/cpu/mtrr/mtrr.chMhj}$hhubah}(h]h ]h"]h$]h&]uh1jhj#hhhj#hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj$jj$jjjuh1jhhhjf#hNhNubj)}(hX**Parameters** ``unsigned long base`` Physical base address ``unsigned long size`` Size of region **Description** If PAT is available, this does nothing. If PAT is unavailable, it attempts to add a WC MTRR covering size bytes starting at base and logs an error if this fails. The called should provide a power of two size on an equivalent power of two boundary. Drivers must store the return value to pass to mtrr_del_wc_if_needed, but drivers should not try to interpret that return value.h](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:277: ./arch/x86/kernel/cpu/mtrr/mtrr.chMhj$ubj )}(hhh](j)}(h-``unsigned long base`` Physical base address h](j)}(h``unsigned long base``h]j)}(hj$h]hunsigned long base}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:277: ./arch/x86/kernel/cpu/mtrr/mtrr.chMhj$ubj2)}(hhh]h)}(hPhysical base addressh]hPhysical base address}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj$ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hMhj$ubj)}(h&``unsigned long size`` Size of region h](j)}(h``unsigned long size``h]j)}(hj$h]hunsigned long size}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:277: ./arch/x86/kernel/cpu/mtrr/mtrr.chMhj$ubj2)}(hhh]h)}(hSize of regionh]hSize of region}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj%hMhj$ubeh}(h]h ]h"]h$]h&]uh1j hj$ubh)}(h**Description**h]j)}(hj5%h]h Description}(hj7%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3%ubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:277: ./arch/x86/kernel/cpu/mtrr/mtrr.chMhj$ubh)}(hIf PAT is available, this does nothing. If PAT is unavailable, it attempts to add a WC MTRR covering size bytes starting at base and logs an error if this fails.h]hIf PAT is available, this does nothing. If PAT is unavailable, it attempts to add a WC MTRR covering size bytes starting at base and logs an error if this fails.}(hjK%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:277: ./arch/x86/kernel/cpu/mtrr/mtrr.chMhj$ubh)}(hUThe called should provide a power of two size on an equivalent power of two boundary.h]hUThe called should provide a power of two size on an equivalent power of two boundary.}(hjZ%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:277: ./arch/x86/kernel/cpu/mtrr/mtrr.chMhj$ubh)}(hDrivers must store the return value to pass to mtrr_del_wc_if_needed, but drivers should not try to interpret that return value.h]hDrivers must store the return value to pass to mtrr_del_wc_if_needed, but drivers should not try to interpret that return value.}(hji%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:277: ./arch/x86/kernel/cpu/mtrr/mtrr.chMhj$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjf#hhhNhNubeh}(h] mtrr-handlingah ]h"] mtrr handlingah$]h&]uh1hhj hhhhhMubeh}(h]hardware-interfacesah ]h"]hardware interfacesah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hSecurity Frameworkh]hSecurity Framework}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hhhhhMubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_file_alloc (C function)c.lsm_file_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h&int lsm_file_alloc (struct file *file)h]j)}(h%int lsm_file_alloc(struct file *file)h](j )}(hinth]hint}(hj%hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj%hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKubj2)}(h h]h }(hj%hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%hhhj%hKubj{)}(hlsm_file_alloch]j)}(hlsm_file_alloch]hlsm_file_alloc}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj%hhhj%hKubj)}(h(struct file *file)h]j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%ubh)}(hhh]j)}(hfileh]hfile}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj&modnameN classnameNj] j` )}jc ]jf )}jY j%sbc.lsm_file_allocasbuh1hhj%ubj2)}(h h]h }(hj4&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%ubj)}(hjh]h*}(hjB&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(hfileh]hfile}(hjO&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj%ubah}(h]h ]h"]h$]h&]jjuh1jhj%hhhj%hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj%hhhj%hKubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj%hKhj%hhubj)}(hhh]h)}(hallocate a composite file blobh]hallocate a composite file blob}(hjy&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjv&hhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj%hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj&jj&jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct file *file`` the file that needs a blob **Description** Allocate the file blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj&ubj )}(hhh]j)}(h1``struct file *file`` the file that needs a blob h](j)}(h``struct file *file``h]j)}(hj&h]hstruct file *file}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj&ubj2)}(hhh]h)}(hthe file that needs a blobh]hthe file that needs a blob}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hKhj&ubah}(h]h ]h"]h$]h&]uh1j1hj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hKhj&ubah}(h]h ]h"]h$]h&]uh1j hj&ubh)}(h**Description**h]j)}(hj&h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj&ubh)}(h*Allocate the file blob for all the modulesh]h*Allocate the file blob for all the modules}(hj 'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj&ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #lsm_backing_file_alloc (C function)c.lsm_backing_file_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h6int lsm_backing_file_alloc (struct file *backing_file)h]j)}(h5int lsm_backing_file_alloc(struct file *backing_file)h](j )}(hinth]hint}(hjI'hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjE'hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKubj2)}(h h]h }(hjX'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjE'hhhjW'hKubj{)}(hlsm_backing_file_alloch]j)}(hlsm_backing_file_alloch]hlsm_backing_file_alloc}(hjj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf'ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjE'hhhjW'hKubj)}(h(struct file *backing_file)h]j)}(hstruct file *backing_fileh](j)}(hjAh]hstruct}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'ubh)}(hhh]j)}(hfileh]hfile}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj'modnameN classnameNj] j` )}jc ]jf )}jY jl'sbc.lsm_backing_file_allocasbuh1hhj'ubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'ubj)}(hjh]h*}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(h backing_fileh]h backing_file}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~'ubah}(h]h ]h"]h$]h&]jjuh1jhjE'hhhjW'hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjA'hhhjW'hKubah}(h]j<'ah ](jjeh"]h$]h&]jj)jhuh1jhjW'hKhj>'hhubj)}(hhh]h)}(h&allocate a composite backing file blobh]h&allocate a composite backing file blob}(hj (hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj(hhubah}(h]h ]h"]h$]h&]uh1jhj>'hhhjW'hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!(jj!(jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct file *backing_file`` the backing file **Description** Allocate the backing file blob for all the modules. Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj+(h]h Parameters}(hj-(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)(ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj%(ubj )}(hhh]j)}(h/``struct file *backing_file`` the backing file h](j)}(h``struct file *backing_file``h]j)}(hjJ(h]hstruct file *backing_file}(hjL(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH(ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjD(ubj2)}(hhh]h)}(hthe backing fileh]hthe backing file}(hjc(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_(hKhj`(ubah}(h]h ]h"]h$]h&]uh1j1hjD(ubeh}(h]h ]h"]h$]h&]uh1jhj_(hKhjA(ubah}(h]h ]h"]h$]h&]uh1j hj%(ubh)}(h**Description**h]j)}(hj(h]h Description}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj%(ubh)}(h3Allocate the backing file blob for all the modules.h]h3Allocate the backing file blob for all the modules.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj%(ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj%(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_blob_alloc (C function)c.lsm_blob_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h8int lsm_blob_alloc (void **dest, size_t size, gfp_t gfp)h]j)}(h7int lsm_blob_alloc(void **dest, size_t size, gfp_t gfp)h](j )}(hinth]hint}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj(hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(hhhj(hKubj{)}(hlsm_blob_alloch]j)}(hlsm_blob_alloch]hlsm_blob_alloc}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj(hhhj(hKubj)}(h%(void **dest, size_t size, gfp_t gfp)h](j)}(h void **desth](j )}(hvoidh]hvoid}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj$)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(hjh]h*}(hj2)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hjh]h*}(hj?)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hdesth]hdest}(hjL)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjh)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje)ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjj)modnameN classnameNj] j` )}jc ]jf )}jY j(sbc.lsm_blob_allocasbuh1hhja)ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hja)ubj)}(hsizeh]hsize}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubj)}(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&] refdomainjreftypejY reftargetj)modnameN classnameNj] j` )}jc ]j)c.lsm_blob_allocasbuh1hhj)ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(hgfph]hgfp}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubeh}(h]h ]h"]h$]h&]jjuh1jhj(hhhj(hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj(hhhj(hKubah}(h]j(ah ](jjeh"]h$]h&]jj)jhuh1jhj(hKhj(hhubj)}(hhh]h)}(hallocate a composite blobh]hallocate a composite blob}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj*hhubah}(h]h ]h"]h$]h&]uh1jhj(hhhj(hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj *jj *jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``void **dest`` the destination for the blob ``size_t size`` the size of the blob ``gfp_t gfp`` allocation type **Description** Allocate a blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj**h]h Parameters}(hj,*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(*ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj$*ubj )}(hhh](j)}(h-``void **dest`` the destination for the blob h](j)}(h``void **dest``h]j)}(hjI*h]h void **dest}(hjK*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG*ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjC*ubj2)}(hhh]h)}(hthe destination for the blobh]hthe destination for the blob}(hjb*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^*hKhj_*ubah}(h]h ]h"]h$]h&]uh1j1hjC*ubeh}(h]h ]h"]h$]h&]uh1jhj^*hKhj@*ubj)}(h%``size_t size`` the size of the blob h](j)}(h``size_t size``h]j)}(hj*h]h size_t size}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj|*ubj2)}(hhh]h)}(hthe size of the blobh]hthe size of the blob}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hKhj*ubah}(h]h ]h"]h$]h&]uh1j1hj|*ubeh}(h]h ]h"]h$]h&]uh1jhj*hKhj@*ubj)}(h``gfp_t gfp`` allocation type h](j)}(h ``gfp_t gfp``h]j)}(hj*h]h gfp_t gfp}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj*ubj2)}(hhh]h)}(hallocation typeh]hallocation type}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hKhj*ubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hKhj@*ubeh}(h]h ]h"]h$]h&]uh1j hj$*ubh)}(h**Description**h]j)}(hj*h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj$*ubh)}(h#Allocate a blob for all the modulesh]h#Allocate a blob for all the modules}(hj +hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj$*ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj$*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_cred_alloc (C function)c.lsm_cred_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h1int lsm_cred_alloc (struct cred *cred, gfp_t gfp)h]j)}(h0int lsm_cred_alloc(struct cred *cred, gfp_t gfp)h](j )}(hinth]hint}(hjJ+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjF+hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKubj2)}(h h]h }(hjY+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjF+hhhjX+hKubj{)}(hlsm_cred_alloch]j)}(hlsm_cred_alloch]hlsm_cred_alloc}(hjk+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjg+ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjF+hhhjX+hKubj)}(h(struct cred *cred, gfp_t gfp)h](j)}(hstruct cred *credh](j)}(hjAh]hstruct}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubh)}(hhh]j)}(hcredh]hcred}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj+modnameN classnameNj] j` )}jc ]jf )}jY jm+sbc.lsm_cred_allocasbuh1hhj+ubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hcredh]hcred}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(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&] refdomainjreftypejY reftargetj+modnameN classnameNj] j` )}jc ]j+c.lsm_cred_allocasbuh1hhj+ubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj)}(hgfph]hgfp}(hj(,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubeh}(h]h ]h"]h$]h&]jjuh1jhjF+hhhjX+hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjB+hhhjX+hKubah}(h]j=+ah ](jjeh"]h$]h&]jj)jhuh1jhjX+hKhj?+hhubj)}(hhh]h)}(hallocate a composite cred blobh]hallocate a composite cred blob}(hjR,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjO,hhubah}(h]h ]h"]h$]h&]uh1jhj?+hhhjX+hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjj,jjj,jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct cred *cred`` the cred that needs a blob ``gfp_t gfp`` allocation type **Description** Allocate the cred blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hjt,h]h Parameters}(hjv,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjr,ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjn,ubj )}(hhh](j)}(h1``struct cred *cred`` the cred that needs a blob h](j)}(h``struct cred *cred``h]j)}(hj,h]hstruct cred *cred}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj,ubj2)}(hhh]h)}(hthe cred that needs a blobh]hthe cred that needs a blob}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj,ubah}(h]h ]h"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hKhj,ubj)}(h``gfp_t gfp`` allocation type h](j)}(h ``gfp_t gfp``h]j)}(hj,h]h gfp_t gfp}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj,ubj2)}(hhh]h)}(hallocation typeh]hallocation type}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj,ubah}(h]h ]h"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hKhj,ubeh}(h]h ]h"]h$]h&]uh1j hjn,ubh)}(h**Description**h]j)}(hj-h]h Description}(hj -hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjn,ubh)}(h*Allocate the cred blob for all the modulesh]h*Allocate the cred blob for all the modules}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjn,ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj,-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjn,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_inode_alloc (C function)c.lsm_inode_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h4int lsm_inode_alloc (struct inode *inode, gfp_t gfp)h]j)}(h3int lsm_inode_alloc(struct inode *inode, gfp_t gfp)h](j )}(hinth]hint}(hj[-hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjW-hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKubj2)}(h h]h }(hjj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjW-hhhji-hKubj{)}(hlsm_inode_alloch]j)}(hlsm_inode_alloch]hlsm_inode_alloc}(hj|-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx-ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjW-hhhji-hKubj)}(h (struct inode *inode, gfp_t gfp)h](j)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubh)}(hhh]j)}(hinodeh]hinode}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj-modnameN classnameNj] j` )}jc ]jf )}jY j~-sbc.lsm_inode_allocasbuh1hhj-ubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(hjh]h*}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hinodeh]hinode}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj-ubj)}(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&] refdomainjreftypejY reftargetj.modnameN classnameNj] j` )}jc ]j-c.lsm_inode_allocasbuh1hhj.ubj2)}(h h]h }(hj+.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hgfph]hgfp}(hj9.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj-ubeh}(h]h ]h"]h$]h&]jjuh1jhjW-hhhji-hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjS-hhhji-hKubah}(h]jN-ah ](jjeh"]h$]h&]jj)jhuh1jhji-hKhjP-hhubj)}(hhh]h)}(hallocate a composite inode blobh]hallocate a composite inode blob}(hjc.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj`.hhubah}(h]h ]h"]h$]h&]uh1jhjP-hhhji-hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj{.jj{.jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct inode *inode`` the inode that needs a blob ``gfp_t gfp`` allocation flags **Description** Allocate the inode blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj.ubj )}(hhh](j)}(h4``struct inode *inode`` the inode that needs a blob h](j)}(h``struct inode *inode``h]j)}(hj.h]hstruct inode *inode}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj.ubj2)}(hhh]h)}(hthe inode that needs a blobh]hthe inode that needs a blob}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hKhj.ubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhj.ubj)}(h``gfp_t gfp`` allocation flags h](j)}(h ``gfp_t gfp``h]j)}(hj.h]h gfp_t gfp}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj.ubj2)}(hhh]h)}(hallocation flagsh]hallocation flags}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hKhj.ubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhj.ubeh}(h]h ]h"]h$]h&]uh1j hj.ubh)}(h**Description**h]j)}(hj/h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj.ubh)}(h+Allocate the inode blob for all the modulesh]h+Allocate the inode blob for all the modules}(hj./hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj.ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj=/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_task_alloc (C function)c.lsm_task_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h-int lsm_task_alloc (struct task_struct *task)h]j)}(h,int lsm_task_alloc(struct task_struct *task)h](j )}(hinth]hint}(hjl/hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjh/hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj{/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjh/hhhjz/hMubj{)}(hlsm_task_alloch]j)}(hlsm_task_alloch]hlsm_task_alloc}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjh/hhhjz/hMubj)}(h(struct task_struct *task)h]j)}(hstruct task_struct *taskh](j)}(hjAh]hstruct}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubh)}(hhh]j)}(h task_structh]h task_struct}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj/modnameN classnameNj] j` )}jc ]jf )}jY j/sbc.lsm_task_allocasbuh1hhj/ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(hjh]h*}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(htaskh]htask}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj/ubah}(h]h ]h"]h$]h&]jjuh1jhjh/hhhjz/hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjd/hhhjz/hMubah}(h]j_/ah ](jjeh"]h$]h&]jj)jhuh1jhjz/hMhja/hhubj)}(hhh]h)}(hallocate a composite task blobh]hallocate a composite task blob}(hj,0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj)0hhubah}(h]h ]h"]h$]h&]uh1jhja/hhhjz/hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjD0jjD0jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *task`` the task that needs a blob **Description** Allocate the task blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hjN0h]h Parameters}(hjP0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL0ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjH0ubj )}(hhh]j)}(h8``struct task_struct *task`` the task that needs a blob h](j)}(h``struct task_struct *task``h]j)}(hjm0h]hstruct task_struct *task}(hjo0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk0ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjg0ubj2)}(hhh]h)}(hthe task that needs a blobh]hthe task that needs a blob}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1j1hjg0ubeh}(h]h ]h"]h$]h&]uh1jhj0hMhjd0ubah}(h]h ]h"]h$]h&]uh1j hjH0ubh)}(h**Description**h]j)}(hj0h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjH0ubh)}(h*Allocate the task blob for all the modulesh]h*Allocate the task blob for all the modules}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjH0ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjH0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_ipc_alloc (C function)c.lsm_ipc_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h-int lsm_ipc_alloc (struct kern_ipc_perm *kip)h]j)}(h,int lsm_ipc_alloc(struct kern_ipc_perm *kip)h](j )}(hinth]hint}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj0hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj 1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0hhhj 1hMubj{)}(h lsm_ipc_alloch]j)}(h lsm_ipc_alloch]h lsm_ipc_alloc}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj0hhhj 1hMubj)}(h(struct kern_ipc_perm *kip)h]j)}(hstruct kern_ipc_perm *kiph](j)}(hjAh]hstruct}(hj91hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj51ubj2)}(h h]h }(hjF1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj51ubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjW1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT1ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjY1modnameN classnameNj] j` )}jc ]jf )}jY j1sbc.lsm_ipc_allocasbuh1hhj51ubj2)}(h h]h }(hjw1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj51ubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj51ubj)}(hkiph]hkip}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj51ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj11ubah}(h]h ]h"]h$]h&]jjuh1jhj0hhhj 1hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj0hhhj 1hMubah}(h]j0ah ](jjeh"]h$]h&]jj)jhuh1jhj 1hMhj0hhubj)}(hhh]h)}(hallocate a composite ipc blobh]hallocate a composite ipc blob}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj1hhubah}(h]h ]h"]h$]h&]uh1jhj0hhhj 1hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj1jj1jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct kern_ipc_perm *kip`` the ipc that needs a blob **Description** Allocate the ipc blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj1ubj )}(hhh]j)}(h8``struct kern_ipc_perm *kip`` the ipc that needs a blob h](j)}(h``struct kern_ipc_perm *kip``h]j)}(hj1h]hstruct kern_ipc_perm *kip}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj1ubj2)}(hhh]h)}(hthe ipc that needs a blobh]hthe ipc that needs a blob}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1j1hj1ubeh}(h]h ]h"]h$]h&]uh1jhj2hMhj1ubah}(h]h ]h"]h$]h&]uh1j hj1ubh)}(h**Description**h]j)}(hj82h]h Description}(hj:2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj62ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj1ubh)}(h)Allocate the ipc blob for all the modulesh]h)Allocate the ipc blob for all the modules}(hjN2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj1ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj]2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_key_alloc (C function)c.lsm_key_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h#int lsm_key_alloc (struct key *key)h]j)}(h"int lsm_key_alloc(struct key *key)h](j )}(hinth]hint}(hj2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj2hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2hhhj2hM ubj{)}(h lsm_key_alloch]j)}(h lsm_key_alloch]h lsm_key_alloc}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj2hhhj2hM ubj)}(h(struct key *key)h]j)}(hstruct key *keyh](j)}(hjAh]hstruct}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubh)}(hhh]j)}(hkeyh]hkey}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj2modnameN classnameNj] j` )}jc ]jf )}jY j2sbc.lsm_key_allocasbuh1hhj2ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubj)}(hjh]h*}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hkeyh]hkey}(hj"3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj2ubah}(h]h ]h"]h$]h&]jjuh1jhj2hhhj2hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj2hhhj2hM ubah}(h]j2ah ](jjeh"]h$]h&]jj)jhuh1jhj2hM hj2hhubj)}(hhh]h)}(hallocate a composite key blobh]hallocate a composite key blob}(hjL3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjI3hhubah}(h]h ]h"]h$]h&]uh1jhj2hhhj2hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjd3jjd3jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct key *key`` the key that needs a blob **Description** Allocate the key blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hjn3h]h Parameters}(hjp3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl3ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM$hjh3ubj )}(hhh]j)}(h.``struct key *key`` the key that needs a blob h](j)}(h``struct key *key``h]j)}(hj3h]hstruct key *key}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM!hj3ubj2)}(hhh]h)}(hthe key that needs a blobh]hthe key that needs a blob}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hM!hj3ubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hM!hj3ubah}(h]h ]h"]h$]h&]uh1j hjh3ubh)}(h**Description**h]j)}(hj3h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM#hjh3ubh)}(h)Allocate the key blob for all the modulesh]h)Allocate the key blob for all the modules}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM"hjh3ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM$hjh3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_msg_msg_alloc (C function)c.lsm_msg_msg_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h*int lsm_msg_msg_alloc (struct msg_msg *mp)h]j)}(h)int lsm_msg_msg_alloc(struct msg_msg *mp)h](j )}(hinth]hint}(hj4hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj4hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM.ubj2)}(h h]h }(hj+4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4hhhj*4hM.ubj{)}(hlsm_msg_msg_alloch]j)}(hlsm_msg_msg_alloch]hlsm_msg_msg_alloc}(hj=4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj94ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj4hhhj*4hM.ubj)}(h(struct msg_msg *mp)h]j)}(hstruct msg_msg *mph](j)}(hjAh]hstruct}(hjY4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU4ubj2)}(h h]h }(hjf4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjU4ubh)}(hhh]j)}(hmsg_msgh]hmsg_msg}(hjw4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt4ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjy4modnameN classnameNj] j` )}jc ]jf )}jY j?4sbc.lsm_msg_msg_allocasbuh1hhjU4ubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjU4ubj)}(hjh]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU4ubj)}(hmph]hmp}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQ4ubah}(h]h ]h"]h$]h&]jjuh1jhj4hhhj*4hM.ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj4hhhj*4hM.ubah}(h]j4ah ](jjeh"]h$]h&]jj)jhuh1jhj*4hM.hj4hhubj)}(hhh]h)}(h!allocate a composite msg_msg blobh]h!allocate a composite msg_msg blob}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM.hj4hhubah}(h]h ]h"]h$]h&]uh1jhj4hhhj*4hM.ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4jj4jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct msg_msg *mp`` the msg_msg that needs a blob **Description** Allocate the ipc blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj4h]h Parameters}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM2hj4ubj )}(hhh]j)}(h5``struct msg_msg *mp`` the msg_msg that needs a blob h](j)}(h``struct msg_msg *mp``h]j)}(hj5h]hstruct msg_msg *mp}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM/hj5ubj2)}(hhh]h)}(hthe msg_msg that needs a blobh]hthe msg_msg that needs a blob}(hj65hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj25hM/hj35ubah}(h]h ]h"]h$]h&]uh1j1hj5ubeh}(h]h ]h"]h$]h&]uh1jhj25hM/hj5ubah}(h]h ]h"]h$]h&]uh1j hj4ubh)}(h**Description**h]j)}(hjX5h]h Description}(hjZ5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV5ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM1hj4ubh)}(h)Allocate the ipc blob for all the modulesh]h)Allocate the ipc blob for all the modules}(hjn5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM0hj4ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj}5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM2hj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_bdev_alloc (C function)c.lsm_bdev_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h.int lsm_bdev_alloc (struct block_device *bdev)h]j)}(h-int lsm_bdev_alloc(struct block_device *bdev)h](j )}(hinth]hint}(hj5hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM<ubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5hhhj5hM<ubj{)}(hlsm_bdev_alloch]j)}(hlsm_bdev_alloch]hlsm_bdev_alloc}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj5hhhj5hM<ubj)}(h(struct block_device *bdev)h]j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubh)}(hhh]j)}(h block_deviceh]h block_device}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj 6modnameN classnameNj] j` )}jc ]jf )}jY j5sbc.lsm_bdev_allocasbuh1hhj5ubj2)}(h h]h }(hj'6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hjh]h*}(hj56hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hbdevh]hbdev}(hjB6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubah}(h]h ]h"]h$]h&]jjuh1jhj5hhhj5hM<ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj5hhhj5hM<ubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1jhj5hM<hj5hhubj)}(hhh]h)}(h&allocate a composite block_device blobh]h&allocate a composite block_device blob}(hjl6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM<hji6hhubah}(h]h ]h"]h$]h&]uh1jhj5hhhj5hM<ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj6jj6jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct block_device *bdev`` the block_device that needs a blob **Description** Allocate the block_device blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM@hj6ubj )}(hhh]j)}(hA``struct block_device *bdev`` the block_device that needs a blob h](j)}(h``struct block_device *bdev``h]j)}(hj6h]hstruct block_device *bdev}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM=hj6ubj2)}(hhh]h)}(h"the block_device that needs a blobh]h"the block_device that needs a blob}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hM=hj6ubah}(h]h ]h"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]uh1jhj6hM=hj6ubah}(h]h ]h"]h$]h&]uh1j hj6ubh)}(h**Description**h]j)}(hj6h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM?hj6ubh)}(h2Allocate the block_device blob for all the modulesh]h2Allocate the block_device blob for all the modules}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM>hj6ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj 7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM@hj6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_bpf_map_alloc (C function)c.lsm_bpf_map_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h+int lsm_bpf_map_alloc (struct bpf_map *map)h]j)}(h*int lsm_bpf_map_alloc(struct bpf_map *map)h](j )}(hinth]hint}(hj<7hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj87hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMKubj2)}(h h]h }(hjK7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj87hhhjJ7hMKubj{)}(hlsm_bpf_map_alloch]j)}(hlsm_bpf_map_alloch]hlsm_bpf_map_alloc}(hj]7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY7ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj87hhhjJ7hMKubj)}(h(struct bpf_map *map)h]j)}(hstruct bpf_map *maph](j)}(hjAh]hstruct}(hjy7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju7ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hju7ubh)}(hhh]j)}(hbpf_maph]hbpf_map}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7modnameN classnameNj] j` )}jc ]jf )}jY j_7sbc.lsm_bpf_map_allocasbuh1hhju7ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hju7ubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju7ubj)}(hmaph]hmap}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjq7ubah}(h]h ]h"]h$]h&]jjuh1jhj87hhhjJ7hMKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj47hhhjJ7hMKubah}(h]j/7ah ](jjeh"]h$]h&]jj)jhuh1jhjJ7hMKhj17hhubj)}(hhh]h)}(h!allocate a composite bpf_map blobh]h!allocate a composite bpf_map blob}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMKhj7hhubah}(h]h ]h"]h$]h&]uh1jhj17hhhjJ7hMKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj8jj8jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct bpf_map *map`` the bpf_map that needs a blob **Description** Allocate the bpf_map blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj8h]h Parameters}(hj 8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMOhj8ubj )}(hhh]j)}(h6``struct bpf_map *map`` the bpf_map that needs a blob h](j)}(h``struct bpf_map *map``h]j)}(hj=8h]hstruct bpf_map *map}(hj?8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;8ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMLhj78ubj2)}(hhh]h)}(hthe bpf_map that needs a blobh]hthe bpf_map that needs a blob}(hjV8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjR8hMLhjS8ubah}(h]h ]h"]h$]h&]uh1j1hj78ubeh}(h]h ]h"]h$]h&]uh1jhjR8hMLhj48ubah}(h]h ]h"]h$]h&]uh1j hj8ubh)}(h**Description**h]j)}(hjx8h]h Description}(hjz8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv8ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMNhj8ubh)}(h-Allocate the bpf_map blob for all the modulesh]h-Allocate the bpf_map blob for all the modules}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMMhj8ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMOhj8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_bpf_prog_alloc (C function)c.lsm_bpf_prog_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h.int lsm_bpf_prog_alloc (struct bpf_prog *prog)h]j)}(h-int lsm_bpf_prog_alloc(struct bpf_prog *prog)h](j )}(hinth]hint}(hj8hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj8hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMXubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8hhhj8hMXubj{)}(hlsm_bpf_prog_alloch]j)}(hlsm_bpf_prog_alloch]hlsm_bpf_prog_alloc}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj8hhhj8hMXubj)}(h(struct bpf_prog *prog)h]j)}(hstruct bpf_prog *progh](j)}(hjAh]hstruct}(hj 9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubh)}(hhh]j)}(hbpf_progh]hbpf_prog}(hj'9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$9ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj)9modnameN classnameNj] j` )}jc ]jf )}jY j8sbc.lsm_bpf_prog_allocasbuh1hhj9ubj2)}(h h]h }(hjG9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubj)}(hjh]h*}(hjU9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hprogh]hprog}(hjb9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubah}(h]h ]h"]h$]h&]jjuh1jhj8hhhj8hMXubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj8hhhj8hMXubah}(h]j8ah ](jjeh"]h$]h&]jj)jhuh1jhj8hMXhj8hhubj)}(hhh]h)}(h"allocate a composite bpf_prog blobh]h"allocate a composite bpf_prog blob}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMXhj9hhubah}(h]h ]h"]h$]h&]uh1jhj8hhhj8hMXubeh}(h]h ](jfunctioneh"]h$]h&]jjjj9jj9jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct bpf_prog *prog`` the bpf_prog that needs a blob **Description** Allocate the bpf_prog blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj9h]h Parameters}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\hj9ubj )}(hhh]j)}(h9``struct bpf_prog *prog`` the bpf_prog that needs a blob h](j)}(h``struct bpf_prog *prog``h]j)}(hj9h]hstruct bpf_prog *prog}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMYhj9ubj2)}(hhh]h)}(hthe bpf_prog that needs a blobh]hthe bpf_prog that needs a blob}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hMYhj9ubah}(h]h ]h"]h$]h&]uh1j1hj9ubeh}(h]h ]h"]h$]h&]uh1jhj9hMYhj9ubah}(h]h ]h"]h$]h&]uh1j hj9ubh)}(h**Description**h]j)}(hj:h]h Description}(hj :hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM[hj9ubh)}(h.Allocate the bpf_prog blob for all the modulesh]h.Allocate the bpf_prog blob for all the modules}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMZhj9ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj-:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\hj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  lsm_bpf_token_alloc (C function)c.lsm_bpf_token_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h1int lsm_bpf_token_alloc (struct bpf_token *token)h]j)}(h0int lsm_bpf_token_alloc(struct bpf_token *token)h](j )}(hinth]hint}(hj\:hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjX:hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMeubj2)}(h h]h }(hjk:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjX:hhhjj:hMeubj{)}(hlsm_bpf_token_alloch]j)}(hlsm_bpf_token_alloch]hlsm_bpf_token_alloc}(hj}:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy:ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjX:hhhjj:hMeubj)}(h(struct bpf_token *token)h]j)}(hstruct bpf_token *tokenh](j)}(hjAh]hstruct}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubh)}(hhh]j)}(h bpf_tokenh]h bpf_token}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj:modnameN classnameNj] j` )}jc ]jf )}jY j:sbc.lsm_bpf_token_allocasbuh1hhj:ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(htokenh]htoken}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubah}(h]h ]h"]h$]h&]jjuh1jhjX:hhhjj:hMeubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjT:hhhjj:hMeubah}(h]jO:ah ](jjeh"]h$]h&]jj)jhuh1jhjj:hMehjQ:hhubj)}(hhh]h)}(h#allocate a composite bpf_token blobh]h#allocate a composite bpf_token blob}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMehj;hhubah}(h]h ]h"]h$]h&]uh1jhjQ:hhhjj:hMeubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4;jj4;jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct bpf_token *token`` the bpf_token that needs a blob **Description** Allocate the bpf_token blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj>;h]h Parameters}(hj@;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<;ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMihj8;ubj )}(hhh]j)}(h<``struct bpf_token *token`` the bpf_token that needs a blob h](j)}(h``struct bpf_token *token``h]j)}(hj];h]hstruct bpf_token *token}(hj_;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[;ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMfhjW;ubj2)}(hhh]h)}(hthe bpf_token that needs a blobh]hthe bpf_token that needs a blob}(hjv;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjr;hMfhjs;ubah}(h]h ]h"]h$]h&]uh1j1hjW;ubeh}(h]h ]h"]h$]h&]uh1jhjr;hMfhjT;ubah}(h]h ]h"]h$]h&]uh1j hj8;ubh)}(h**Description**h]j)}(hj;h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhhj8;ubh)}(h/Allocate the bpf_token blob for all the modulesh]h/Allocate the bpf_token blob for all the modules}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMghj8;ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMihj8;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !lsm_superblock_alloc (C function)c.lsm_superblock_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h1int lsm_superblock_alloc (struct super_block *sb)h]j)}(h0int lsm_superblock_alloc(struct super_block *sb)h](j )}(hinth]hint}(hj;hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj;hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMsubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;hhhj;hMsubj{)}(hlsm_superblock_alloch]j)}(hlsm_superblock_alloch]hlsm_superblock_alloc}(hj <hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj <ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj;hhhj;hMsubj)}(h(struct super_block *sb)h]j)}(hstruct super_block *sbh](j)}(hjAh]hstruct}(hj)<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%<ubj2)}(h h]h }(hj6<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%<ubh)}(hhh]j)}(h super_blockh]h super_block}(hjG<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD<ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjI<modnameN classnameNj] j` )}jc ]jf )}jY j<sbc.lsm_superblock_allocasbuh1hhj%<ubj2)}(h h]h }(hjg<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%<ubj)}(hjh]h*}(hju<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%<ubj)}(hsbh]hsb}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!<ubah}(h]h ]h"]h$]h&]jjuh1jhj;hhhj;hMsubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj;hhhj;hMsubah}(h]j;ah ](jjeh"]h$]h&]jj)jhuh1jhj;hMshj;hhubj)}(hhh]h)}(h$allocate a composite superblock blobh]h$allocate a composite superblock blob}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMshj<hhubah}(h]h ]h"]h$]h&]uh1jhj;hhhj;hMsubeh}(h]h ](jfunctioneh"]h$]h&]jjjj<jj<jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct super_block *sb`` the superblock that needs a blob **Description** Allocate the superblock blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj<h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMwhj<ubj )}(hhh]j)}(h<``struct super_block *sb`` the superblock that needs a blob h](j)}(h``struct super_block *sb``h]j)}(hj<h]hstruct super_block *sb}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMthj<ubj2)}(hhh]h)}(h the superblock that needs a blobh]h the superblock that needs a blob}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMthj=ubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhj=hMthj<ubah}(h]h ]h"]h$]h&]uh1j hj<ubh)}(h**Description**h]j)}(hj(=h]h Description}(hj*=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&=ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMvhj<ubh)}(h0Allocate the superblock blob for all the modulesh]h0Allocate the superblock blob for all the modules}(hj>=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMuhj<ubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hjM=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMwhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_fill_user_ctx (C function)c.lsm_fill_user_ctxhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hpint lsm_fill_user_ctx (struct lsm_ctx __user *uctx, u32 *uctx_len, void *val, size_t val_len, u64 id, u64 flags)h]j)}(hoint lsm_fill_user_ctx(struct lsm_ctx __user *uctx, u32 *uctx_len, void *val, size_t val_len, u64 id, u64 flags)h](j )}(hinth]hint}(hj|=hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjx=hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjx=hhhj=hMubj{)}(hlsm_fill_user_ctxh]j)}(hlsm_fill_user_ctxh]hlsm_fill_user_ctx}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjx=hhhj=hMubj)}(hZ(struct lsm_ctx __user *uctx, u32 *uctx_len, void *val, size_t val_len, u64 id, u64 flags)h](j)}(hstruct lsm_ctx __user *uctxh](j)}(hjAh]hstruct}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=ubh)}(hhh]j)}(hlsm_ctxh]hlsm_ctx}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj=modnameN classnameNj] j` )}jc ]jf )}jY j=sbc.lsm_fill_user_ctxasbuh1hhj=ubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=ubh__user}(hj=hhhNhNubj2)}(h h]h }(hj >hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=ubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(huctxh]huctx}(hj$>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(h u32 *uctx_lenh](h)}(hhh]j)}(hu32h]hu32}(hj@>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=>ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjB>modnameN classnameNj] j` )}jc ]j=c.lsm_fill_user_ctxasbuh1hhj9>ubj2)}(h h]h }(hj^>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9>ubj)}(hjh]h*}(hjl>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9>ubj)}(huctx_lenh]huctx_len}(hjy>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(h void *valh](j )}(hvoidh]hvoid}(hj>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hvalh]hval}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(hsize_t val_lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj>modnameN classnameNj] j` )}jc ]j=c.lsm_fill_user_ctxasbuh1hhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hval_lenh]hval_len}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(hu64 idh](h)}(hhh]j)}(hu64h]hu64}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj!?modnameN classnameNj] j` )}jc ]j=c.lsm_fill_user_ctxasbuh1hhj?ubj2)}(h h]h }(hj=?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubj)}(hidh]hid}(hjK?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubj)}(h u64 flagsh](h)}(hhh]j)}(hu64h]hu64}(hjg?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd?ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetji?modnameN classnameNj] j` )}jc ]j=c.lsm_fill_user_ctxasbuh1hhj`?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`?ubj)}(hflagsh]hflags}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubeh}(h]h ]h"]h$]h&]jjuh1jhjx=hhhj=hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjt=hhhj=hMubah}(h]jo=ah ](jjeh"]h$]h&]jj)jhuh1jhj=hMhjq=hhubj)}(hhh]h)}(h#Fill a user space lsm_ctx structureh]h#Fill a user space lsm_ctx structure}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj?hhubah}(h]h ]h"]h$]h&]uh1jhjq=hhhj=hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj?jj?jjjuh1jhhhj%hNhNubj)}(hXy**Parameters** ``struct lsm_ctx __user *uctx`` a userspace LSM context to be filled ``u32 *uctx_len`` available uctx size (input), used uctx size (output) ``void *val`` the new LSM context value ``size_t val_len`` the size of the new LSM context value ``u64 id`` LSM id ``u64 flags`` LSM defined flags **Description** Fill all of the fields in a userspace lsm_ctx structure. If **uctx** is NULL simply calculate the required size to output via **utc_len** and return success. Returns 0 on success, -E2BIG if userspace buffer is not large enough, -EFAULT on a copyout error, -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hj?h]h Parameters}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj?ubj )}(hhh](j)}(hE``struct lsm_ctx __user *uctx`` a userspace LSM context to be filled h](j)}(h``struct lsm_ctx __user *uctx``h]j)}(hj?h]hstruct lsm_ctx __user *uctx}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj?ubj2)}(hhh]h)}(h$a userspace LSM context to be filledh]h$a userspace LSM context to be filled}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhj@ubah}(h]h ]h"]h$]h&]uh1j1hj?ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhj?ubj)}(hG``u32 *uctx_len`` available uctx size (input), used uctx size (output) h](j)}(h``u32 *uctx_len``h]j)}(hj7@h]h u32 *uctx_len}(hj9@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5@ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj1@ubj2)}(hhh]h)}(h4available uctx size (input), used uctx size (output)h]h4available uctx size (input), used uctx size (output)}(hjP@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjL@hMhjM@ubah}(h]h ]h"]h$]h&]uh1j1hj1@ubeh}(h]h ]h"]h$]h&]uh1jhjL@hMhj?ubj)}(h(``void *val`` the new LSM context value h](j)}(h ``void *val``h]j)}(hjp@h]h void *val}(hjr@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjn@ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjj@ubj2)}(hhh]h)}(hthe new LSM context valueh]hthe new LSM context value}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhj@ubah}(h]h ]h"]h$]h&]uh1j1hjj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhj?ubj)}(h9``size_t val_len`` the size of the new LSM context value h](j)}(h``size_t val_len``h]j)}(hj@h]hsize_t val_len}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj@ubj2)}(hhh]h)}(h%the size of the new LSM context valueh]h%the size of the new LSM context value}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhj@ubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhj?ubj)}(h``u64 id`` LSM id h](j)}(h ``u64 id``h]j)}(hj@h]hu64 id}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj@ubj2)}(hhh]h)}(hLSM idh]hLSM id}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhj@ubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhj?ubj)}(h ``u64 flags`` LSM defined flags h](j)}(h ``u64 flags``h]j)}(hjAh]h u64 flags}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjAubj2)}(hhh]h)}(hLSM defined flagsh]hLSM defined flags}(hj4AhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0AhMhj1Aubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj0AhMhj?ubeh}(h]h ]h"]h$]h&]uh1j hj?ubh)}(h**Description**h]j)}(hjVAh]h Description}(hjXAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTAubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj?ubh)}(hFill all of the fields in a userspace lsm_ctx structure. If **uctx** is NULL simply calculate the required size to output via **utc_len** and return success.h](h=Fill all of the fields in a userspace lsm_ctx structure. If }(hjlAhhhNhNubj)}(h**uctx**h]huctx}(hjtAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlAubh: is NULL simply calculate the required size to output via }(hjlAhhhNhNubj)}(h **utc_len**h]hutc_len}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlAubh and return success.}(hjlAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj?ubh)}(hReturns 0 on success, -E2BIG if userspace buffer is not large enough, -EFAULT on a copyout error, -ENOMEM if memory can't be allocated.h]hReturns 0 on success, -E2BIG if userspace buffer is not large enough, -EFAULT on a copyout error, -ENOMEM if memory can’t be allocated.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ,security_binder_set_context_mgr (C function)!c.security_binder_set_context_mgrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjAhhhjAhMubj{)}(hsecurity_binder_set_context_mgrh]j)}(hsecurity_binder_set_context_mgrh]hsecurity_binder_set_context_mgr}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjAhhhjAhMubj)}(h(const struct cred *mgr)h]j)}(hconst struct cred *mgrh](j)}(hjh]hconst}(hj BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hjAh]hstruct}(hj&BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj2)}(h h]h }(hj3BhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubh)}(hhh]j)}(hcredh]hcred}(hjDBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjABubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjFBmodnameN classnameNj] j` )}jc ]jf )}jY jAsb!c.security_binder_set_context_mgrasbuh1hhjBubj2)}(h h]h }(hjdBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hjh]h*}(hjrBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(hmgrh]hmgr}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubah}(h]h ]h"]h$]h&]jjuh1jhjAhhhjAhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjAhhhjAhMubah}(h]jAah ](jjeh"]h$]h&]jj)jhuh1jhjAhMhjAhhubj)}(hhh]h)}(h&Check if becoming binder ctx mgr is okh]h&Check if becoming binder ctx mgr is ok}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjBhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjAhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjBjjBjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``const struct cred *mgr`` task credentials of current binder process **Description** Check whether **mgr** is allowed to be the binder context manager. **Return** Return 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjBubj )}(hhh]j)}(hF``const struct cred *mgr`` task credentials of current binder process h](j)}(h``const struct cred *mgr``h]j)}(hjBh]hconst struct cred *mgr}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjBubj2)}(hhh]h)}(h*task credentials of current binder processh]h*task credentials of current binder process}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhMhjCubah}(h]h ]h"]h$]h&]uh1j1hjBubeh}(h]h ]h"]h$]h&]uh1jhjBhMhjBubah}(h]h ]h"]h$]h&]uh1j hjBubh)}(h**Description**h]j)}(hj%Ch]h Description}(hj'ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#Cubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjBubh)}(hBCheck whether **mgr** is allowed to be the binder context manager.h](hCheck whether }(hj;ChhhNhNubj)}(h**mgr**h]hmgr}(hjCChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;Cubh- is allowed to be the binder context manager.}(hj;ChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjBubh)}(h **Return**h]j)}(hj^Ch]hReturn}(hj`ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\Cubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjBubh)}(h"Return 0 if permission is granted.h]h"Return 0 if permission is granted.}(hjtChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_binder_transaction (C function)c.security_binder_transactionhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hPint security_binder_transaction (const struct cred *from, const struct cred *to)h]j)}(hOint security_binder_transaction(const struct cred *from, const struct cred *to)h](j )}(hinth]hint}(hjChhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjChhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjChhhjChMubj{)}(hsecurity_binder_transactionh]j)}(hsecurity_binder_transactionh]hsecurity_binder_transaction}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjChhhjChMubj)}(h0(const struct cred *from, const struct cred *to)h](j)}(hconst struct cred *fromh](j)}(hjh]hconst}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubj)}(hjAh]hstruct}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj2)}(h h]h }(hjDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubh)}(hhh]j)}(hcredh]hcred}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjDmodnameN classnameNj] j` )}jc ]jf )}jY jCsbc.security_binder_transactionasbuh1hhjCubj2)}(h h]h }(hj9DhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubj)}(hjh]h*}(hjGDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hfromh]hfrom}(hjTDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubj)}(hconst struct cred *toh](j)}(hjh]hconst}(hjmDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiDubj2)}(h h]h }(hjzDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiDubj)}(hjAh]hstruct}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiDubj2)}(h h]h }(hjDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiDubh)}(hhh]j)}(hcredh]hcred}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjDmodnameN classnameNj] j` )}jc ]j5Dc.security_binder_transactionasbuh1hhjiDubj2)}(h h]h }(hjDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiDubj)}(hjh]h*}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiDubj)}(htoh]hto}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiDubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubeh}(h]h ]h"]h$]h&]jjuh1jhjChhhjChMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjChhhjChMubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1jhjChMhjChhubj)}(hhh]h)}(h(Check if a binder transaction is allowedh]h(Check if a binder transaction is allowed}(hj EhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjEhhubah}(h]h ]h"]h$]h&]uh1jhjChhhjChMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!Ejj!Ejjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``const struct cred *from`` sending process ``const struct cred *to`` receiving process **Description** Check whether **from** is allowed to invoke a binder transaction call to **to**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj+Eh]h Parameters}(hj-EhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)Eubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj%Eubj )}(hhh](j)}(h,``const struct cred *from`` sending process h](j)}(h``const struct cred *from``h]j)}(hjJEh]hconst struct cred *from}(hjLEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHEubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjDEubj2)}(hhh]h)}(hsending processh]hsending process}(hjcEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_EhMhj`Eubah}(h]h ]h"]h$]h&]uh1j1hjDEubeh}(h]h ]h"]h$]h&]uh1jhj_EhMhjAEubj)}(h,``const struct cred *to`` receiving process h](j)}(h``const struct cred *to``h]j)}(hjEh]hconst struct cred *to}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj}Eubj2)}(hhh]h)}(hreceiving processh]hreceiving process}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhM hjEubah}(h]h ]h"]h$]h&]uh1j1hj}Eubeh}(h]h ]h"]h$]h&]uh1jhjEhM hjAEubeh}(h]h ]h"]h$]h&]uh1j hj%Eubh)}(h**Description**h]j)}(hjEh]h Description}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj%Eubh)}(hPCheck whether **from** is allowed to invoke a binder transaction call to **to**.h](hCheck whether }(hjEhhhNhNubj)}(h**from**h]hfrom}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh3 is allowed to invoke a binder transaction call to }(hjEhhhNhNubj)}(h**to**h]hto}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj%Eubh)}(h **Return**h]j)}(hj Fh]hReturn}(hj FhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj%Eubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj%Eubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ,security_binder_transfer_binder (C function)!c.security_binder_transfer_binderhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hTint security_binder_transfer_binder (const struct cred *from, const struct cred *to)h]j)}(hSint security_binder_transfer_binder(const struct cred *from, const struct cred *to)h](j )}(hinth]hint}(hjNFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJFhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj]FhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJFhhhj\FhMubj{)}(hsecurity_binder_transfer_binderh]j)}(hsecurity_binder_transfer_binderh]hsecurity_binder_transfer_binder}(hjoFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkFubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjJFhhhj\FhMubj)}(h0(const struct cred *from, const struct cred *to)h](j)}(hconst struct cred *fromh](j)}(hjh]hconst}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj)}(hjAh]hstruct}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubh)}(hhh]j)}(hcredh]hcred}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjFmodnameN classnameNj] j` )}jc ]jf )}jY jqFsb!c.security_binder_transfer_binderasbuh1hhjFubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hfromh]hfrom}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjFubj)}(hconst struct cred *toh](j)}(hjh]hconst}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj2)}(h h]h }(hj%GhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubj)}(hjAh]hstruct}(hj3GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj2)}(h h]h }(hj@GhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubh)}(hhh]j)}(hcredh]hcred}(hjQGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNGubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjSGmodnameN classnameNj] j` )}jc ]jF!c.security_binder_transfer_binderasbuh1hhjGubj2)}(h h]h }(hjoGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubj)}(hjh]h*}(hj}GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj)}(htoh]hto}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjFubeh}(h]h ]h"]h$]h&]jjuh1jhjJFhhhj\FhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjFFhhhj\FhMubah}(h]jAFah ](jjeh"]h$]h&]jj)jhuh1jhj\FhMhjCFhhubj)}(hhh]h)}(h%Check if a binder transfer is allowedh]h%Check if a binder transfer is allowed}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGhhubah}(h]h ]h"]h$]h&]uh1jhjCFhhhj\FhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjGjjGjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``const struct cred *from`` sending process ``const struct cred *to`` receiving process **Description** Check whether **from** is allowed to transfer a binder reference to **to**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjGh]h Parameters}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGubj )}(hhh](j)}(h,``const struct cred *from`` sending process h](j)}(h``const struct cred *from``h]j)}(hjGh]hconst struct cred *from}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGubj2)}(hhh]h)}(hsending processh]hsending process}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj HhMhj Hubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhj HhMhjGubj)}(h,``const struct cred *to`` receiving process h](j)}(h``const struct cred *to``h]j)}(hj.Hh]hconst struct cred *to}(hj0HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,Hubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj(Hubj2)}(hhh]h)}(hreceiving processh]hreceiving process}(hjGHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjCHhMhjDHubah}(h]h ]h"]h$]h&]uh1j1hj(Hubeh}(h]h ]h"]h$]h&]uh1jhjCHhMhjGubeh}(h]h ]h"]h$]h&]uh1j hjGubh)}(h**Description**h]j)}(hjiHh]h Description}(hjkHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgHubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGubh)}(hKCheck whether **from** is allowed to transfer a binder reference to **to**.h](hCheck whether }(hjHhhhNhNubj)}(h**from**h]hfrom}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh. is allowed to transfer a binder reference to }(hjHhhhNhNubj)}(h**to**h]hto}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGubh)}(h **Return**h]j)}(hjHh]hReturn}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *security_binder_transfer_file (C function)c.security_binder_transfer_filehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hkint security_binder_transfer_file (const struct cred *from, const struct cred *to, const struct file *file)h]j)}(hjint security_binder_transfer_file(const struct cred *from, const struct cred *to, const struct file *file)h](j )}(hinth]hint}(hjHhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM%ubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHhhhjIhM%ubj{)}(hsecurity_binder_transfer_fileh]j)}(hsecurity_binder_transfer_fileh]hsecurity_binder_transfer_file}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjHhhhjIhM%ubj)}(hI(const struct cred *from, const struct cred *to, const struct file *file)h](j)}(hconst struct cred *fromh](j)}(hjh]hconst}(hj6IhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2Iubj2)}(h h]h }(hjCIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2Iubj)}(hjAh]hstruct}(hjQIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2Iubj2)}(h h]h }(hj^IhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2Iubh)}(hhh]j)}(hcredh]hcred}(hjoIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlIubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjqImodnameN classnameNj] j` )}jc ]jf )}jY jIsbc.security_binder_transfer_fileasbuh1hhj2Iubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2Iubj)}(hjh]h*}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2Iubj)}(hfromh]hfrom}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2Iubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj.Iubj)}(hconst struct cred *toh](j)}(hjh]hconst}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjAh]hstruct}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubh)}(hhh]j)}(hcredh]hcred}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjImodnameN classnameNj] j` )}jc ]jIc.security_binder_transfer_fileasbuh1hhjIubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjh]h*}(hj(JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(htoh]hto}(hj5JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj.Iubj)}(hconst struct file *fileh](j)}(hjh]hconst}(hjNJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJJubj2)}(h h]h }(hj[JhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJJubj)}(hjAh]hstruct}(hjiJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJJubj2)}(h h]h }(hjvJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJJubh)}(hhh]j)}(hfileh]hfile}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjJmodnameN classnameNj] j` )}jc ]jIc.security_binder_transfer_fileasbuh1hhjJJubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJJubj)}(hjh]h*}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJJubj)}(hfileh]hfile}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJJubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj.Iubeh}(h]h ]h"]h$]h&]jjuh1jhjHhhhjIhM%ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjHhhhjIhM%ubah}(h]jHah ](jjeh"]h$]h&]jj)jhuh1jhjIhM%hjHhhubj)}(hhh]h)}(h&Check if a binder file xfer is allowedh]h&Check if a binder file xfer is allowed}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM%hjJhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjIhM%ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjKjjKjjjuh1jhhhj%hNhNubj)}(hX'**Parameters** ``const struct cred *from`` sending process ``const struct cred *to`` receiving process ``const struct file *file`` file being transferred **Description** Check whether **from** is allowed to transfer **file** to **to**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj Kh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Kubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM)hjKubj )}(hhh](j)}(h,``const struct cred *from`` sending process h](j)}(h``const struct cred *from``h]j)}(hj+Kh]hconst struct cred *from}(hj-KhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)Kubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM&hj%Kubj2)}(hhh]h)}(hsending processh]hsending process}(hjDKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@KhM&hjAKubah}(h]h ]h"]h$]h&]uh1j1hj%Kubeh}(h]h ]h"]h$]h&]uh1jhj@KhM&hj"Kubj)}(h,``const struct cred *to`` receiving process h](j)}(h``const struct cred *to``h]j)}(hjdKh]hconst struct cred *to}(hjfKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbKubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM'hj^Kubj2)}(hhh]h)}(hreceiving processh]hreceiving process}(hj}KhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyKhM'hjzKubah}(h]h ]h"]h$]h&]uh1j1hj^Kubeh}(h]h ]h"]h$]h&]uh1jhjyKhM'hj"Kubj)}(h3``const struct file *file`` file being transferred h](j)}(h``const struct file *file``h]j)}(hjKh]hconst struct file *file}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM(hjKubj2)}(hhh]h)}(hfile being transferredh]hfile being transferred}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhM(hjKubah}(h]h ]h"]h$]h&]uh1j1hjKubeh}(h]h ]h"]h$]h&]uh1jhjKhM(hj"Kubeh}(h]h ]h"]h$]h&]uh1j hjKubh)}(h**Description**h]j)}(hjKh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM*hjKubh)}(hACheck whether **from** is allowed to transfer **file** to **to**.h](hCheck whether }(hjKhhhNhNubj)}(h**from**h]hfrom}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubh is allowed to transfer }(hjKhhhNhNubj)}(h**file**h]hfile}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubh to }(hjKhhhNhNubj)}(h**to**h]hto}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubh.}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM)hjKubh)}(h **Return**h]j)}(hj5Lh]hReturn}(hj7LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3Lubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM+hjKubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjKLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM,hjKubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )security_ptrace_access_check (C function)c.security_ptrace_access_checkhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hOint security_ptrace_access_check (struct task_struct *child, unsigned int mode)h]j)}(hNint security_ptrace_access_check(struct task_struct *child, unsigned int mode)h](j )}(hinth]hint}(hjzLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjvLhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5ubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvLhhhjLhM5ubj{)}(hsecurity_ptrace_access_checkh]j)}(hsecurity_ptrace_access_checkh]hsecurity_ptrace_access_check}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjvLhhhjLhM5ubj)}(h.(struct task_struct *child, unsigned int mode)h](j)}(hstruct task_struct *childh](j)}(hjAh]hstruct}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubh)}(hhh]j)}(h task_structh]h task_struct}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjLmodnameN classnameNj] j` )}jc ]jf )}jY jLsbc.security_ptrace_access_checkasbuh1hhjLubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hjh]h*}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hchildh]hchild}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjLubj)}(hunsigned int modeh](j )}(hunsignedh]hunsigned}(hj)MhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj%Mubj2)}(h h]h }(hj7MhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%Mubj )}(hinth]hint}(hjEMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj%Mubj2)}(h h]h }(hjSMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%Mubj)}(hmodeh]hmode}(hjaMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%Mubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjLubeh}(h]h ]h"]h$]h&]jjuh1jhjvLhhhjLhM5ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjrLhhhjLhM5ubah}(h]jmLah ](jjeh"]h$]h&]jj)jhuh1jhjLhM5hjoLhhubj)}(hhh]h)}(hCheck if tracing is allowedh]hCheck if tracing is allowed}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5hjMhhubah}(h]h ]h"]h$]h&]uh1jhjoLhhhjLhM5ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjMjjMjjjuh1jhhhj%hNhNubj)}(hX-**Parameters** ``struct task_struct *child`` target process ``unsigned int mode`` PTRACE_MODE flags **Description** Check permission before allowing the current process to trace the **child** process. Security modules may also want to perform a process tracing check during an execve in the set_security or apply_creds hooks of tracing check during an execve in the bprm_set_creds hook of binprm_security_ops if the process is being traced and its security attributes would be changed by the execve. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjMh]h Parameters}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM9hjMubj )}(hhh](j)}(h-``struct task_struct *child`` target process h](j)}(h``struct task_struct *child``h]j)}(hjMh]hstruct task_struct *child}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM6hjMubj2)}(hhh]h)}(htarget processh]htarget process}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhM6hjMubah}(h]h ]h"]h$]h&]uh1j1hjMubeh}(h]h ]h"]h$]h&]uh1jhjMhM6hjMubj)}(h(``unsigned int mode`` PTRACE_MODE flags h](j)}(h``unsigned int mode``h]j)}(hjNh]hunsigned int mode}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM7hjMubj2)}(hhh]h)}(hPTRACE_MODE flagsh]hPTRACE_MODE flags}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhM7hjNubah}(h]h ]h"]h$]h&]uh1j1hjMubeh}(h]h ]h"]h$]h&]uh1jhjNhM7hjMubeh}(h]h ]h"]h$]h&]uh1j hjMubh)}(h**Description**h]j)}(hj@Nh]h Description}(hjBNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>Nubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM9hjMubh)}(hXCheck permission before allowing the current process to trace the **child** process. Security modules may also want to perform a process tracing check during an execve in the set_security or apply_creds hooks of tracing check during an execve in the bprm_set_creds hook of binprm_security_ops if the process is being traced and its security attributes would be changed by the execve.h](hBCheck permission before allowing the current process to trace the }(hjVNhhhNhNubj)}(h **child**h]hchild}(hj^NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVNubhX5 process. Security modules may also want to perform a process tracing check during an execve in the set_security or apply_creds hooks of tracing check during an execve in the bprm_set_creds hook of binprm_security_ops if the process is being traced and its security attributes would be changed by the execve.}(hjVNhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM8hjMubh)}(h **Return**h]j)}(hjyNh]hReturn}(hj{NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM?hjMubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM@hjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_ptrace_traceme (C function)c.security_ptrace_tracemehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h8int security_ptrace_traceme (struct task_struct *parent)h]j)}(h7int security_ptrace_traceme(struct task_struct *parent)h](j )}(hinth]hint}(hjNhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjNhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMHubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNhhhjNhMHubj{)}(hsecurity_ptrace_tracemeh]j)}(hsecurity_ptrace_tracemeh]hsecurity_ptrace_traceme}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjNhhhjNhMHubj)}(h(struct task_struct *parent)h]j)}(hstruct task_struct *parenth](j)}(hjAh]hstruct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj2)}(h h]h }(hjOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubh)}(hhh]j)}(h task_structh]h task_struct}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjOmodnameN classnameNj] j` )}jc ]jf )}jY jNsbc.security_ptrace_tracemeasbuh1hhjNubj2)}(h h]h }(hj9OhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj)}(hjh]h*}(hjGOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj)}(hparenth]hparent}(hjTOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjNubah}(h]h ]h"]h$]h&]jjuh1jhjNhhhjNhMHubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjNhhhjNhMHubah}(h]jNah ](jjeh"]h$]h&]jj)jhuh1jhjNhMHhjNhhubj)}(hhh]h)}(hCheck if tracing is allowedh]hCheck if tracing is allowed}(hj~OhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMHhj{Ohhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjNhMHubeh}(h]h ](jfunctioneh"]h$]h&]jjjjOjjOjjjuh1jhhhj%hNhNubj)}(hX9**Parameters** ``struct task_struct *parent`` tracing process **Description** Check that the **parent** process has sufficient permission to trace the current process before allowing the current process to present itself to the **parent** process for tracing. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjOh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMLhjOubj )}(hhh]j)}(h/``struct task_struct *parent`` tracing process h](j)}(h``struct task_struct *parent``h]j)}(hjOh]hstruct task_struct *parent}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMIhjOubj2)}(hhh]h)}(htracing processh]htracing process}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMIhjOubah}(h]h ]h"]h$]h&]uh1j1hjOubeh}(h]h ]h"]h$]h&]uh1jhjOhMIhjOubah}(h]h ]h"]h$]h&]uh1j hjOubh)}(h**Description**h]j)}(hjOh]h Description}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMKhjOubh)}(hCheck that the **parent** process has sufficient permission to trace the current process before allowing the current process to present itself to the **parent** process for tracing.h](hCheck that the }(hjPhhhNhNubj)}(h **parent**h]hparent}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh} process has sufficient permission to trace the current process before allowing the current process to present itself to the }(hjPhhhNhNubj)}(h **parent**h]hparent}(hj*PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh process for tracing.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMJhjOubh)}(h **Return**h]j)}(hjEPh]hReturn}(hjGPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCPubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMNhjOubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj[PhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMOhjOubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_capget (C function)c.security_capgethNtauh1hhj%hhhNhNubj)}(hhh](j)}(hint security_capget (const struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted)h]j)}(hint security_capget(const struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted)h](j )}(hinth]hint}(hjPhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjPhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMWubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPhhhjPhMWubj{)}(hsecurity_capgeth]j)}(hsecurity_capgeth]hsecurity_capget}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjPhhhjPhMWubj)}(ho(const struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted)h](j)}(h const struct task_struct *targeth](j)}(hjh]hconst}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubj)}(hjAh]hstruct}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubh)}(hhh]j)}(h task_structh]h task_struct}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjQmodnameN classnameNj] j` )}jc ]jf )}jY jPsbc.security_capgetasbuh1hhjPubj2)}(h h]h }(hj QhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubj)}(hjh]h*}(hj.QhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(htargeth]htarget}(hj;QhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(hkernel_cap_t *effectiveh](h)}(hhh]j)}(h kernel_cap_th]h kernel_cap_t}(hjWQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTQubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjYQmodnameN classnameNj] j` )}jc ]jQc.security_capgetasbuh1hhjPQubj2)}(h h]h }(hjuQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPQubj)}(hjh]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPQubj)}(h effectiveh]h effective}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(hkernel_cap_t *inheritableh](h)}(hhh]j)}(h kernel_cap_th]h kernel_cap_t}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjQmodnameN classnameNj] j` )}jc ]jQc.security_capgetasbuh1hhjQubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hjh]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(h inheritableh]h inheritable}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(hkernel_cap_t *permittedh](h)}(hhh]j)}(h kernel_cap_th]h kernel_cap_t}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjRmodnameN classnameNj] j` )}jc ]jQc.security_capgetasbuh1hhjQubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hjh]h*}(hj-RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(h permittedh]h permitted}(hj:RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubeh}(h]h ]h"]h$]h&]jjuh1jhjPhhhjPhMWubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjPhhhjPhMWubah}(h]j}Pah ](jjeh"]h$]h&]jj)jhuh1jhjPhMWhjPhhubj)}(hhh]h)}(h%Get the capability sets for a processh]h%Get the capability sets for a process}(hjdRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMWhjaRhhubah}(h]h ]h"]h$]h&]uh1jhjPhhhjPhMWubeh}(h]h ](jfunctioneh"]h$]h&]jjjj|Rjj|Rjjjuh1jhhhj%hNhNubj)}(hXG**Parameters** ``const struct task_struct *target`` target process ``kernel_cap_t *effective`` effective capability set ``kernel_cap_t *inheritable`` inheritable capability set ``kernel_cap_t *permitted`` permitted capability set **Description** Get the **effective**, **inheritable**, and **permitted** capability sets for the **target** process. The hook may also perform permission checking to determine if the current process is allowed to see the capability sets of the **target** process. **Return** Returns 0 if the capability sets were successfully obtained.h](h)}(h**Parameters**h]j)}(hjRh]h Parameters}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM[hjRubj )}(hhh](j)}(h4``const struct task_struct *target`` target process h](j)}(h$``const struct task_struct *target``h]j)}(hjRh]h const struct task_struct *target}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMXhjRubj2)}(hhh]h)}(htarget processh]htarget process}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMXhjRubah}(h]h ]h"]h$]h&]uh1j1hjRubeh}(h]h ]h"]h$]h&]uh1jhjRhMXhjRubj)}(h5``kernel_cap_t *effective`` effective capability set h](j)}(h``kernel_cap_t *effective``h]j)}(hjRh]hkernel_cap_t *effective}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMYhjRubj2)}(hhh]h)}(heffective capability seth]heffective capability set}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMYhjRubah}(h]h ]h"]h$]h&]uh1j1hjRubeh}(h]h ]h"]h$]h&]uh1jhjRhMYhjRubj)}(h9``kernel_cap_t *inheritable`` inheritable capability set h](j)}(h``kernel_cap_t *inheritable``h]j)}(hjSh]hkernel_cap_t *inheritable}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMZhjSubj2)}(hhh]h)}(hinheritable capability seth]hinheritable capability set}(hj0ShhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,ShMZhj-Subah}(h]h ]h"]h$]h&]uh1j1hjSubeh}(h]h ]h"]h$]h&]uh1jhj,ShMZhjRubj)}(h5``kernel_cap_t *permitted`` permitted capability set h](j)}(h``kernel_cap_t *permitted``h]j)}(hjPSh]hkernel_cap_t *permitted}(hjRShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNSubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM[hjJSubj2)}(hhh]h)}(hpermitted capability seth]hpermitted capability set}(hjiShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjeShM[hjfSubah}(h]h ]h"]h$]h&]uh1j1hjJSubeh}(h]h ]h"]h$]h&]uh1jhjeShM[hjRubeh}(h]h ]h"]h$]h&]uh1j hjRubh)}(h**Description**h]j)}(hjSh]h Description}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM]hjRubh)}(hGet the **effective**, **inheritable**, and **permitted** capability sets for the **target** process. The hook may also perform permission checking to determine if the current process is allowed to see the capability sets of the **target** process.h](hGet the }(hjShhhNhNubj)}(h **effective**h]h effective}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubh, }(hjShhhNhNubj)}(h**inheritable**h]h inheritable}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubh, and }(hjShhhNhNubj)}(h **permitted**h]h permitted}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubh capability sets for the }(hjShhhNhNubj)}(h **target**h]htarget}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubh process. The hook may also perform permission checking to determine if the current process is allowed to see the capability sets of the }(hjShhhNhNubj)}(h **target**h]htarget}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubh process.}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\hjRubh)}(h **Return**h]j)}(hj Th]hReturn}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Tubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMahjRubh)}(hah"]h$]h&]uh1j1hjMThhhj_ThMmubj{)}(hsecurity_capseth]j)}(hsecurity_capseth]hsecurity_capset}(hjrThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnTubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjMThhhj_ThMmubj)}(h(struct cred *new, const struct cred *old, const kernel_cap_t *effective, const kernel_cap_t *inheritable, const kernel_cap_t *permitted)h](j)}(hstruct cred *newh](j)}(hjAh]hstruct}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubh)}(hhh]j)}(hcredh]hcred}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjTmodnameN classnameNj] j` )}jc ]jf )}jY jtTsbc.security_capsetasbuh1hhjTubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hjh]h*}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hnewh]hnew}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubj)}(hconst struct cred *oldh](j)}(hjh]hconst}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj2)}(h h]h }(hj UhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hjAh]hstruct}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj2)}(h h]h }(hj(UhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubh)}(hhh]j)}(hcredh]hcred}(hj9UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6Uubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj;UmodnameN classnameNj] j` )}jc ]jTc.security_capsetasbuh1hhjTubj2)}(h h]h }(hjWUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hjh]h*}(hjeUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(holdh]hold}(hjrUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubj)}(hconst kernel_cap_t *effectiveh](j)}(hjh]hconst}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubh)}(hhh]j)}(h kernel_cap_th]h kernel_cap_t}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjUmodnameN classnameNj] j` )}jc ]jTc.security_capsetasbuh1hhjUubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj)}(hjh]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(h effectiveh]h effective}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubj)}(hconst kernel_cap_t *inheritableh](j)}(hjh]hconst}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubh)}(hhh]j)}(h kernel_cap_th]h kernel_cap_t}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjVmodnameN classnameNj] j` )}jc ]jTc.security_capsetasbuh1hhjUubj2)}(h h]h }(hj7VhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj)}(hjh]h*}(hjEVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(h inheritableh]h inheritable}(hjRVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubj)}(hconst kernel_cap_t *permittedh](j)}(hjh]hconst}(hjkVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgVubj2)}(h h]h }(hjxVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgVubh)}(hhh]j)}(h kernel_cap_th]h kernel_cap_t}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjVmodnameN classnameNj] j` )}jc ]jTc.security_capsetasbuh1hhjgVubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgVubj)}(hjh]h*}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgVubj)}(h permittedh]h permitted}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgVubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubeh}(h]h ]h"]h$]h&]jjuh1jhjMThhhj_ThMmubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjIThhhj_ThMmubah}(h]jDTah ](jjeh"]h$]h&]jj)jhuh1jhj_ThMmhjFThhubj)}(hhh]h)}(h%Set the capability sets for a processh]h%Set the capability sets for a process}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMmhjVhhubah}(h]h ]h"]h$]h&]uh1jhjFThhhj_ThMmubeh}(h]h ](jfunctioneh"]h$]h&]jjjjWjjWjjjuh1jhhhj%hNhNubj)}(hX **Parameters** ``struct cred *new`` new credentials for the target process ``const struct cred *old`` current credentials of the target process ``const kernel_cap_t *effective`` effective capability set ``const kernel_cap_t *inheritable`` inheritable capability set ``const kernel_cap_t *permitted`` permitted capability set **Description** Set the **effective**, **inheritable**, and **permitted** capability sets for the current process. **Return** Returns 0 and update **new** if permission is granted.h](h)}(h**Parameters**h]j)}(hjWh]h Parameters}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Wubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMqhjWubj )}(hhh](j)}(h<``struct cred *new`` new credentials for the target process h](j)}(h``struct cred *new``h]j)}(hj-Wh]hstruct cred *new}(hj/WhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+Wubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMnhj'Wubj2)}(hhh]h)}(h&new credentials for the target processh]h&new credentials for the target process}(hjFWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBWhMnhjCWubah}(h]h ]h"]h$]h&]uh1j1hj'Wubeh}(h]h ]h"]h$]h&]uh1jhjBWhMnhj$Wubj)}(hE``const struct cred *old`` current credentials of the target process h](j)}(h``const struct cred *old``h]j)}(hjfWh]hconst struct cred *old}(hjhWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdWubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMohj`Wubj2)}(hhh]h)}(h)current credentials of the target processh]h)current credentials of the target process}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{WhMohj|Wubah}(h]h ]h"]h$]h&]uh1j1hj`Wubeh}(h]h ]h"]h$]h&]uh1jhj{WhMohj$Wubj)}(h;``const kernel_cap_t *effective`` effective capability set h](j)}(h!``const kernel_cap_t *effective``h]j)}(hjWh]hconst kernel_cap_t *effective}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMphjWubj2)}(hhh]h)}(heffective capability seth]heffective capability set}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMphjWubah}(h]h ]h"]h$]h&]uh1j1hjWubeh}(h]h ]h"]h$]h&]uh1jhjWhMphj$Wubj)}(h?``const kernel_cap_t *inheritable`` inheritable capability set h](j)}(h#``const kernel_cap_t *inheritable``h]j)}(hjWh]hconst kernel_cap_t *inheritable}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMqhjWubj2)}(hhh]h)}(hinheritable capability seth]hinheritable capability set}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMqhjWubah}(h]h ]h"]h$]h&]uh1j1hjWubeh}(h]h ]h"]h$]h&]uh1jhjWhMqhj$Wubj)}(h;``const kernel_cap_t *permitted`` permitted capability set h](j)}(h!``const kernel_cap_t *permitted``h]j)}(hjXh]hconst kernel_cap_t *permitted}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMrhj Xubj2)}(hhh]h)}(hpermitted capability seth]hpermitted capability set}(hj*XhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&XhMrhj'Xubah}(h]h ]h"]h$]h&]uh1j1hj Xubeh}(h]h ]h"]h$]h&]uh1jhj&XhMrhj$Wubeh}(h]h ]h"]h$]h&]uh1j hjWubh)}(h**Description**h]j)}(hjLXh]h Description}(hjNXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJXubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMthjWubh)}(hbSet the **effective**, **inheritable**, and **permitted** capability sets for the current process.h](hSet the }(hjbXhhhNhNubj)}(h **effective**h]h effective}(hjjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbXubh, }(hjbXhhhNhNubj)}(h**inheritable**h]h inheritable}(hj|XhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbXubh, and }(hjbXhhhNhNubj)}(h **permitted**h]h permitted}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbXubh) capability sets for the current process.}(hjbXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMshjWubh)}(h **Return**h]j)}(hjXh]hReturn}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMvhjWubh)}(h6Returns 0 and update **new** if permission is granted.h](hReturns 0 and update }(hjXhhhNhNubj)}(h**new**h]hnew}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh if permission is granted.}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMwhjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_capable (C function)c.security_capablehNtauh1hhj%hhhNhNubj)}(hhh](j)}(heint security_capable (const struct cred *cred, struct user_namespace *ns, int cap, unsigned int opts)h]j)}(hdint security_capable(const struct cred *cred, struct user_namespace *ns, int cap, unsigned int opts)h](j )}(hinth]hint}(hjYhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjXhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXhhhjYhMubj{)}(hsecurity_capableh]j)}(hsecurity_capableh]hsecurity_capable}(hj!YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjXhhhjYhMubj)}(hP(const struct cred *cred, struct user_namespace *ns, int cap, unsigned int opts)h](j)}(hconst struct cred *credh](j)}(hjh]hconst}(hj=YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9Yubj2)}(h h]h }(hjJYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9Yubj)}(hjAh]hstruct}(hjXYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9Yubj2)}(h h]h }(hjeYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9Yubh)}(hhh]j)}(hcredh]hcred}(hjvYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsYubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjxYmodnameN classnameNj] j` )}jc ]jf )}jY j#Ysbc.security_capableasbuh1hhj9Yubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9Yubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9Yubj)}(hcredh]hcred}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9Yubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5Yubj)}(hstruct user_namespace *nsh](j)}(hjAh]hstruct}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubh)}(hhh]j)}(huser_namespaceh]huser_namespace}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjYmodnameN classnameNj] j` )}jc ]jYc.security_capableasbuh1hhjYubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj)}(hjh]h*}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hnsh]hns}(hj!ZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5Yubj)}(hint caph](j )}(hinth]hint}(hj:ZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj6Zubj2)}(h h]h }(hjHZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6Zubj)}(hcaph]hcap}(hjVZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6Zubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5Yubj)}(hunsigned int optsh](j )}(hunsignedh]hunsigned}(hjoZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjkZubj2)}(h h]h }(hj}ZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkZubj )}(hinth]hint}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjkZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkZubj)}(hoptsh]hopts}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5Yubeh}(h]h ]h"]h$]h&]jjuh1jhjXhhhjYhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjXhhhjYhMubah}(h]jXah ](jjeh"]h$]h&]jj)jhuh1jhjYhMhjXhhubj)}(hhh]h)}(h/Check if a process has the necessary capabilityh]h/Check if a process has the necessary capability}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjZhhubah}(h]h ]h"]h$]h&]uh1jhjXhhhjYhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjZjjZjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``const struct cred *cred`` credentials to examine ``struct user_namespace *ns`` user namespace ``int cap`` capability requested ``unsigned int opts`` capability check options **Description** Check whether the **tsk** process has the **cap** capability in the indicated credentials. **cap** contains the capability . **opts** contains options for the capable check . **Return** Returns 0 if the capability is granted.h](h)}(h**Parameters**h]j)}(hjZh]h Parameters}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjZubj )}(hhh](j)}(h3``const struct cred *cred`` credentials to examine h](j)}(h``const struct cred *cred``h]j)}(hj[h]hconst struct cred *cred}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj [ubj2)}(hhh]h)}(hcredentials to examineh]hcredentials to examine}(hj+[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'[hMhj([ubah}(h]h ]h"]h$]h&]uh1j1hj [ubeh}(h]h ]h"]h$]h&]uh1jhj'[hMhj [ubj)}(h-``struct user_namespace *ns`` user namespace h](j)}(h``struct user_namespace *ns``h]j)}(hjK[h]hstruct user_namespace *ns}(hjM[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjI[ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjE[ubj2)}(hhh]h)}(huser namespaceh]huser namespace}(hjd[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`[hMhja[ubah}(h]h ]h"]h$]h&]uh1j1hjE[ubeh}(h]h ]h"]h$]h&]uh1jhj`[hMhj [ubj)}(h!``int cap`` capability requested h](j)}(h ``int cap``h]j)}(hj[h]hint cap}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj~[ubj2)}(hhh]h)}(hcapability requestedh]hcapability requested}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hMhj[ubah}(h]h ]h"]h$]h&]uh1j1hj~[ubeh}(h]h ]h"]h$]h&]uh1jhj[hMhj [ubj)}(h/``unsigned int opts`` capability check options h](j)}(h``unsigned int opts``h]j)}(hj[h]hunsigned int opts}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj[ubj2)}(hhh]h)}(hcapability check optionsh]hcapability check options}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hMhj[ubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhj[hMhj [ubeh}(h]h ]h"]h$]h&]uh1j hjZubh)}(h**Description**h]j)}(hj[h]h Description}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjZubh)}(hCheck whether the **tsk** process has the **cap** capability in the indicated credentials. **cap** contains the capability . **opts** contains options for the capable check .h](hCheck whether the }(hj\hhhNhNubj)}(h**tsk**h]htsk}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh process has the }(hj\hhhNhNubj)}(h**cap**h]hcap}(hj(\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh+ capability in the indicated credentials. }(hj\hhhNhNubj)}(h**cap**h]hcap}(hj:\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh7 contains the capability . }(hj\hhhNhNubj)}(h**opts**h]hopts}(hjL\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubhC contains options for the capable check .}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjZubh)}(h **Return**h]j)}(hjg\h]hReturn}(hji\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje\ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjZubh)}(h'Returns 0 if the capability is granted.h]h'Returns 0 if the capability is granted.}(hj}\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_quotactl (C function)c.security_quotactlhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hPint security_quotactl (int cmds, int type, int id, const struct super_block *sb)h]j)}(hOint security_quotactl(int cmds, int type, int id, const struct super_block *sb)h](j )}(hinth]hint}(hj\hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\hhhj\hMubj{)}(hsecurity_quotactlh]j)}(hsecurity_quotactlh]hsecurity_quotactl}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj\hhhj\hMubj)}(h:(int cmds, int type, int id, const struct super_block *sb)h](j)}(hint cmdsh](j )}(hinth]hint}(hj\hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj)}(hcmdsh]hcmds}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubj)}(hint typeh](j )}(hinth]hint}(hj]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hj,]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(htypeh]htype}(hj:]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubj)}(hint idh](j )}(hinth]hint}(hjS]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjO]ubj2)}(h h]h }(hja]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjO]ubj)}(hidh]hid}(hjo]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjO]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubj)}(hconst struct super_block *sbh](j)}(hjh]hconst}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hjAh]hstruct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubh)}(hhh]j)}(h super_blockh]h super_block}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj]modnameN classnameNj] j` )}jc ]jf )}jY j\sbc.security_quotactlasbuh1hhj]ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hjh]h*}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hsbh]hsb}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubeh}(h]h ]h"]h$]h&]jjuh1jhj\hhhj\hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj\hhhj\hMubah}(h]j\ah ](jjeh"]h$]h&]jj)jhuh1jhj\hMhj\hhubj)}(hhh]h)}(h4Check if a quotactl() syscall is allowed for this fsh]h4Check if a quotactl() syscall is allowed for this fs}(hj&^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj#^hhubah}(h]h ]h"]h$]h&]uh1jhj\hhhj\hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj>^jj>^jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``int cmds`` commands ``int type`` type ``int id`` id ``const struct super_block *sb`` filesystem **Description** Check whether the quotactl syscall is allowed for this **sb**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjH^h]h Parameters}(hjJ^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF^ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjB^ubj )}(hhh](j)}(h``int cmds`` commands h](j)}(h ``int cmds``h]j)}(hjg^h]hint cmds}(hji^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje^ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhja^ubj2)}(hhh]h)}(hcommandsh]hcommands}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|^hMhj}^ubah}(h]h ]h"]h$]h&]uh1j1hja^ubeh}(h]h ]h"]h$]h&]uh1jhj|^hMhj^^ubj)}(h``int type`` type h](j)}(h ``int type``h]j)}(hj^h]hint type}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj^ubj2)}(hhh]h)}(htypeh]htype}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hMhj^ubah}(h]h ]h"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]uh1jhj^hMhj^^ubj)}(h``int id`` id h](j)}(h ``int id``h]j)}(hj^h]hint id}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj^ubj2)}(hhh]h)}(hidh]hid}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hMhj^ubah}(h]h ]h"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]uh1jhj^hMhj^^ubj)}(h,``const struct super_block *sb`` filesystem h](j)}(h ``const struct super_block *sb``h]j)}(hj_h]hconst struct super_block *sb}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj _ubj2)}(hhh]h)}(h filesystemh]h filesystem}(hj+_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'_hMhj(_ubah}(h]h ]h"]h$]h&]uh1j1hj _ubeh}(h]h ]h"]h$]h&]uh1jhj'_hMhj^^ubeh}(h]h ]h"]h$]h&]uh1j hjB^ubh)}(h**Description**h]j)}(hjM_h]h Description}(hjO_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK_ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjB^ubh)}(h>Check whether the quotactl syscall is allowed for this **sb**.h](h7Check whether the quotactl syscall is allowed for this }(hjc_hhhNhNubj)}(h**sb**h]hsb}(hjk_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc_ubh.}(hjc_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjB^ubh)}(h **Return**h]j)}(hj_h]hReturn}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjB^ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjB^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_quota_on (C function)c.security_quota_onhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h-int security_quota_on (struct dentry *dentry)h]j)}(h,int security_quota_on(struct dentry *dentry)h](j )}(hinth]hint}(hj_hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj_hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_hhhj_hMubj{)}(hsecurity_quota_onh]j)}(hsecurity_quota_onh]hsecurity_quota_on}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj_hhhj_hMubj)}(h(struct dentry *dentry)h]j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubh)}(hhh]j)}(hdentryh]hdentry}(hj&`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#`ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj(`modnameN classnameNj] j` )}jc ]jf )}jY j_sbc.security_quota_onasbuh1hhj`ubj2)}(h h]h }(hjF`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubj)}(hjh]h*}(hjT`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hdentryh]hdentry}(hja`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj`ubah}(h]h ]h"]h$]h&]jjuh1jhj_hhhj_hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj_hhhj_hMubah}(h]j_ah ](jjeh"]h$]h&]jj)jhuh1jhj_hMhj_hhubj)}(hhh]h)}(h(Check if QUOTAON is allowed for a dentryh]h(Check if QUOTAON is allowed for a dentry}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj`hhubah}(h]h ]h"]h$]h&]uh1jhj_hhhj_hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj`jj`jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct dentry *dentry`` dentry **Description** Check whether QUOTAON is allowed for **dentry**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj`h]h Parameters}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj`ubj )}(hhh]j)}(h!``struct dentry *dentry`` dentry h](j)}(h``struct dentry *dentry``h]j)}(hj`h]hstruct dentry *dentry}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj`ubj2)}(hhh]h)}(hdentryh]hdentry}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hMhj`ubah}(h]h ]h"]h$]h&]uh1j1hj`ubeh}(h]h ]h"]h$]h&]uh1jhj`hMhj`ubah}(h]h ]h"]h$]h&]uh1j hj`ubh)}(h**Description**h]j)}(hjah]h Description}(hj ahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj`ubh)}(h0Check whether QUOTAON is allowed for **dentry**.h](h%Check whether QUOTAON is allowed for }(hjahhhNhNubj)}(h **dentry**h]hdentry}(hj%ahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh.}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj`ubh)}(h **Return**h]j)}(hj@ah]hReturn}(hjBahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>aubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj`ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjVahhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_syslog (C function)c.security_sysloghNtauh1hhj%hhhNhNubj)}(hhh](j)}(hint security_syslog (int type)h]j)}(hint security_syslog(int type)h](j )}(hinth]hint}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjahhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjahhhjahMubj{)}(hsecurity_syslogh]j)}(hsecurity_syslogh]hsecurity_syslog}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjahhhjahMubj)}(h (int type)h]j)}(hint typeh](j )}(hinth]hint}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(htypeh]htype}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjaubah}(h]h ]h"]h$]h&]jjuh1jhjahhhjahMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj}ahhhjahMubah}(h]jxaah ](jjeh"]h$]h&]jj)jhuh1jhjahMhjzahhubj)}(hhh]h)}(h5Check if accessing the kernel message ring is allowedh]h5Check if accessing the kernel message ring is allowed}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjbhhubah}(h]h ]h"]h$]h&]uh1jhjzahhhjahMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj bjj bjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``int type`` SYSLOG_ACTION_* type **Description** Check permission before accessing the kernel message ring or changing logging to the console. See the syslog(2) manual page for an explanation of the **type** values. **Return** Return 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj*bh]h Parameters}(hj,bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(bubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj$bubj )}(hhh]j)}(h"``int type`` SYSLOG_ACTION_* type h](j)}(h ``int type``h]j)}(hjIbh]hint type}(hjKbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGbubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjCbubj2)}(hhh]h)}(hSYSLOG_ACTION_* typeh]hSYSLOG_ACTION_* type}(hjbbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^bhMhj_bubah}(h]h ]h"]h$]h&]uh1j1hjCbubeh}(h]h ]h"]h$]h&]uh1jhj^bhMhj@bubah}(h]h ]h"]h$]h&]uh1j hj$bubh)}(h**Description**h]j)}(hjbh]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj$bubh)}(hCheck permission before accessing the kernel message ring or changing logging to the console. See the syslog(2) manual page for an explanation of the **type** values.h](hCheck permission before accessing the kernel message ring or changing logging to the console. See the syslog(2) manual page for an explanation of the }(hjbhhhNhNubj)}(h**type**h]htype}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh values.}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj$bubh)}(h **Return**h]j)}(hjbh]hReturn}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj$bubh)}(h"Return 0 if permission is granted.h]h"Return 0 if permission is granted.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj$bubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_settime64 (C function)c.security_settime64hNtauh1hhj%hhhNhNubj)}(hhh](j)}(hOint security_settime64 (const struct timespec64 *ts, const struct timezone *tz)h]j)}(hNint security_settime64(const struct timespec64 *ts, const struct timezone *tz)h](j )}(hinth]hint}(hjchhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjbhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbhhhjchMubj{)}(hsecurity_settime64h]j)}(hsecurity_settime64h]hsecurity_settime64}(hj#chhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjbhhhjchMubj)}(h8(const struct timespec64 *ts, const struct timezone *tz)h](j)}(hconst struct timespec64 *tsh](j)}(hjh]hconst}(hj?chhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;cubj2)}(h h]h }(hjLchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;cubj)}(hjAh]hstruct}(hjZchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;cubj2)}(h h]h }(hjgchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;cubh)}(hhh]j)}(h timespec64h]h timespec64}(hjxchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjucubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjzcmodnameN classnameNj] j` )}jc ]jf )}jY j%csbc.security_settime64asbuh1hhj;cubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;cubj)}(hjh]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;cubj)}(htsh]hts}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;cubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj7cubj)}(hconst struct timezone *tzh](j)}(hjh]hconst}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hjAh]hstruct}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubh)}(hhh]j)}(htimezoneh]htimezone}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjdmodnameN classnameNj] j` )}jc ]jcc.security_settime64asbuh1hhjcubj2)}(h h]h }(hj#dhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hjh]h*}(hj1dhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(htzh]htz}(hj>dhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj7cubeh}(h]h ]h"]h$]h&]jjuh1jhjbhhhjchMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjbhhhjchMubah}(h]jbah ](jjeh"]h$]h&]jj)jhuh1jhjchMhjbhhubj)}(hhh]h)}(h,Check if changing the system time is allowedh]h,Check if changing the system time is allowed}(hjhdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjedhhubah}(h]h ]h"]h$]h&]uh1jhjbhhhjchMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjdjjdjjjuh1jhhhj%hNhNubj)}(hX?**Parameters** ``const struct timespec64 *ts`` new time ``const struct timezone *tz`` timezone **Description** Check permission to change the system time, struct timespec64 is defined in and timezone is defined in . **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjdh]h Parameters}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubj )}(hhh](j)}(h)``const struct timespec64 *ts`` new time h](j)}(h``const struct timespec64 *ts``h]j)}(hjdh]hconst struct timespec64 *ts}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubj2)}(hhh]h)}(hnew timeh]hnew time}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhMhjdubah}(h]h ]h"]h$]h&]uh1j1hjdubeh}(h]h ]h"]h$]h&]uh1jhjdhMhjdubj)}(h'``const struct timezone *tz`` timezone h](j)}(h``const struct timezone *tz``h]j)}(hjdh]hconst struct timezone *tz}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubj2)}(hhh]h)}(htimezoneh]htimezone}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhMhjdubah}(h]h ]h"]h$]h&]uh1j1hjdubeh}(h]h ]h"]h$]h&]uh1jhjdhMhjdubeh}(h]h ]h"]h$]h&]uh1j hjdubh)}(h**Description**h]j)}(hjeh]h Description}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubh)}(hCheck permission to change the system time, struct timespec64 is defined in and timezone is defined in .h]hCheck permission to change the system time, struct timespec64 is defined in and timezone is defined in .}(hj3ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubh)}(h **Return**h]j)}(hjDeh]hReturn}(hjFehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBeubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjZehhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )security_vm_enough_memory_mm (C function)c.security_vm_enough_memory_mmhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hCint security_vm_enough_memory_mm (struct mm_struct *mm, long pages)h]j)}(hBint security_vm_enough_memory_mm(struct mm_struct *mm, long pages)h](j )}(hinth]hint}(hjehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjehhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjehhhjehMubj{)}(hsecurity_vm_enough_memory_mmh]j)}(hsecurity_vm_enough_memory_mmh]hsecurity_vm_enough_memory_mm}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjehhhjehMubj)}(h"(struct mm_struct *mm, long pages)h](j)}(hstruct mm_struct *mmh](j)}(hjAh]hstruct}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjeubh)}(hhh]j)}(h mm_structh]h mm_struct}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjemodnameN classnameNj] j` )}jc ]jf )}jY jesbc.security_vm_enough_memory_mmasbuh1hhjeubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjeubj)}(hjh]h*}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(hmmh]hmm}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjeubj)}(h long pagesh](j )}(hlongh]hlong}(hj8fhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj4fubj2)}(h h]h }(hjFfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4fubj)}(hpagesh]hpages}(hjTfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4fubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjeubeh}(h]h ]h"]h$]h&]jjuh1jhjehhhjehMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjehhhjehMubah}(h]j|eah ](jjeh"]h$]h&]jj)jhuh1jhjehMhj~ehhubj)}(hhh]h)}(h,Check if allocating a new mem map is allowedh]h,Check if allocating a new mem map is allowed}(hj~fhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{fhhubah}(h]h ]h"]h$]h&]uh1jhj~ehhhjehMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjfjjfjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct mm_struct *mm`` mm struct ``long pages`` number of pages **Description** Check permissions for allocating a new virtual mapping. If all LSMs return a positive value, __vm_enough_memory() will be called with cap_sys_admin set. If at least one LSM returns 0 or negative, __vm_enough_memory() will be called with cap_sys_admin cleared. **Return** Returns 0 if permission is granted by the LSM infrastructure to the caller.h](h)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubj )}(hhh](j)}(h#``struct mm_struct *mm`` mm struct h](j)}(h``struct mm_struct *mm``h]j)}(hjfh]hstruct mm_struct *mm}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubj2)}(hhh]h)}(h mm structh]h mm struct}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhMhjfubah}(h]h ]h"]h$]h&]uh1j1hjfubeh}(h]h ]h"]h$]h&]uh1jhjfhMhjfubj)}(h``long pages`` number of pages h](j)}(h``long pages``h]j)}(hjfh]h long pages}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubj2)}(hhh]h)}(hnumber of pagesh]hnumber of pages}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ghMhjgubah}(h]h ]h"]h$]h&]uh1j1hjfubeh}(h]h ]h"]h$]h&]uh1jhj ghMhjfubeh}(h]h ]h"]h$]h&]uh1j hjfubh)}(h**Description**h]j)}(hj3gh]h Description}(hj5ghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1gubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubh)}(hXCheck permissions for allocating a new virtual mapping. If all LSMs return a positive value, __vm_enough_memory() will be called with cap_sys_admin set. If at least one LSM returns 0 or negative, __vm_enough_memory() will be called with cap_sys_admin cleared.h]hXCheck permissions for allocating a new virtual mapping. If all LSMs return a positive value, __vm_enough_memory() will be called with cap_sys_admin set. If at least one LSM returns 0 or negative, __vm_enough_memory() will be called with cap_sys_admin cleared.}(hjIghhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubh)}(h **Return**h]j)}(hjZgh]hReturn}(hj\ghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXgubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubh)}(hKReturns 0 if permission is granted by the LSM infrastructure to the caller.h]hKReturns 0 if permission is granted by the LSM infrastructure to the caller.}(hjpghhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )security_bprm_creds_for_exec (C function)c.security_bprm_creds_for_exechNtauh1hhj%hhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjghhhjghMubj{)}(hsecurity_bprm_creds_for_exech]j)}(hsecurity_bprm_creds_for_exech]hsecurity_bprm_creds_for_exec}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjghhhjghMubj)}(h(struct linux_binprm *bprm)h]j)}(hstruct linux_binprm *bprmh](j)}(hjAh]hstruct}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgubh)}(hhh]j)}(h linux_binprmh]h linux_binprm}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjgmodnameN classnameNj] j` )}jc ]jf )}jY jgsbc.security_bprm_creds_for_execasbuh1hhjgubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgubj)}(hjh]h*}(hj(hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(hbprmh]hbprm}(hj5hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubah}(h]h ]h"]h$]h&]jjuh1jhjghhhjghMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjghhhjghMubah}(h]jgah ](jjeh"]h$]h&]jj)jhuh1jhjghMhjghhubj)}(hhh]h)}(h"Prepare the credentials for exec()h]h"Prepare the credentials for exec()}(hj_hhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj\hhhubah}(h]h ]h"]h$]h&]uh1jhjghhhjghMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjwhjjwhjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct linux_binprm *bprm`` binary program information **Description** If the setup in prepare_exec_creds did not setup **bprm->cred->security** properly for executing **bprm->file**, update the LSM's portion of **bprm->cred->security** to be what commit_creds needs to install for the new program. This hook may also optionally check permissions (e.g. for transitions between security domains). The hook must set **bprm->secureexec** to 1 if AT_SECURE should be set to request libc enable secure mode. **bprm** contains the linux_binprm structure. If execveat(2) is called with the AT_EXECVE_CHECK flag, bprm->is_check is set. The result must be the same as without this flag even if the execution will never really happen and **bprm** will always be dropped. This hook must not change current->cred, only **bprm->cred**. **Return** Returns 0 if the hook is successful and permission is granted.h](h)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{hubj )}(hhh]j)}(h9``struct linux_binprm *bprm`` binary program information h](j)}(h``struct linux_binprm *bprm``h]j)}(hjhh]hstruct linux_binprm *bprm}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhubj2)}(hhh]h)}(hbinary program informationh]hbinary program information}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMhjhubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhjhhMhjhubah}(h]h ]h"]h$]h&]uh1j hj{hubh)}(h**Description**h]j)}(hjhh]h Description}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{hubh)}(hXIf the setup in prepare_exec_creds did not setup **bprm->cred->security** properly for executing **bprm->file**, update the LSM's portion of **bprm->cred->security** to be what commit_creds needs to install for the new program. This hook may also optionally check permissions (e.g. for transitions between security domains). The hook must set **bprm->secureexec** to 1 if AT_SECURE should be set to request libc enable secure mode. **bprm** contains the linux_binprm structure.h](h1If the setup in prepare_exec_creds did not setup }(hjhhhhNhNubj)}(h**bprm->cred->security**h]hbprm->cred->security}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh properly for executing }(hjhhhhNhNubj)}(h**bprm->file**h]h bprm->file}(hj ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh , update the LSM’s portion of }(hjhhhhNhNubj)}(h**bprm->cred->security**h]hbprm->cred->security}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh to be what commit_creds needs to install for the new program. This hook may also optionally check permissions (e.g. for transitions between security domains). The hook must set }(hjhhhhNhNubj)}(h**bprm->secureexec**h]hbprm->secureexec}(hj/ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubhF to 1 if AT_SECURE should be set to request libc enable secure mode. }(hjhhhhNhNubj)}(h**bprm**h]hbprm}(hjAihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh% contains the linux_binprm structure.}(hjhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{hubh)}(hIf execveat(2) is called with the AT_EXECVE_CHECK flag, bprm->is_check is set. The result must be the same as without this flag even if the execution will never really happen and **bprm** will always be dropped.h](hIf execveat(2) is called with the AT_EXECVE_CHECK flag, bprm->is_check is set. The result must be the same as without this flag even if the execution will never really happen and }(hjZihhhNhNubj)}(h**bprm**h]hbprm}(hjbihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZiubh will always be dropped.}(hjZihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{hubh)}(h=This hook must not change current->cred, only **bprm->cred**.h](h.This hook must not change current->cred, only }(hj{ihhhNhNubj)}(h**bprm->cred**h]h bprm->cred}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{iubh.}(hj{ihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{hubh)}(h **Return**h]j)}(hjih]hReturn}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{hubh)}(h>Returns 0 if the hook is successful and permission is granted.h]h>Returns 0 if the hook is successful and permission is granted.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{hubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *security_bprm_creds_from_file (C function)c.security_bprm_creds_from_filehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hVint security_bprm_creds_from_file (struct linux_binprm *bprm, const struct file *file)h]j)}(hUint security_bprm_creds_from_file(struct linux_binprm *bprm, const struct file *file)h](j )}(hinth]hint}(hjihhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjihhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjihhhjihMubj{)}(hsecurity_bprm_creds_from_fileh]j)}(hsecurity_bprm_creds_from_fileh]hsecurity_bprm_creds_from_file}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjihhhjihMubj)}(h4(struct linux_binprm *bprm, const struct file *file)h](j)}(hstruct linux_binprm *bprmh](j)}(hjAh]hstruct}(hj jhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj2)}(h h]h }(hj-jhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubh)}(hhh]j)}(h linux_binprmh]h linux_binprm}(hj>jhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;jubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj@jmodnameN classnameNj] j` )}jc ]jf )}jY jjsbc.security_bprm_creds_from_fileasbuh1hhjjubj2)}(h h]h }(hj^jhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubj)}(hjh]h*}(hjljhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(hbprmh]hbprm}(hjyjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjjubj)}(hconst struct file *fileh](j)}(hjh]hconst}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubj)}(hjAh]hstruct}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubh)}(hhh]j)}(hfileh]hfile}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjjmodnameN classnameNj] j` )}jc ]jZjc.security_bprm_creds_from_fileasbuh1hhjjubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubj)}(hjh]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(hfileh]hfile}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjjubeh}(h]h ]h"]h$]h&]jjuh1jhjihhhjihMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjihhhjihMubah}(h]jiah ](jjeh"]h$]h&]jj)jhuh1jhjihMhjihhubj)}(hhh]h)}(h'Update linux_binprm creds based on fileh]h'Update linux_binprm creds based on file}(hj.khhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj+khhubah}(h]h ]h"]h$]h&]uh1jhjihhhjihMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjFkjjFkjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct linux_binprm *bprm`` binary program information ``const struct file *file`` associated file **Description** If **file** is setpcap, suid, sgid or otherwise marked to change privilege upon exec, update **bprm->cred** to reflect that change. This is called after finding the binary that will be executed without an interpreter. This ensures that the credentials will not be derived from a script that the binary will need to reopen, which when reopend may end up being a completely different file. This hook may also optionally check permissions (e.g. for transitions between security domains). The hook must set **bprm->secureexec** to 1 if AT_SECURE should be set to request libc enable secure mode. The hook must add to **bprm->per_clear** any personality flags that should be cleared from current->personality. **bprm** contains the linux_binprm structure. **Return** Returns 0 if the hook is successful and permission is granted.h](h)}(h**Parameters**h]j)}(hjPkh]h Parameters}(hjRkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNkubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJkubj )}(hhh](j)}(h9``struct linux_binprm *bprm`` binary program information h](j)}(h``struct linux_binprm *bprm``h]j)}(hjokh]hstruct linux_binprm *bprm}(hjqkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmkubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjikubj2)}(hhh]h)}(hbinary program informationh]hbinary program information}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMhjkubah}(h]h ]h"]h$]h&]uh1j1hjikubeh}(h]h ]h"]h$]h&]uh1jhjkhMhjfkubj)}(h,``const struct file *file`` associated file h](j)}(h``const struct file *file``h]j)}(hjkh]hconst struct file *file}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjkubj2)}(hhh]h)}(hassociated fileh]hassociated file}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMhjkubah}(h]h ]h"]h$]h&]uh1j1hjkubeh}(h]h ]h"]h$]h&]uh1jhjkhMhjfkubeh}(h]h ]h"]h$]h&]uh1j hjJkubh)}(h**Description**h]j)}(hjkh]h Description}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJkubh)}(hXIf **file** is setpcap, suid, sgid or otherwise marked to change privilege upon exec, update **bprm->cred** to reflect that change. This is called after finding the binary that will be executed without an interpreter. This ensures that the credentials will not be derived from a script that the binary will need to reopen, which when reopend may end up being a completely different file. This hook may also optionally check permissions (e.g. for transitions between security domains). The hook must set **bprm->secureexec** to 1 if AT_SECURE should be set to request libc enable secure mode. The hook must add to **bprm->per_clear** any personality flags that should be cleared from current->personality. **bprm** contains the linux_binprm structure.h](hIf }(hjkhhhNhNubj)}(h**file**h]hfile}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubhR is setpcap, suid, sgid or otherwise marked to change privilege upon exec, update }(hjkhhhNhNubj)}(h**bprm->cred**h]h bprm->cred}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubhX to reflect that change. This is called after finding the binary that will be executed without an interpreter. This ensures that the credentials will not be derived from a script that the binary will need to reopen, which when reopend may end up being a completely different file. This hook may also optionally check permissions (e.g. for transitions between security domains). The hook must set }(hjkhhhNhNubj)}(h**bprm->secureexec**h]hbprm->secureexec}(hj%lhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubh[ to 1 if AT_SECURE should be set to request libc enable secure mode. The hook must add to }(hjkhhhNhNubj)}(h**bprm->per_clear**h]hbprm->per_clear}(hj7lhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubhJ any personality flags that should be cleared from current->personality. }(hjkhhhNhNubj)}(h**bprm**h]hbprm}(hjIlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubh% contains the linux_binprm structure.}(hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJkubh)}(h **Return**h]j)}(hjdlh]hReturn}(hjflhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjblubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJkubh)}(h>Returns 0 if the hook is successful and permission is granted.h]h>Returns 0 if the hook is successful and permission is granted.}(hjzlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_bprm_check (C function)c.security_bprm_checkhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h3int security_bprm_check (struct linux_binprm *bprm)h]j)}(h2int security_bprm_check(struct linux_binprm *bprm)h](j )}(hinth]hint}(hjlhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjlhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM'ubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlhhhjlhM'ubj{)}(hsecurity_bprm_checkh]j)}(hsecurity_bprm_checkh]hsecurity_bprm_check}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjlhhhjlhM'ubj)}(h(struct linux_binprm *bprm)h]j)}(hstruct linux_binprm *bprmh](j)}(hjAh]hstruct}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubh)}(hhh]j)}(h linux_binprmh]h linux_binprm}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmmodnameN classnameNj] j` )}jc ]jf )}jY jlsbc.security_bprm_checkasbuh1hhjlubj2)}(h h]h }(hj$mhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjh]h*}(hj2mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hbprmh]hbprm}(hj?mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjlubah}(h]h ]h"]h$]h&]jjuh1jhjlhhhjlhM'ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjlhhhjlhM'ubah}(h]jlah ](jjeh"]h$]h&]jj)jhuh1jhjlhM'hjlhhubj)}(hhh]h)}(hMediate binary handler searchh]hMediate binary handler search}(hjimhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM'hjfmhhubah}(h]h ]h"]h$]h&]uh1jhjlhhhjlhM'ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjmjjmjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct linux_binprm *bprm`` binary program information **Description** This hook mediates the point when a search for a binary handler will begin. It allows a check against the **bprm->cred->security** value which was set in the preceding creds_for_exec call. The argv list and envp list are reliably available in **bprm**. This hook may be called multiple times during a single execve. **bprm** contains the linux_binprm structure. **Return** Returns 0 if the hook is successful and permission is granted.h](h)}(h**Parameters**h]j)}(hjmh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM+hjmubj )}(hhh]j)}(h9``struct linux_binprm *bprm`` binary program information h](j)}(h``struct linux_binprm *bprm``h]j)}(hjmh]hstruct linux_binprm *bprm}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM(hjmubj2)}(hhh]h)}(hbinary program informationh]hbinary program information}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhM(hjmubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjmhM(hjmubah}(h]h ]h"]h$]h&]uh1j hjmubh)}(h**Description**h]j)}(hjmh]h Description}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM*hjmubh)}(hXlThis hook mediates the point when a search for a binary handler will begin. It allows a check against the **bprm->cred->security** value which was set in the preceding creds_for_exec call. The argv list and envp list are reliably available in **bprm**. This hook may be called multiple times during a single execve. **bprm** contains the linux_binprm structure.h](hjThis hook mediates the point when a search for a binary handler will begin. It allows a check against the }(hjmhhhNhNubj)}(h**bprm->cred->security**h]hbprm->cred->security}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubhr value which was set in the preceding creds_for_exec call. The argv list and envp list are reliably available in }(hjmhhhNhNubj)}(h**bprm**h]hbprm}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubhC. This hook may be called multiple times during a single execve. }(hjmhhhNhNubj)}(h**bprm**h]hbprm}(hj'nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh% contains the linux_binprm structure.}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM)hjmubh)}(h **Return**h]j)}(hjBnh]hReturn}(hjDnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@nubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM/hjmubh)}(h>Returns 0 if the hook is successful and permission is granted.h]h>Returns 0 if the hook is successful and permission is granted.}(hjXnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM0hjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j +security_bprm_committing_creds (C function) c.security_bprm_committing_credshNtauh1hhj%hhhNhNubj)}(hhh](j)}(hEvoid security_bprm_committing_creds (const struct linux_binprm *bprm)h]j)}(hDvoid security_bprm_committing_creds(const struct linux_binprm *bprm)h](j )}(hvoidh]hvoid}(hjnhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM8ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnhhhjnhM8ubj{)}(hsecurity_bprm_committing_credsh]j)}(hsecurity_bprm_committing_credsh]hsecurity_bprm_committing_creds}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnhhhjnhM8ubj)}(h!(const struct linux_binprm *bprm)h]j)}(hconst struct linux_binprm *bprmh](j)}(hjh]hconst}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubj)}(hjAh]hstruct}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubh)}(hhh]j)}(h linux_binprmh]h linux_binprm}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjnmodnameN classnameNj] j` )}jc ]jf )}jY jnsb c.security_bprm_committing_credsasbuh1hhjnubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubj)}(hjh]h*}(hj+ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(hbprmh]hbprm}(hj8ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnubah}(h]h ]h"]h$]h&]jjuh1jhjnhhhjnhM8ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjnhhhjnhM8ubah}(h]jznah ](jjeh"]h$]h&]jj)jhuh1jhjnhM8hj|nhhubj)}(hhh]h)}(h)Install creds for a process during exec()h]h)Install creds for a process during exec()}(hjbohhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM8hj_ohhubah}(h]h ]h"]h$]h&]uh1jhj|nhhhjnhM8ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjzojjzojjjuh1jhhhj%hNhNubj)}(hXg**Parameters** ``const struct linux_binprm *bprm`` binary program information **Description** Prepare to install the new security attributes of a process being transformed by an execve operation, based on the old credentials pointed to by **current->cred** and the information set in **bprm->cred** by the bprm_creds_for_exec hook. **bprm** points to the linux_binprm structure. This hook is a good place to perform state changes on the process such as closing open file descriptors to which access will no longer be granted when the attributes are changed. This is called immediately before commit_creds().h](h)}(h**Parameters**h]j)}(hjoh]h Parameters}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM<hj~oubj )}(hhh]j)}(h?``const struct linux_binprm *bprm`` binary program information h](j)}(h#``const struct linux_binprm *bprm``h]j)}(hjoh]hconst struct linux_binprm *bprm}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM9hjoubj2)}(hhh]h)}(hbinary program informationh]hbinary program information}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohM9hjoubah}(h]h ]h"]h$]h&]uh1j1hjoubeh}(h]h ]h"]h$]h&]uh1jhjohM9hjoubah}(h]h ]h"]h$]h&]uh1j hj~oubh)}(h**Description**h]j)}(hjoh]h Description}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM;hj~oubh)}(hXPrepare to install the new security attributes of a process being transformed by an execve operation, based on the old credentials pointed to by **current->cred** and the information set in **bprm->cred** by the bprm_creds_for_exec hook. **bprm** points to the linux_binprm structure. This hook is a good place to perform state changes on the process such as closing open file descriptors to which access will no longer be granted when the attributes are changed. This is called immediately before commit_creds().h](hPrepare to install the new security attributes of a process being transformed by an execve operation, based on the old credentials pointed to by }(hjohhhNhNubj)}(h**current->cred**h]h current->cred}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh and the information set in }(hjohhhNhNubj)}(h**bprm->cred**h]h bprm->cred}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh# by the bprm_creds_for_exec hook. }(hjohhhNhNubj)}(h**bprm**h]hbprm}(hj phhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubhX  points to the linux_binprm structure. This hook is a good place to perform state changes on the process such as closing open file descriptors to which access will no longer be granted when the attributes are changed. This is called immediately before commit_creds().}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM:hj~oubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *security_bprm_committed_creds (C function)c.security_bprm_committed_credshNtauh1hhj%hhhNhNubj)}(hhh](j)}(hDvoid security_bprm_committed_creds (const struct linux_binprm *bprm)h]j)}(hCvoid security_bprm_committed_creds(const struct linux_binprm *bprm)h](j )}(hvoidh]hvoid}(hjYphhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUphhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMIubj2)}(h h]h }(hjhphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUphhhjgphMIubj{)}(hsecurity_bprm_committed_credsh]j)}(hsecurity_bprm_committed_credsh]hsecurity_bprm_committed_creds}(hjzphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvpubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjUphhhjgphMIubj)}(h!(const struct linux_binprm *bprm)h]j)}(hconst struct linux_binprm *bprmh](j)}(hjh]hconst}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubj)}(hjAh]hstruct}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubh)}(hhh]j)}(h linux_binprmh]h linux_binprm}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjpmodnameN classnameNj] j` )}jc ]jf )}jY j|psbc.security_bprm_committed_credsasbuh1hhjpubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubj)}(hjh]h*}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj)}(hbprmh]hbprm}(hj qhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjpubah}(h]h ]h"]h$]h&]jjuh1jhjUphhhjgphMIubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjQphhhjgphMIubah}(h]jLpah ](jjeh"]h$]h&]jj)jhuh1jhjgphMIhjNphhubj)}(hhh]h)}(h(Tidy up after cred install during exec()h]h(Tidy up after cred install during exec()}(hj4qhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMIhj1qhhubah}(h]h ]h"]h$]h&]uh1jhjNphhhjgphMIubeh}(h]h ](jfunctioneh"]h$]h&]jjjjLqjjLqjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``const struct linux_binprm *bprm`` binary program information **Description** Tidy up after the installation of the new security attributes of a process being transformed by an execve operation. The new credentials have, by this point, been set to **current->cred**. **bprm** points to the linux_binprm structure. This hook is a good place to perform state changes on the process such as clearing out non-inheritable signal state. This is called immediately after commit_creds().h](h)}(h**Parameters**h]j)}(hjVqh]h Parameters}(hjXqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTqubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMMhjPqubj )}(hhh]j)}(h?``const struct linux_binprm *bprm`` binary program information h](j)}(h#``const struct linux_binprm *bprm``h]j)}(hjuqh]hconst struct linux_binprm *bprm}(hjwqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsqubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMJhjoqubj2)}(hhh]h)}(hbinary program informationh]hbinary program information}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhMJhjqubah}(h]h ]h"]h$]h&]uh1j1hjoqubeh}(h]h ]h"]h$]h&]uh1jhjqhMJhjlqubah}(h]h ]h"]h$]h&]uh1j hjPqubh)}(h**Description**h]j)}(hjqh]h Description}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMLhjPqubh)}(hXTidy up after the installation of the new security attributes of a process being transformed by an execve operation. The new credentials have, by this point, been set to **current->cred**. **bprm** points to the linux_binprm structure. This hook is a good place to perform state changes on the process such as clearing out non-inheritable signal state. This is called immediately after commit_creds().h](hTidy up after the installation of the new security attributes of a process being transformed by an execve operation. The new credentials have, by this point, been set to }(hjqhhhNhNubj)}(h**current->cred**h]h current->cred}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh. }(hjqhhhNhNubj)}(h**bprm**h]hbprm}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh points to the linux_binprm structure. This hook is a good place to perform state changes on the process such as clearing out non-inheritable signal state. This is called immediately after commit_creds().}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMKhjPqubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )security_fs_context_submount (C function)c.security_fs_context_submounthNtauh1hhj%hhhNhNubj)}(hhh](j)}(hWint security_fs_context_submount (struct fs_context *fc, struct super_block *reference)h]j)}(hVint security_fs_context_submount(struct fs_context *fc, struct super_block *reference)h](j )}(hinth]hint}(hjrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMYubj2)}(h h]h }(hj(rhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrhhhj'rhMYubj{)}(hsecurity_fs_context_submounth]j)}(hsecurity_fs_context_submounth]hsecurity_fs_context_submount}(hj:rhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6rubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjrhhhj'rhMYubj)}(h6(struct fs_context *fc, struct super_block *reference)h](j)}(hstruct fs_context *fch](j)}(hjAh]hstruct}(hjVrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRrubj2)}(h h]h }(hjcrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRrubh)}(hhh]j)}(h fs_contexth]h fs_context}(hjtrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqrubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjvrmodnameN classnameNj] j` )}jc ]jf )}jY jah"]h$]h&]uh1j1hjRrubj)}(hjh]h*}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRrubj)}(hfch]hfc}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjNrubj)}(hstruct super_block *referenceh](j)}(hjAh]hstruct}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubh)}(hhh]j)}(h super_blockh]h super_block}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjrmodnameN classnameNj] j` )}jc ]jrc.security_fs_context_submountasbuh1hhjrubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hjh]h*}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(h referenceh]h reference}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjNrubeh}(h]h ]h"]h$]h&]jjuh1jhjrhhhj'rhMYubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjrhhhj'rhMYubah}(h]j rah ](jjeh"]h$]h&]jj)jhuh1jhj'rhMYhjrhhubj)}(hhh]h)}(hInitialise fc->securityh]hInitialise fc->security}(hjIshhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMYhjFshhubah}(h]h ]h"]h$]h&]uh1jhjrhhhj'rhMYubeh}(h]h ](jfunctioneh"]h$]h&]jjjjasjjasjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct fs_context *fc`` new filesystem context ``struct super_block *reference`` dentry reference for submount/remount **Description** Fill out the ->security field for a new fs_context. **Return** Returns 0 on success or negative error code on failure.h](h)}(h**Parameters**h]j)}(hjksh]h Parameters}(hjmshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjisubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM]hjesubj )}(hhh](j)}(h1``struct fs_context *fc`` new filesystem context h](j)}(h``struct fs_context *fc``h]j)}(hjsh]hstruct fs_context *fc}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMZhjsubj2)}(hhh]h)}(hnew filesystem contexth]hnew filesystem context}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshMZhjsubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjshMZhjsubj)}(hH``struct super_block *reference`` dentry reference for submount/remount h](j)}(h!``struct super_block *reference``h]j)}(hjsh]hstruct super_block *reference}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM[hjsubj2)}(hhh]h)}(h%dentry reference for submount/remounth]h%dentry reference for submount/remount}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshM[hjsubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjshM[hjsubeh}(h]h ]h"]h$]h&]uh1j hjesubh)}(h**Description**h]j)}(hjsh]h Description}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM]hjesubh)}(h3Fill out the ->security field for a new fs_context.h]h3Fill out the ->security field for a new fs_context.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\hjesubh)}(h **Return**h]j)}(hj%th]hReturn}(hj'thhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#tubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM^hjesubh)}(h7Returns 0 on success or negative error code on failure.h]h7Returns 0 on success or negative error code on failure.}(hj;thhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM_hjesubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_fs_context_dup (C function)c.security_fs_context_duphNtauh1hhj%hhhNhNubj)}(hhh](j)}(hNint security_fs_context_dup (struct fs_context *fc, struct fs_context *src_fc)h]j)}(hMint security_fs_context_dup(struct fs_context *fc, struct fs_context *src_fc)h](j )}(hinth]hint}(hjjthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfthhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMgubj2)}(h h]h }(hjythhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfthhhjxthMgubj{)}(hsecurity_fs_context_duph]j)}(hsecurity_fs_context_duph]hsecurity_fs_context_dup}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjfthhhjxthMgubj)}(h2(struct fs_context *fc, struct fs_context *src_fc)h](j)}(hstruct fs_context *fch](j)}(hjAh]hstruct}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubh)}(hhh]j)}(h fs_contexth]h fs_context}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]jf )}jY jtsbc.security_fs_context_dupasbuh1hhjtubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(hfch]hfc}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubj)}(hstruct fs_context *src_fch](j)}(hjAh]hstruct}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj2)}(h h]h }(hj&uhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjuubh)}(hhh]j)}(h fs_contexth]h fs_context}(hj7uhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4uubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj9umodnameN classnameNj] j` )}jc ]jtc.security_fs_context_dupasbuh1hhjuubj2)}(h h]h }(hjUuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjuubj)}(hjh]h*}(hjcuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj)}(hsrc_fch]hsrc_fc}(hjpuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubeh}(h]h ]h"]h$]h&]jjuh1jhjfthhhjxthMgubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjbthhhjxthMgubah}(h]j]tah ](jjeh"]h$]h&]jj)jhuh1jhjxthMghj_thhubj)}(hhh]h)}(hDuplicate a fs_context LSM blobh]hDuplicate a fs_context LSM blob}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMghjuhhubah}(h]h ]h"]h$]h&]uh1jhj_thhhjxthMgubeh}(h]h ](jfunctioneh"]h$]h&]jjjjujjujjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct fs_context *fc`` destination filesystem context ``struct fs_context *src_fc`` source filesystem context **Description** Allocate and attach a security structure to sc->security. This pointer is initialised to NULL by the caller. **fc** indicates the new filesystem context. **src_fc** indicates the original filesystem context. **Return** Returns 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]j)}(hjuh]h Parameters}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMkhjuubj )}(hhh](j)}(h9``struct fs_context *fc`` destination filesystem context h](j)}(h``struct fs_context *fc``h]j)}(hjuh]hstruct fs_context *fc}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhhjuubj2)}(hhh]h)}(hdestination filesystem contexth]hdestination filesystem context}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhMhhjuubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjuhMhhjuubj)}(h8``struct fs_context *src_fc`` source filesystem context h](j)}(h``struct fs_context *src_fc``h]j)}(hjvh]hstruct fs_context *src_fc}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMihjvubj2)}(hhh]h)}(hsource filesystem contexth]hsource filesystem context}(hj-vhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)vhMihj*vubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhj)vhMihjuubeh}(h]h ]h"]h$]h&]uh1j hjuubh)}(h**Description**h]j)}(hjOvh]h Description}(hjQvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMvubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMkhjuubh)}(hAllocate and attach a security structure to sc->security. This pointer is initialised to NULL by the caller. **fc** indicates the new filesystem context. **src_fc** indicates the original filesystem context.h](hoAllocate and attach a security structure to sc->security. This pointer is initialised to NULL by the caller. }(hjevhhhNhNubj)}(h**fc**h]hfc}(hjmvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjevubh' indicates the new filesystem context. }(hjevhhhNhNubj)}(h **src_fc**h]hsrc_fc}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjevubh+ indicates the original filesystem context.}(hjevhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMjhjuubh)}(h **Return**h]j)}(hjvh]hReturn}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMnhjuubh)}(h9Returns 0 on success or a negative error code on failure.h]h9Returns 0 on success or a negative error code on failure.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMohjuubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ,security_fs_context_parse_param (C function)!c.security_fs_context_parse_paramhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hWint security_fs_context_parse_param (struct fs_context *fc, struct fs_parameter *param)h]j)}(hVint security_fs_context_parse_param(struct fs_context *fc, struct fs_parameter *param)h](j )}(hinth]hint}(hjvhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjvhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMwubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvhhhjvhMwubj{)}(hsecurity_fs_context_parse_paramh]j)}(hsecurity_fs_context_parse_paramh]hsecurity_fs_context_parse_param}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjvhhhjvhMwubj)}(h3(struct fs_context *fc, struct fs_parameter *param)h](j)}(hstruct fs_context *fch](j)}(hjAh]hstruct}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj2)}(h h]h }(hj)whhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubh)}(hhh]j)}(h fs_contexth]h fs_context}(hj:whhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7wubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjah"]h$]h&]uh1j1hjwubj)}(hjh]h*}(hjhwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hfch]hfc}(hjuwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwubj)}(hstruct fs_parameter *paramh](j)}(hjAh]hstruct}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubh)}(hhh]j)}(h fs_parameterh]h fs_parameter}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjwmodnameN classnameNj] j` )}jc ]jVw!c.security_fs_context_parse_paramasbuh1hhjwubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubj)}(hjh]h*}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hparamh]hparam}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwubeh}(h]h ]h"]h$]h&]jjuh1jhjvhhhjvhMwubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjvhhhjvhMwubah}(h]jvah ](jjeh"]h$]h&]jj)jhuh1jhjvhMwhjvhhubj)}(hhh]h)}(hConfigure a filesystem contexth]hConfigure a filesystem context}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMwhj xhhubah}(h]h ]h"]h$]h&]uh1jhjvhhhjvhMwubeh}(h]h ](jfunctioneh"]h$]h&]jjjj'xjj'xjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct fs_context *fc`` filesystem context ``struct fs_parameter *param`` filesystem parameter **Description** Userspace provided a parameter to configure a superblock. The LSM can consume the parameter or return it to the caller for use elsewhere. **Return** If the parameter is used by the LSM it should return 0, if it is returned to the caller -ENOPARAM is returned, otherwise a negative error code is returned.h](h)}(h**Parameters**h]j)}(hj1xh]h Parameters}(hj3xhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/xubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM{hj+xubj )}(hhh](j)}(h-``struct fs_context *fc`` filesystem context h](j)}(h``struct fs_context *fc``h]j)}(hjPxh]hstruct fs_context *fc}(hjRxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNxubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMxhjJxubj2)}(hhh]h)}(hfilesystem contexth]hfilesystem context}(hjixhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjexhMxhjfxubah}(h]h ]h"]h$]h&]uh1j1hjJxubeh}(h]h ]h"]h$]h&]uh1jhjexhMxhjGxubj)}(h4``struct fs_parameter *param`` filesystem parameter h](j)}(h``struct fs_parameter *param``h]j)}(hjxh]hstruct fs_parameter *param}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMyhjxubj2)}(hhh]h)}(hfilesystem parameterh]hfilesystem parameter}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhMyhjxubah}(h]h ]h"]h$]h&]uh1j1hjxubeh}(h]h ]h"]h$]h&]uh1jhjxhMyhjGxubeh}(h]h ]h"]h$]h&]uh1j hj+xubh)}(h**Description**h]j)}(hjxh]h Description}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM{hj+xubh)}(hUserspace provided a parameter to configure a superblock. The LSM can consume the parameter or return it to the caller for use elsewhere.h]hUserspace provided a parameter to configure a superblock. The LSM can consume the parameter or return it to the caller for use elsewhere.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMzhj+xubh)}(h **Return**h]j)}(hjxh]hReturn}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM}hj+xubh)}(hIf the parameter is used by the LSM it should return 0, if it is returned to the caller -ENOPARAM is returned, otherwise a negative error code is returned.h]hIf the parameter is used by the LSM it should return 0, if it is returned to the caller -ENOPARAM is returned, otherwise a negative error code is returned.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM~hj+xubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_sb_alloc (C function)c.security_sb_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h.int security_sb_alloc (struct super_block *sb)h]j)}(h-int security_sb_alloc(struct super_block *sb)h](j )}(hinth]hint}(hj0yhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj,yhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj?yhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,yhhhj>yhMubj{)}(hsecurity_sb_alloch]j)}(hsecurity_sb_alloch]hsecurity_sb_alloc}(hjQyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMyubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj,yhhhj>yhMubj)}(h(struct super_block *sb)h]j)}(hstruct super_block *sbh](j)}(hjAh]hstruct}(hjmyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiyubj2)}(h h]h }(hjzyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiyubh)}(hhh]j)}(h super_blockh]h super_block}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjymodnameN classnameNj] j` )}jc ]jf )}jY jSysbc.security_sb_allocasbuh1hhjiyubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiyubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiyubj)}(hsbh]hsb}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiyubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjeyubah}(h]h ]h"]h$]h&]jjuh1jhj,yhhhj>yhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj(yhhhj>yhMubah}(h]j#yah ](jjeh"]h$]h&]jj)jhuh1jhj>yhMhj%yhhubj)}(hhh]h)}(hAllocate a super_block LSM blobh]hAllocate a super_block LSM blob}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjyhhubah}(h]h ]h"]h$]h&]uh1jhj%yhhhj>yhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjzjjzjjjuh1jhhhj%hNhNubj)}(hXV**Parameters** ``struct super_block *sb`` filesystem superblock **Description** Allocate and attach a security structure to the sb->s_security field. The s_security field is initialized to NULL when the structure is allocated. **sb** contains the super_block structure to be modified. **Return** Returns 0 if operation was successful.h](h)}(h**Parameters**h]j)}(hjzh]h Parameters}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj zubj )}(hhh]j)}(h1``struct super_block *sb`` filesystem superblock h](j)}(h``struct super_block *sb``h]j)}(hj1zh]hstruct super_block *sb}(hj3zhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/zubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj+zubj2)}(hhh]h)}(hfilesystem superblockh]hfilesystem superblock}(hjJzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFzhMhjGzubah}(h]h ]h"]h$]h&]uh1j1hj+zubeh}(h]h ]h"]h$]h&]uh1jhjFzhMhj(zubah}(h]h ]h"]h$]h&]uh1j hj zubh)}(h**Description**h]j)}(hjlzh]h Description}(hjnzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjzubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj zubh)}(hAllocate and attach a security structure to the sb->s_security field. The s_security field is initialized to NULL when the structure is allocated. **sb** contains the super_block structure to be modified.h](hAllocate and attach a security structure to the sb->s_security field. The s_security field is initialized to NULL when the structure is allocated. }(hjzhhhNhNubj)}(h**sb**h]hsb}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubh3 contains the super_block structure to be modified.}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj zubh)}(h **Return**h]j)}(hjzh]hReturn}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj zubh)}(h&Returns 0 if operation was successful.h]h&Returns 0 if operation was successful.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj zubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_sb_delete (C function)c.security_sb_deletehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h0void security_sb_delete (struct super_block *sb)h]j)}(h/void security_sb_delete(struct super_block *sb)h](j )}(hvoidh]hvoid}(hjzhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjzhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjzhhhjzhMubj{)}(hsecurity_sb_deleteh]j)}(hsecurity_sb_deleteh]hsecurity_sb_delete}(hj {hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjzhhhjzhMubj)}(h(struct super_block *sb)h]j)}(hstruct super_block *sbh](j)}(hjAh]hstruct}(hj'{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#{ubj2)}(h h]h }(hj4{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#{ubh)}(hhh]j)}(h super_blockh]h super_block}(hjE{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB{ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjG{modnameN classnameNj] j` )}jc ]jf )}jY j {sbc.security_sb_deleteasbuh1hhj#{ubj2)}(h h]h }(hje{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#{ubj)}(hjh]h*}(hjs{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#{ubj)}(hsbh]hsb}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubah}(h]h ]h"]h$]h&]jjuh1jhjzhhhjzhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjzhhhjzhMubah}(h]jzah ](jjeh"]h$]h&]jj)jhuh1jhjzhMhjzhhubj)}(hhh]h)}(h*Release super_block LSM associated objectsh]h*Release super_block LSM associated objects}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{hhubah}(h]h ]h"]h$]h&]uh1jhjzhhhjzhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj{jj{jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct super_block *sb`` filesystem superblock **Description** Release objects tied to a superblock (e.g. inodes). **sb** contains the super_block structure being released.h](h)}(h**Parameters**h]j)}(hj{h]h Parameters}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{ubj )}(hhh]j)}(h1``struct super_block *sb`` filesystem superblock h](j)}(h``struct super_block *sb``h]j)}(hj{h]hstruct super_block *sb}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{ubj2)}(hhh]h)}(hfilesystem superblockh]hfilesystem superblock}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hMhj|ubah}(h]h ]h"]h$]h&]uh1j1hj{ubeh}(h]h ]h"]h$]h&]uh1jhj|hMhj{ubah}(h]h ]h"]h$]h&]uh1j hj{ubh)}(h**Description**h]j)}(hj&|h]h Description}(hj(|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$|ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{ubh)}(hnRelease objects tied to a superblock (e.g. inodes). **sb** contains the super_block structure being released.h](h5Release objects tied to a superblock (e.g. inodes). }(hj<|hhhNhNubj)}(h**sb**h]hsb}(hjD|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<|ubh3 contains the super_block structure being released.}(hj<|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_sb_free (C function)c.security_sb_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h.void security_sb_free (struct super_block *sb)h]j)}(h-void security_sb_free(struct super_block *sb)h](j )}(hvoidh]hvoid}(hj}|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjy|hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjy|hhhj|hMubj{)}(hsecurity_sb_freeh]j)}(hsecurity_sb_freeh]hsecurity_sb_free}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjy|hhhj|hMubj)}(h(struct super_block *sb)h]j)}(hstruct super_block *sbh](j)}(hjAh]hstruct}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|ubh)}(hhh]j)}(h super_blockh]h super_block}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj|modnameN classnameNj] j` )}jc ]jf )}jY j|sbc.security_sb_freeasbuh1hhj|ubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|ubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hsbh]hsb}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|ubah}(h]h ]h"]h$]h&]jjuh1jhjy|hhhj|hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhju|hhhj|hMubah}(h]jp|ah ](jjeh"]h$]h&]jj)jhuh1jhj|hMhjr|hhubj)}(hhh]h)}(hFree a super_block LSM blobh]hFree a super_block LSM blob}(hj=}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj:}hhubah}(h]h ]h"]h$]h&]uh1jhjr|hhhj|hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjU}jjU}jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct super_block *sb`` filesystem superblock **Description** Deallocate and clear the sb->s_security field. **sb** contains the super_block structure to be modified.h](h)}(h**Parameters**h]j)}(hj_}h]h Parameters}(hja}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]}ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjY}ubj )}(hhh]j)}(h1``struct super_block *sb`` filesystem superblock h](j)}(h``struct super_block *sb``h]j)}(hj~}h]hstruct super_block *sb}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|}ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjx}ubj2)}(hhh]h)}(hfilesystem superblockh]hfilesystem superblock}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hMhj}ubah}(h]h ]h"]h$]h&]uh1j1hjx}ubeh}(h]h ]h"]h$]h&]uh1jhj}hMhju}ubah}(h]h ]h"]h$]h&]uh1j hjY}ubh)}(h**Description**h]j)}(hj}h]h Description}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjY}ubh)}(hiDeallocate and clear the sb->s_security field. **sb** contains the super_block structure to be modified.h](h0Deallocate and clear the sb->s_security field. }(hj}hhhNhNubj)}(h**sb**h]hsb}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubh3 contains the super_block structure to be modified.}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjY}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_sb_kern_mount (C function)c.security_sb_kern_mounthNtauh1hhj%hhhNhNubj)}(hhh](j)}(h9int security_sb_kern_mount (const struct super_block *sb)h]j)}(h8int security_sb_kern_mount(const struct super_block *sb)h](j )}(hinth]hint}(hj~hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ~hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ~hhhj~hMubj{)}(hsecurity_sb_kern_mounth]j)}(hsecurity_sb_kern_mounth]hsecurity_sb_kern_mount}(hj1~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-~ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj ~hhhj~hMubj)}(h(const struct super_block *sb)h]j)}(hconst struct super_block *sbh](j)}(hjh]hconst}(hjM~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI~ubj2)}(h h]h }(hjZ~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjI~ubj)}(hjAh]hstruct}(hjh~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI~ubj2)}(h h]h }(hju~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjI~ubh)}(hhh]j)}(h super_blockh]h super_block}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj~modnameN classnameNj] j` )}jc ]jf )}jY j3~sbc.security_sb_kern_mountasbuh1hhjI~ubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjI~ubj)}(hjh]h*}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI~ubj)}(hsbh]hsb}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI~ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjE~ubah}(h]h ]h"]h$]h&]jjuh1jhj ~hhhj~hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj~hhhj~hMubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhj~hMhj~hhubj)}(hhh]h)}(h"Check if a kernel mount is allowedh]h"Check if a kernel mount is allowed}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj~hhubah}(h]h ]h"]h$]h&]uh1jhj~hhhj~hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``const struct super_block *sb`` filesystem superblock **Description** Mount this **sb** if allowed by permissions. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh]j)}(h7``const struct super_block *sb`` filesystem superblock h](j)}(h ``const struct super_block *sb``h]j)}(hj,h]hconst struct super_block *sb}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj&ubj2)}(hhh]h)}(hfilesystem superblockh]hfilesystem superblock}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMhjBubah}(h]h ]h"]h$]h&]uh1j1hj&ubeh}(h]h ]h"]h$]h&]uh1jhjAhMhj#ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjgh]h Description}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h,Mount this **sb** if allowed by permissions.h](h Mount this }(hj}hhhNhNubj)}(h**sb**h]hsb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubh if allowed by permissions.}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_sb_show_options (C function)c.security_sb_show_optionshNtauh1hhj%hhhNhNubj)}(hhh](j)}(hIint security_sb_show_options (struct seq_file *m, struct super_block *sb)h]j)}(hHint security_sb_show_options(struct seq_file *m, struct super_block *sb)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_sb_show_optionsh]j)}(hsecurity_sb_show_optionsh]hsecurity_sb_show_options}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h,(struct seq_file *m, struct super_block *sb)h](j)}(hstruct seq_file *mh](j)}(hjAh]hstruct}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hseq_fileh]hseq_file}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjBmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_sb_show_optionsasbuh1hhjubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj0h]hm}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct super_block *sbh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h super_blockh]h super_block}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j\c.security_sb_show_optionsasbuh1hhjubj2)}(h h]h }(hjπhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj݀hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsbh]hsb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h)Output the mount options for a superblockh]h)Output the mount options for a superblock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj,jj,jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct seq_file *m`` output file ``struct super_block *sb`` filesystem superblock **Description** Show (print on **m**) mount options for this **sb**. **Return** Returns 0 on success, negative values on failure.h](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj0ubj )}(hhh](j)}(h#``struct seq_file *m`` output file h](j)}(h``struct seq_file *m``h]j)}(hjUh]hstruct seq_file *m}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjOubj2)}(hhh]h)}(h output fileh]h output file}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhMhjkubah}(h]h ]h"]h$]h&]uh1j1hjOubeh}(h]h ]h"]h$]h&]uh1jhjjhMhjLubj)}(h1``struct super_block *sb`` filesystem superblock h](j)}(h``struct super_block *sb``h]j)}(hjh]hstruct super_block *sb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hfilesystem superblockh]hfilesystem superblock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjLubeh}(h]h ]h"]h$]h&]uh1j hj0ubh)}(h**Description**h]j)}(hjɁh]h Description}(hjˁhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjǁubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj0ubh)}(h4Show (print on **m**) mount options for this **sb**.h](hShow (print on }(hj߁hhhNhNubj)}(h**m**h]hm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj߁ubh) mount options for this }(hj߁hhhNhNubj)}(h**sb**h]hsb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj߁ubh.}(hj߁hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj0ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj0ubh)}(h1Returns 0 on success, negative values on failure.h]h1Returns 0 on success, negative values on failure.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_sb_statfs (C function)c.security_sb_statfshNtauh1hhj%hhhNhNubj)}(hhh](j)}(h.int security_sb_statfs (struct dentry *dentry)h]j)}(h-int security_sb_statfs(struct dentry *dentry)h](j )}(hinth]hint}(hjYhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUhhhjghMubj{)}(hsecurity_sb_statfsh]j)}(hsecurity_sb_statfsh]hsecurity_sb_statfs}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjUhhhjghMubj)}(h(struct dentry *dentry)h]j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j|sbc.security_sb_statfsasbuh1hhjubj2)}(h h]h }(hjԂhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjUhhhjghMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjQhhhjghMubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1jhjghMhjNhhubj)}(hhh]h)}(h&Check if accessing fs stats is allowedh]h&Check if accessing fs stats is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjghMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj1jj1jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct dentry *dentry`` superblock handle **Description** Check permission before obtaining filesystem statistics for the **mnt** mountpoint. **dentry** is a handle on the superblock for the filesystem. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj;h]h Parameters}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM#hj5ubj )}(hhh]j)}(h,``struct dentry *dentry`` superblock handle h](j)}(h``struct dentry *dentry``h]j)}(hjZh]hstruct dentry *dentry}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjTubj2)}(hhh]h)}(hsuperblock handleh]hsuperblock handle}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohM hjpubah}(h]h ]h"]h$]h&]uh1j1hjTubeh}(h]h ]h"]h$]h&]uh1jhjohM hjQubah}(h]h ]h"]h$]h&]uh1j hj5ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM"hj5ubh)}(hCheck permission before obtaining filesystem statistics for the **mnt** mountpoint. **dentry** is a handle on the superblock for the filesystem.h](h@Check permission before obtaining filesystem statistics for the }(hjhhhNhNubj)}(h**mnt**h]hmnt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh mountpoint. }(hjhhhNhNubj)}(h **dentry**h]hdentry}(hjŃhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 is a handle on the superblock for the filesystem.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM!hj5ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjރubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM$hj5ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM%hj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_sb_mount (C function)c.security_sb_mounthNtauh1hhj%hhhNhNubj)}(hhh](j)}(hxint security_sb_mount (const char *dev_name, const struct path *path, const char *type, unsigned long flags, void *data)h]j)}(hwint security_sb_mount(const char *dev_name, const struct path *path, const char *type, unsigned long flags, void *data)h](j )}(hinth]hint}(hj%hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM-ubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!hhhj3hM-ubj{)}(hsecurity_sb_mounth]j)}(hsecurity_sb_mounth]hsecurity_sb_mount}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj!hhhj3hM-ubj)}(hb(const char *dev_name, const struct path *path, const char *type, unsigned long flags, void *data)h](j)}(hconst char *dev_nameh](j)}(hjh]hconst}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubj )}(hcharh]hchar}(hj}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj^ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hdev_nameh]hdev_name}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hconst struct path *pathh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj̄hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjڄhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hpathh]hpath}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jHsbc.security_sb_mountasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpathh]hpath}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hconst char *typeh](j)}(hjh]hconst}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj )}(hcharh]hchar}(hjghhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(htypeh]htype}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hunsigned long flagsh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjŅhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjӅhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(h void *datah](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdatah]hdata}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubeh}(h]h ]h"]h$]h&]jjuh1jhj!hhhj3hM-ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj3hM-ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj3hM-hjhhubj)}(hhh]h)}(h*Check permission for mounting a filesystemh]h*Check permission for mounting a filesystem}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM-hjJhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj3hM-ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjejjejjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``const char *dev_name`` filesystem backing device ``const struct path *path`` mount point ``const char *type`` filesystem type ``unsigned long flags`` mount flags ``void *data`` filesystem specific data **Description** Check permission before an object specified by **dev_name** is mounted on the mount point named by **nd**. For an ordinary mount, **dev_name** identifies a device if the file system type requires a device. For a remount (**flags** & MS_REMOUNT), **dev_name** is irrelevant. For a loopback/bind mount (**flags** & MS_BIND), **dev_name** identifies the pathname of the object being mounted. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjoh]h Parameters}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM1hjiubj )}(hhh](j)}(h3``const char *dev_name`` filesystem backing device h](j)}(h``const char *dev_name``h]j)}(hjh]hconst char *dev_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM.hjubj2)}(hhh]h)}(hfilesystem backing deviceh]hfilesystem backing device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM.hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM.hjubj)}(h(``const struct path *path`` mount point h](j)}(h``const struct path *path``h]j)}(hjdžh]hconst struct path *path}(hjɆhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjņubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM/hjubj2)}(hhh]h)}(h mount pointh]h mount point}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj܆hM/hj݆ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj܆hM/hjubj)}(h%``const char *type`` filesystem type h](j)}(h``const char *type``h]j)}(hjh]hconst char *type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM0hjubj2)}(hhh]h)}(hfilesystem typeh]hfilesystem type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM0hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM0hjubj)}(h$``unsigned long flags`` mount flags h](j)}(h``unsigned long flags``h]j)}(hj9h]hunsigned long flags}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM1hj3ubj2)}(hhh]h)}(h mount flagsh]h mount flags}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhM1hjOubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhjNhM1hjubj)}(h(``void *data`` filesystem specific data h](j)}(h``void *data``h]j)}(hjrh]h void *data}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM2hjlubj2)}(hhh]h)}(hfilesystem specific datah]hfilesystem specific data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM2hjubah}(h]h ]h"]h$]h&]uh1j1hjlubeh}(h]h ]h"]h$]h&]uh1jhjhM2hjubeh}(h]h ]h"]h$]h&]uh1j hjiubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM4hjiubh)}(hXCheck permission before an object specified by **dev_name** is mounted on the mount point named by **nd**. For an ordinary mount, **dev_name** identifies a device if the file system type requires a device. For a remount (**flags** & MS_REMOUNT), **dev_name** is irrelevant. For a loopback/bind mount (**flags** & MS_BIND), **dev_name** identifies the pathname of the object being mounted.h](h/Check permission before an object specified by }(hjÇhhhNhNubj)}(h **dev_name**h]hdev_name}(hjˇhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÇubh( is mounted on the mount point named by }(hjÇhhhNhNubj)}(h**nd**h]hnd}(hj݇hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÇubh. For an ordinary mount, }(hjÇhhhNhNubj)}(h **dev_name**h]hdev_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÇubhP identifies a device if the file system type requires a device. For a remount (}(hjÇhhhNhNubj)}(h **flags**h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÇubh & MS_REMOUNT), }(hjÇhhhNhNubj)}(h **dev_name**h]hdev_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÇubh, is irrelevant. For a loopback/bind mount (}(hjÇhhhNhNubj)}(h **flags**h]hflags}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÇubh & MS_BIND), }(hjÇhhhNhNubj)}(h **dev_name**h]hdev_name}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÇubh5 identifies the pathname of the object being mounted.}(hjÇhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM3hjiubh)}(h **Return**h]j)}(hjRh]hReturn}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM:hjiubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM;hjiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_sb_umount (C function)c.security_sb_umounthNtauh1hhj%hhhNhNubj)}(hhh](j)}(h8int security_sb_umount (struct vfsmount *mnt, int flags)h]j)}(h7int security_sb_umount(struct vfsmount *mnt, int flags)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMDubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMDubj{)}(hsecurity_sb_umounth]j)}(hsecurity_sb_umounth]hsecurity_sb_umount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMDubj)}(h!(struct vfsmount *mnt, int flags)h](j)}(hstruct vfsmount *mnth](j)}(hjAh]hstruct}(hjԈhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЈubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjЈubh)}(hhh]j)}(hvfsmounth]hvfsmount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_sb_umountasbuh1hhjЈubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjЈubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЈubj)}(hmnth]hmnt}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЈubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj̈ubj)}(h int flagsh](j )}(hinth]hint}(hjFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hflagsh]hflags}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj̈ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMDubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMDubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMDhjhhubj)}(hhh]h)}(h,Check permission for unmounting a filesystemh]h,Check permission for unmounting a filesystem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMDhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMDubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct vfsmount *mnt`` mounted filesystem ``int flags`` unmount flags **Description** Check permission before the **mnt** file system is unmounted. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMHhjubj )}(hhh](j)}(h,``struct vfsmount *mnt`` mounted filesystem h](j)}(h``struct vfsmount *mnt``h]j)}(hj͉h]hstruct vfsmount *mnt}(hjωhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjˉubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMEhjljubj2)}(hhh]h)}(hmounted filesystemh]hmounted filesystem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMEhjubah}(h]h ]h"]h$]h&]uh1j1hjljubeh}(h]h ]h"]h$]h&]uh1jhjhMEhjĉubj)}(h``int flags`` unmount flags h](j)}(h ``int flags``h]j)}(hjh]h int flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMFhjubj2)}(hhh]h)}(h unmount flagsh]h unmount flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMFhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMFhjĉubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjAh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMHhjubh)}(h=Check permission before the **mnt** file system is unmounted.h](hCheck permission before the }(hjWhhhNhNubj)}(h**mnt**h]hmnt}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh file system is unmounted.}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMGhjubh)}(h **Return**h]j)}(hjzh]hReturn}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMIhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMJhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_sb_pivotroot (C function)c.security_sb_pivotroothNtauh1hhj%hhhNhNubj)}(hhh](j)}(hTint security_sb_pivotroot (const struct path *old_path, const struct path *new_path)h]j)}(hSint security_sb_pivotroot(const struct path *old_path, const struct path *new_path)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMRubj2)}(h h]h }(hjΊhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj͊hMRubj{)}(hsecurity_sb_pivotrooth]j)}(hsecurity_sb_pivotrooth]hsecurity_sb_pivotroot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj܊ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj͊hMRubj)}(h:(const struct path *old_path, const struct path *new_path)h](j)}(hconst struct path *old_pathh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hpathh]hpath}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_sb_pivotrootasbuh1hhjubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hold_pathh]hold_path}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst struct path *new_pathh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hpathh]hpath}(hj‹hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjċmodnameN classnameNj] j` )}jc ]jQc.security_sb_pivotrootasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnew_pathh]hnew_path}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj͊hMRubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj͊hMRubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj͊hMRhjhhubj)}(hhh]h)}(h)Check permissions for pivoting the rootfsh]h)Check permissions for pivoting the rootfs}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMRhj"hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj͊hMRubeh}(h]h ](jfunctioneh"]h$]h&]jjjj=jj=jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``const struct path *old_path`` new location for current rootfs ``const struct path *new_path`` location of the new rootfs **Description** Check permission before pivoting the root filesystem. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjGh]h Parameters}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMVhjAubj )}(hhh](j)}(h@``const struct path *old_path`` new location for current rootfs h](j)}(h``const struct path *old_path``h]j)}(hjfh]hconst struct path *old_path}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMShj`ubj2)}(hhh]h)}(hnew location for current rootfsh]hnew location for current rootfs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMShj|ubah}(h]h ]h"]h$]h&]uh1j1hj`ubeh}(h]h ]h"]h$]h&]uh1jhj{hMShj]ubj)}(h;``const struct path *new_path`` location of the new rootfs h](j)}(h``const struct path *new_path``h]j)}(hjh]hconst struct path *new_path}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMThjubj2)}(hhh]h)}(hlocation of the new rootfsh]hlocation of the new rootfs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMThjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMThj]ubeh}(h]h ]h"]h$]h&]uh1j hjAubh)}(h**Description**h]j)}(hjڌh]h Description}(hj܌hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj،ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMVhjAubh)}(h5Check permission before pivoting the root filesystem.h]h5Check permission before pivoting the root filesystem.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMUhjAubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMWhjAubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMXhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_move_mount (C function)c.security_move_mounthNtauh1hhj%hhhNhNubj)}(hhh](j)}(hRint security_move_mount (const struct path *from_path, const struct path *to_path)h]j)}(hQint security_move_mount(const struct path *from_path, const struct path *to_path)h](j )}(hinth]hint}(hjFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBhhhjThMubj{)}(hsecurity_move_mounth]j)}(hsecurity_move_mounth]hsecurity_move_mount}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjBhhhjThMubj)}(h:(const struct path *from_path, const struct path *to_path)h](j)}(hconst struct path *from_pathh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hpathh]hpath}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jisbc.security_move_mountasbuh1hhjubj2)}(h h]h }(hj܍hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h from_pathh]h from_path}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubj)}(hconst struct path *to_pathh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjAh]hstruct}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hpathh]hpath}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjKmodnameN classnameNj] j` )}jc ]j؍c.security_move_mountasbuh1hhj ubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hto_pathh]hto_path}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubeh}(h]h ]h"]h$]h&]jjuh1jhjBhhhjThMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj>hhhjThMubah}(h]j9ah ](jjeh"]h$]h&]jj)jhuh1jhjThMhj;hhubj)}(hhh]h)}(h$Check permissions for moving a mounth]h$Check permissions for moving a mount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj;hhhjThMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjĎjjĎjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``const struct path *from_path`` source mount point ``const struct path *to_path`` destination mount point **Description** Check permission before a mount is moved. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjΎh]h Parameters}(hjЎhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̎ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjȎubj )}(hhh](j)}(h4``const struct path *from_path`` source mount point h](j)}(h ``const struct path *from_path``h]j)}(hjh]hconst struct path *from_path}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hsource mount pointh]hsource mount point}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h7``const struct path *to_path`` destination mount point h](j)}(h``const struct path *to_path``h]j)}(hj&h]hconst struct path *to_path}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubj2)}(hhh]h)}(hdestination mount pointh]hdestination mount point}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj<ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj;hMhjubeh}(h]h ]h"]h$]h&]uh1j hjȎubh)}(h**Description**h]j)}(hjah]h Description}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjȎubh)}(h)Check permission before a mount is moved.h]h)Check permission before a mount is moved.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjȎubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjȎubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjȎubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !security_path_notify (C function)c.security_path_notifyhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hSint security_path_notify (const struct path *path, u64 mask, unsigned int obj_type)h]j)}(hRint security_path_notify(const struct path *path, u64 mask, unsigned int obj_type)h](j )}(hinth]hint}(hj͏hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjɏhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj܏hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjɏhhhjۏhMubj{)}(hsecurity_path_notifyh]j)}(hsecurity_path_notifyh]hsecurity_path_notify}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjɏhhhjۏhMubj)}(h:(const struct path *path, u64 mask, unsigned int obj_type)h](j)}(hconst struct path *pathh](j)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hpathh]hpath}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjEmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_path_notifyasbuh1hhjubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpathh]hpath}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hu64 maskh](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j_c.security_path_notifyasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hmaskh]hmask}(hjƐhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int obj_typeh](j )}(hunsignedh]hunsigned}(hjߐhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjېubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjېubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjېubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjېubj)}(hobj_typeh]hobj_type}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjېubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjɏhhhjۏhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjŏhhhjۏhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjۏhMhjhhubj)}(hhh]h)}(h#Check if setting a watch is allowedh]h#Check if setting a watch is allowed}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj>hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjۏhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjYjjYjjjuh1jhhhj%hNhNubj)}(hXM**Parameters** ``const struct path *path`` file path ``u64 mask`` event mask ``unsigned int obj_type`` file path type **Description** Check permissions before setting a watch on events as defined by **mask**, on an object at **path**, whose type is defined by **obj_type**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjch]h Parameters}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj]ubj )}(hhh](j)}(h&``const struct path *path`` file path h](j)}(h``const struct path *path``h]j)}(hjh]hconst struct path *path}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj|ubj2)}(hhh]h)}(h file pathh]h file path}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj|ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjyubj)}(h``u64 mask`` event mask h](j)}(h ``u64 mask``h]j)}(hjh]hu64 mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h event maskh]h event mask}(hjԑhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjБhMhjёubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjБhMhjyubj)}(h)``unsigned int obj_type`` file path type h](j)}(h``unsigned int obj_type``h]j)}(hjh]hunsigned int obj_type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hfile path typeh]hfile path type}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjyubeh}(h]h ]h"]h$]h&]uh1j hj]ubh)}(h**Description**h]j)}(hj/h]h Description}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj]ubh)}(hCheck permissions before setting a watch on events as defined by **mask**, on an object at **path**, whose type is defined by **obj_type**.h](hACheck permissions before setting a watch on events as defined by }(hjEhhhNhNubj)}(h**mask**h]hmask}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh, on an object at }(hjEhhhNhNubj)}(h**path**h]hpath}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh, whose type is defined by }(hjEhhhNhNubj)}(h **obj_type**h]hobj_type}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj]ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj]ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj]ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !security_inode_alloc (C function)c.security_inode_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h9int security_inode_alloc (struct inode *inode, gfp_t gfp)h]j)}(h8int security_inode_alloc(struct inode *inode, gfp_t gfp)h](j )}(hinth]hint}(hjђhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj͒hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj͒hhhjߒhMubj{)}(hsecurity_inode_alloch]j)}(hsecurity_inode_alloch]hsecurity_inode_alloc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj͒hhhjߒhMubj)}(h (struct inode *inode, gfp_t gfp)h](j)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hinodeh]hinode}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj.modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_allocasbuh1hhj ubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hinodeh]hinode}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jHc.security_inode_allocasbuh1hhj|ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|ubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj͒hhhjߒhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjɒhhhjߒhMubah}(h]jĒah ](jjeh"]h$]h&]jj)jhuh1jhjߒhMhjƒhhubj)}(hhh]h)}(hAllocate an inode LSM blobh]hAllocate an inode LSM blob}(hjٓhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj֓hhubah}(h]h ]h"]h$]h&]uh1jhjƒhhhjߒhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX1**Parameters** ``struct inode *inode`` the inode ``gfp_t gfp`` allocation flags **Description** Allocate and attach a security structure to **inode->i_security**. The i_security field is initialized to NULL when the inode structure is allocated. **Return** Return 0 if operation was successful.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h"``struct inode *inode`` the inode h](j)}(h``struct inode *inode``h]j)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h the inodeh]h the inode}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hMhj0ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj/hMhjubj)}(h``gfp_t gfp`` allocation flags h](j)}(h ``gfp_t gfp``h]j)}(hjSh]h gfp_t gfp}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjMubj2)}(hhh]h)}(hallocation flagsh]hallocation flags}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMhjiubah}(h]h ]h"]h$]h&]uh1j1hjMubeh}(h]h ]h"]h$]h&]uh1jhjhhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hAllocate and attach a security structure to **inode->i_security**. The i_security field is initialized to NULL when the inode structure is allocated.h](h,Allocate and attach a security structure to }(hjhhhNhNubj)}(h**inode->i_security**h]hinode->i_security}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhU. The i_security field is initialized to NULL when the inode structure is allocated.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjǔh]hReturn}(hjɔhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjŔubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h%Return 0 if operation was successful.h]h%Return 0 if operation was successful.}(hjݔhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_inode_free (C function)c.security_inode_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h.void security_inode_free (struct inode *inode)h]j)}(h-void security_inode_free(struct inode *inode)h](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inode_freeh]j)}(hsecurity_inode_freeh]hsecurity_inode_free}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct inode *inode)h]j)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEubh)}(hhh]j)}(hinodeh]hinode}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjimodnameN classnameNj] j` )}jc ]jf )}jY j/sbc.security_inode_freeasbuh1hhjEubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjAubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hFree an inode's LSM blobh]hFree an inode’s LSM blob}(hj̕hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjɕhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct inode *inode`` the inode **Description** Release any LSM resources associated with **inode**, although due to the inode's RCU protections it is possible that the resources will not be fully released until after the current RCU grace period has elapsed. It is important for LSMs to note that despite being present in a call to security_inode_free(), **inode** may still be referenced in a VFS path walk and calls to security_inode_permission() may be made during, or after, a call to security_inode_free(). For this reason the inode->i_security field is released via a call_rcu() callback and any LSMs which need to retain inode state for use in security_inode_permission() should only release that state in the inode_free_security_rcu() LSM hook callback.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh]j)}(h"``struct inode *inode`` the inode h](j)}(h``struct inode *inode``h]j)}(hj h]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h the inodeh]h the inode}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMhj#ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj"hMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjHh]h Description}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hRelease any LSM resources associated with **inode**, although due to the inode's RCU protections it is possible that the resources will not be fully released until after the current RCU grace period has elapsed.h](h*Release any LSM resources associated with }(hj^hhhNhNubj)}(h **inode**h]hinode}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubh, although due to the inode’s RCU protections it is possible that the resources will not be fully released until after the current RCU grace period has elapsed.}(hj^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hXIt is important for LSMs to note that despite being present in a call to security_inode_free(), **inode** may still be referenced in a VFS path walk and calls to security_inode_permission() may be made during, or after, a call to security_inode_free(). For this reason the inode->i_security field is released via a call_rcu() callback and any LSMs which need to retain inode state for use in security_inode_permission() should only release that state in the inode_free_security_rcu() LSM hook callback.h](h`It is important for LSMs to note that despite being present in a call to security_inode_free(), }(hjhhhNhNubj)}(h **inode**h]hinode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX may still be referenced in a VFS path walk and calls to security_inode_permission() may be made during, or after, a call to security_inode_free(). For this reason the inode->i_security field is released via a call_rcu() callback and any LSMs which need to retain inode state for use in security_inode_permission() should only release that state in the inode_free_security_rcu() LSM hook callback.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j .security_inode_init_security_anon (C function)#c.security_inode_init_security_anonhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hwint security_inode_init_security_anon (struct inode *inode, const struct qstr *name, const struct inode *context_inode)h]j)}(hvint security_inode_init_security_anon(struct inode *inode, const struct qstr *name, const struct inode *context_inode)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMdubj2)}(h h]h }(hjϖhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjΖhMdubj{)}(h!security_inode_init_security_anonh]j)}(h!security_inode_init_security_anonh]h!security_inode_init_security_anon}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjݖubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjΖhMdubj)}(hQ(struct inode *inode, const struct qstr *name, const struct inode *context_inode)h](j)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb#c.security_inode_init_security_anonasbuh1hhjubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinodeh]hinode}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst struct qstr *nameh](j)}(hjh]hconst}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubh)}(hhh]j)}(hqstrh]hqstr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j7#c.security_inode_init_security_anonasbuh1hhjkubj2)}(h h]h }(hjƗhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubj)}(hjh]h*}(hjԗhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h!const struct inode *context_inodeh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj5modnameN classnameNj] j` )}jc ]j7#c.security_inode_init_security_anonasbuh1hhjubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h context_inodeh]h context_inode}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjΖhMdubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjΖhMdubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjΖhMdhjhhubj)}(hhh]h)}(hInitialize an anonymous inodeh]hInitialize an anonymous inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMdhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjΖhMdubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct inode *inode`` the inode ``const struct qstr *name`` the anonymous inode class ``const struct inode *context_inode`` an optional related inode **Description** Set up the incore security field for the new anonymous inode and return whether the inode creation is permitted by the security module or not. **Return** Returns 0 on success, -EACCES if the security module denies the creation of this inode, or another -errno upon other errors.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhhjubj )}(hhh](j)}(h"``struct inode *inode`` the inode h](j)}(h``struct inode *inode``h]j)}(hjטh]hstruct inode *inode}(hj٘hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj՘ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMehjјubj2)}(hhh]h)}(h the inodeh]h the inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMehjubah}(h]h ]h"]h$]h&]uh1j1hjјubeh}(h]h ]h"]h$]h&]uh1jhjhMehjΘubj)}(h6``const struct qstr *name`` the anonymous inode class h](j)}(h``const struct qstr *name``h]j)}(hjh]hconst struct qstr *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMfhj ubj2)}(hhh]h)}(hthe anonymous inode classh]hthe anonymous inode class}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMfhj&ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj%hMfhjΘubj)}(h@``const struct inode *context_inode`` an optional related inode h](j)}(h%``const struct inode *context_inode``h]j)}(hjIh]h!const struct inode *context_inode}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMghjCubj2)}(hhh]h)}(han optional related inodeh]han optional related inode}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hMghj_ubah}(h]h ]h"]h$]h&]uh1j1hjCubeh}(h]h ]h"]h$]h&]uh1jhj^hMghjΘubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMihjubh)}(hSet up the incore security field for the new anonymous inode and return whether the inode creation is permitted by the security module or not.h]hSet up the incore security field for the new anonymous inode and return whether the inode creation is permitted by the security module or not.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMkhjubh)}(h|Returns 0 on success, -EACCES if the security module denies the creation of this inode, or another -errno upon other errors.h]h|Returns 0 on success, -EACCES if the security module denies the creation of this inode, or another -errno upon other errors.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMlhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_path_post_mknod (C function)c.security_path_post_mknodhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hNvoid security_path_post_mknod (struct mnt_idmap *idmap, struct dentry *dentry)h]j)}(hMvoid security_path_post_mknod(struct mnt_idmap *idmap, struct dentry *dentry)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_path_post_mknodh]j)}(hsecurity_path_post_mknodh]hsecurity_path_post_mknod}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h0(struct mnt_idmap *idmap, struct dentry *dentry)h](j)}(hstruct mnt_idmap *idmaph](j)}(hjAh]hstruct}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubh)}(hhh]j)}(h mnt_idmaph]h mnt_idmap}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjMmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_path_post_mknodasbuh1hhj)ubj2)}(h h]h }(hjkhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hidmaph]hidmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj%ubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jgc.security_path_post_mknodasbuh1hhjubj2)}(h h]h }(hjۚhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj%ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h-Update inode security after reg file creationh]h-Update inode security after reg file creation}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj8jj8jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct mnt_idmap *idmap`` idmap of the mount ``struct dentry *dentry`` new file **Description** Update inode security field after a regular file has been created.h](h)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj<ubj )}(hhh](j)}(h/``struct mnt_idmap *idmap`` idmap of the mount h](j)}(h``struct mnt_idmap *idmap``h]j)}(hjah]hstruct mnt_idmap *idmap}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj[ubj2)}(hhh]h)}(hidmap of the mounth]hidmap of the mount}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhMhjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjXubj)}(h#``struct dentry *dentry`` new file h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hnew fileh]hnew file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjXubeh}(h]h ]h"]h$]h&]uh1j hj<ubh)}(h**Description**h]j)}(hj՛h]h Description}(hjכhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӛubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj<ubh)}(hBUpdate inode security field after a regular file has been created.h]hBUpdate inode security field after a regular file has been created.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_path_rmdir (C function)c.security_path_rmdirhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hGint security_path_rmdir (const struct path *dir, struct dentry *dentry)h]j)}(hFint security_path_rmdir(const struct path *dir, struct dentry *dentry)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj(hMubj{)}(hsecurity_path_rmdirh]j)}(hsecurity_path_rmdirh]hsecurity_path_rmdir}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj(hMubj)}(h/(const struct path *dir, struct dentry *dentry)h](j)}(hconst struct path *dirh](j)}(hjh]hconst}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hjAh]hstruct}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubh)}(hhh]j)}(hpathh]hpath}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j=sbc.security_path_rmdirasbuh1hhjSubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj)}(hdirh]hdir}(hj˜hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_path_rmdirasbuh1hhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj(hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj(hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj(hMhjhhubj)}(hhh]h)}(h(Check if removing a directory is allowedh]h(Check if removing a directory is allowed}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjbhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj(hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj}jj}jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``const struct path *dir`` parent directory ``struct dentry *dentry`` directory to remove **Description** Check the permission to remove a directory. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h,``const struct path *dir`` parent directory h](j)}(h``const struct path *dir``h]j)}(hjh]hconst struct path *dir}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hparent directoryh]hparent directory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h.``struct dentry *dentry`` directory to remove h](j)}(h``struct dentry *dentry``h]j)}(hjߝh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݝubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjٝubj2)}(hhh]h)}(hdirectory to removeh]hdirectory to remove}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjٝubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h+Check the permission to remove a directory.h]h+Check the permission to remove a directory.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjAh]hReturn}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_path_symlink (C function)c.security_path_symlinkhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h_int security_path_symlink (const struct path *dir, struct dentry *dentry, const char *old_name)h]j)}(h^int security_path_symlink(const struct path *dir, struct dentry *dentry, const char *old_name)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_path_symlinkh]j)}(hsecurity_path_symlinkh]hsecurity_path_symlink}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hE(const struct path *dir, struct dentry *dentry, const char *old_name)h](j)}(hconst struct path *dirh](j)}(hjh]hconst}(hjÞhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjОhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjޞhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hpathh]hpath}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_path_symlinkasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdirh]hdir}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubh)}(hhh]j)}(hdentryh]hdentry}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjpmodnameN classnameNj] j` )}jc ]jc.security_path_symlinkasbuh1hhjLubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *old_nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj͟hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj۟hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hold_nameh]hold_name}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj~hhhjhMubah}(h]jyah ](jjeh"]h$]h&]jj)jhuh1jhjhMhj{hhubj)}(hhh]h)}(h,Check if creating a symbolic link is allowedh]h,Check if creating a symbolic link is allowed}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj+hhubah}(h]h ]h"]h$]h&]uh1jhj{hhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjFjjFjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``const struct path *dir`` parent directory ``struct dentry *dentry`` symbolic link ``const char *old_name`` file pathname **Description** Check the permission to create a symbolic link to a file. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjPh]h Parameters}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJubj )}(hhh](j)}(h,``const struct path *dir`` parent directory h](j)}(h``const struct path *dir``h]j)}(hjoh]hconst struct path *dir}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjiubj2)}(hhh]h)}(hparent directoryh]hparent directory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjiubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubj)}(h(``struct dentry *dentry`` symbolic link h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h symbolic linkh]h symbolic link}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubj)}(h'``const char *old_name`` file pathname h](j)}(h``const char *old_name``h]j)}(hjh]hconst char *old_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjߠubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj۠ubj2)}(hhh]h)}(h file pathnameh]h file pathname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj۠ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubeh}(h]h ]h"]h$]h&]uh1j hjJubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJubh)}(h9Check the permission to create a symbolic link to a file.h]h9Check the permission to create a symbolic link to a file.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJubh)}(h **Return**h]j)}(hjCh]hReturn}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_path_link (C function)c.security_path_linkhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hiint security_path_link (struct dentry *old_dentry, const struct path *new_dir, struct dentry *new_dentry)h]j)}(hhint security_path_link(struct dentry *old_dentry, const struct path *new_dir, struct dentry *new_dentry)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_path_linkh]j)}(hsecurity_path_linkh]hsecurity_path_link}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hR(struct dentry *old_dentry, const struct path *new_dir, struct dentry *new_dentry)h](j)}(hstruct dentry *old_dentryh](j)}(hjAh]hstruct}(hjšhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjҡhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_path_linkasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h old_dentryh]h old_dentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst struct path *new_dirh](j)}(hjh]hconst}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj2)}(h h]h }(hjDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj)}(hjAh]hstruct}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubh)}(hhh]j)}(hpathh]hpath}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjrmodnameN classnameNj] j` )}jc ]jc.security_path_linkasbuh1hhj3ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj)}(hnew_dirh]hnew_dir}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *new_dentryh](j)}(hjAh]hstruct}(hj¢hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjϢhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjݢubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_path_linkasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h new_dentryh]h new_dentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]j{ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhj}hhubj)}(hhh]h)}(h(Check if creating a hard link is allowedh]h(Check if creating a hard link is allowed}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj@hhubah}(h]h ]h"]h$]h&]uh1jhj}hhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[jj[jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct dentry *old_dentry`` existing file ``const struct path *new_dir`` new parent directory ``struct dentry *new_dentry`` new link **Description** Check permission before creating a new hard link to a file. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjeh]h Parameters}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj_ubj )}(hhh](j)}(h,``struct dentry *old_dentry`` existing file h](j)}(h``struct dentry *old_dentry``h]j)}(hjh]hstruct dentry *old_dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj~ubj2)}(hhh]h)}(h existing fileh]h existing file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj~ubeh}(h]h ]h"]h$]h&]uh1jhjhMhj{ubj)}(h4``const struct path *new_dir`` new parent directory h](j)}(h``const struct path *new_dir``h]j)}(hjh]hconst struct path *new_dir}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hnew parent directoryh]hnew parent directory}(hj֣hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjңhMhjӣubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjңhMhj{ubj)}(h'``struct dentry *new_dentry`` new link h](j)}(h``struct dentry *new_dentry``h]j)}(hjh]hstruct dentry *new_dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hnew linkh]hnew link}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMhj{ubeh}(h]h ]h"]h$]h&]uh1j hj_ubh)}(h**Description**h]j)}(hj1h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj_ubh)}(h;Check permission before creating a new hard link to a file.h]h;Check permission before creating a new hard link to a file.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj_ubh)}(h **Return**h]j)}(hjXh]hReturn}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj_ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_path_truncate (C function)c.security_path_truncatehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h4int security_path_truncate (const struct path *path)h]j)}(h3int security_path_truncate(const struct path *path)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_path_truncateh]j)}(hsecurity_path_truncateh]hsecurity_path_truncate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(const struct path *path)h]j)}(hconst struct path *pathh](j)}(hjh]hconst}(hjڤhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֤ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj֤ubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֤ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj֤ubh)}(hhh]j)}(hpathh]hpath}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_path_truncateasbuh1hhj֤ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj֤ubj)}(hjh]h*}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֤ubj)}(hpathh]hpath}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֤ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjҤubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h%Check if truncating a file is allowedh]h%Check if truncating a file is allowed}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjuhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX2**Parameters** ``const struct path *path`` file **Description** Check permission before truncating the file indicated by path. Note that truncation permissions may also be checked based on already opened files, using the security_file_truncate() hook. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh]j)}(h!``const struct path *path`` file h](j)}(h``const struct path *path``h]j)}(hjh]hconst struct path *path}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hfileh]hfile}(hjҥhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjΥhMhjϥubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjΥhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hCheck permission before truncating the file indicated by path. Note that truncation permissions may also be checked based on already opened files, using the security_file_truncate() hook.h]hCheck permission before truncating the file indicated by path. Note that truncation permissions may also be checked based on already opened files, using the security_file_truncate() hook.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_path_chmod (C function)c.security_path_chmodhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h?int security_path_chmod (const struct path *path, umode_t mode)h]j)}(h>int security_path_chmod(const struct path *path, umode_t mode)h](j )}(hinth]hint}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\hhhjnhMubj{)}(hsecurity_path_chmodh]j)}(hsecurity_path_chmodh]hsecurity_path_chmod}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj\hhhjnhMubj)}(h'(const struct path *path, umode_t mode)h](j)}(hconst struct path *pathh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjŦhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hpathh]hpath}(hj֦hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjӦubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjئmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_path_chmodasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpathh]hpath}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h umode_t modeh](h)}(hhh]j)}(humode_th]humode_t}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj/modnameN classnameNj] j` )}jc ]jc.security_path_chmodasbuh1hhj&ubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj)}(hmodeh]hmode}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj\hhhjnhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjXhhhjnhMubah}(h]jSah ](jjeh"]h$]h&]jj)jhuh1jhjnhMhjUhhubj)}(hhh]h)}(h,Check if changing the file's mode is allowedh]h.Check if changing the file’s mode is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjUhhhjnhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX6**Parameters** ``const struct path *path`` file ``umode_t mode`` new mode **Description** Check for permission to change a mode of the file **path**. The new mode is specified in **mode** which is a bitmask of constants from . **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM#hjubj )}(hhh](j)}(h!``const struct path *path`` file h](j)}(h``const struct path *path``h]j)}(hjħh]hconst struct path *path}(hjƧhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj§ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(hfileh]hfile}(hjݧhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj٧hM hjڧubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj٧hM hjubj)}(h``umode_t mode`` new mode h](j)}(h``umode_t mode``h]j)}(hjh]h umode_t mode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM!hjubj2)}(hhh]h)}(hnew modeh]hnew mode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM!hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM!hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj8h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM#hjubh)}(hCheck for permission to change a mode of the file **path**. The new mode is specified in **mode** which is a bitmask of constants from .h](h2Check for permission to change a mode of the file }(hjNhhhNhNubj)}(h**path**h]hpath}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubh. The new mode is specified in }(hjNhhhNhNubj)}(h**mode**h]hmode}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubhB which is a bitmask of constants from .}(hjNhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM"hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM&hjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM'hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_path_chown (C function)c.security_path_chownhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hIint security_path_chown (const struct path *path, kuid_t uid, kgid_t gid)h]j)}(hHint security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)h](j )}(hinth]hint}(hjȨhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjĨhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM1ubj2)}(h h]h }(hjרhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjĨhhhj֨hM1ubj{)}(hsecurity_path_chownh]j)}(hsecurity_path_chownh]hsecurity_path_chown}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjĨhhhj֨hM1ubj)}(h1(const struct path *path, kuid_t uid, kgid_t gid)h](j)}(hconst struct path *pathh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hpathh]hpath}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj@modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_path_chownasbuh1hhjubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpathh]hpath}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h kuid_t uidh](h)}(hhh]j)}(hkuid_th]hkuid_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jZc.security_path_chownasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(huidh]huid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h kgid_t gidh](h)}(hhh]j)}(hkgid_th]hkgid_t}(hjݩhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjکubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjߩmodnameN classnameNj] j` )}jc ]jZc.security_path_chownasbuh1hhj֩ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj֩ubj)}(hgidh]hgid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֩ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjĨhhhj֨hM1ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj֨hM1ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj֨hM1hjhhubj)}(hhh]h)}(h3Check if changing the file's owner/group is allowedh]h5Check if changing the file’s owner/group is allowed}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM1hj0hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj֨hM1ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjKjjKjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``const struct path *path`` file ``kuid_t uid`` file owner ``kgid_t gid`` file group **Description** Check for permission to change owner/group of a file or directory. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5hjOubj )}(hhh](j)}(h!``const struct path *path`` file h](j)}(h``const struct path *path``h]j)}(hjth]hconst struct path *path}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM2hjnubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM2hjubah}(h]h ]h"]h$]h&]uh1j1hjnubeh}(h]h ]h"]h$]h&]uh1jhjhM2hjkubj)}(h``kuid_t uid`` file owner h](j)}(h``kuid_t uid``h]j)}(hjh]h kuid_t uid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM3hjubj2)}(hhh]h)}(h file ownerh]h file owner}(hjƪhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjªhM3hjêubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjªhM3hjkubj)}(h``kgid_t gid`` file group h](j)}(h``kgid_t gid``h]j)}(hjh]h kgid_t gid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM4hjubj2)}(hhh]h)}(h file grouph]h file group}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM4hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM4hjkubeh}(h]h ]h"]h$]h&]uh1j hjOubh)}(h**Description**h]j)}(hj!h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM6hjOubh)}(hBCheck for permission to change owner/group of a file or directory.h]hBCheck for permission to change owner/group of a file or directory.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5hjOubh)}(h **Return**h]j)}(hjHh]hReturn}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM7hjOubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM8hjOubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !security_path_chroot (C function)c.security_path_chroothNtauh1hhj%hhhNhNubj)}(hhh](j)}(h2int security_path_chroot (const struct path *path)h]j)}(h1int security_path_chroot(const struct path *path)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMBubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMBubj{)}(hsecurity_path_chrooth]j)}(hsecurity_path_chrooth]hsecurity_path_chroot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMBubj)}(h(const struct path *path)h]j)}(hconst struct path *pathh](j)}(hjh]hconst}(hjʫhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƫubj2)}(h h]h }(hj׫hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjƫubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƫubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjƫubh)}(hhh]j)}(hpathh]hpath}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_path_chrootasbuh1hhjƫubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjƫubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƫubj)}(hpathh]hpath}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƫubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj«ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMBubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMBubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMBhjhhubj)}(hhh]h)}(h/Check if changing the root directory is allowedh]h/Check if changing the root directory is allowed}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMBhjehhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMBubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``const struct path *path`` directory **Description** Check for permission to change root directory. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMFhjubj )}(hhh]j)}(h&``const struct path *path`` directory h](j)}(h``const struct path *path``h]j)}(hjh]hconst struct path *path}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMChjubj2)}(hhh]h)}(h directoryh]h directory}(hj¬hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMChjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMChjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMEhjubh)}(h.Check for permission to change root directory.h]h.Check for permission to change root directory.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMDhjubh)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMFhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMGhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j /security_inode_post_create_tmpfile (C function)$c.security_inode_post_create_tmpfilehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hVvoid security_inode_post_create_tmpfile (struct mnt_idmap *idmap, struct inode *inode)h]j)}(hUvoid security_inode_post_create_tmpfile(struct mnt_idmap *idmap, struct inode *inode)h](j )}(hvoidh]hvoid}(hjPhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMcubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLhhhj^hMcubj{)}(h"security_inode_post_create_tmpfileh]j)}(h"security_inode_post_create_tmpfileh]h"security_inode_post_create_tmpfile}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjLhhhj^hMcubj)}(h.(struct mnt_idmap *idmap, struct inode *inode)h](j)}(hstruct mnt_idmap *idmaph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h mnt_idmaph]h mnt_idmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jssb$c.security_inode_post_create_tmpfileasbuh1hhjubj2)}(h h]h }(hj˭hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj٭hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidmaph]hidmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jǭ$c.security_inode_post_create_tmpfileasbuh1hhjubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinodeh]hinode}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjLhhhj^hMcubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjHhhhj^hMcubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1jhj^hMchjEhhubj)}(hhh]h)}(h$Update inode security of new tmpfileh]h$Update inode security of new tmpfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMchj}hhubah}(h]h ]h"]h$]h&]uh1jhjEhhhj^hMcubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct mnt_idmap *idmap`` idmap of the mount ``struct inode *inode`` inode of the new tmpfile **Description** Update inode security data after a tmpfile has been created.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMghjubj )}(hhh](j)}(h/``struct mnt_idmap *idmap`` idmap of the mount h](j)}(h``struct mnt_idmap *idmap``h]j)}(hjh]hstruct mnt_idmap *idmap}(hjîhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMdhjubj2)}(hhh]h)}(hidmap of the mounth]hidmap of the mount}(hjڮhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj֮hMdhj׮ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj֮hMdhjubj)}(h1``struct inode *inode`` inode of the new tmpfile h](j)}(h``struct inode *inode``h]j)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMehjubj2)}(hhh]h)}(hinode of the new tmpfileh]hinode of the new tmpfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMehjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMehjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj5h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMghjubh)}(hah"]h$]h&]uh1j1hjvhhhjhMrubj{)}(hsecurity_inode_linkh]j)}(hsecurity_inode_linkh]hsecurity_inode_link}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjvhhhjhMrubj)}(hI(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)h](j)}(hstruct dentry *old_dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjįhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjկhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjүubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjׯmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_linkasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h old_dentryh]h old_dentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct inode *dirh](j)}(hjAh]hstruct}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%ubh)}(hhh]j)}(hinodeh]hinode}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjImodnameN classnameNj] j` )}jc ]jc.security_inode_linkasbuh1hhj%ubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%ubj)}(hjh]h*}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(hdirh]hdir}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *new_dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_inode_linkasbuh1hhjubj2)}(h h]h }(hjհhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h new_dentryh]h new_dentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjvhhhjhMrubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjrhhhjhMrubah}(h]jmah ](jjeh"]h$]h&]jj)jhuh1jhjhMrhjohhubj)}(hhh]h)}(h(Check if creating a hard link is allowedh]h(Check if creating a hard link is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMrhjhhubah}(h]h ]h"]h$]h&]uh1jhjohhhjhMrubeh}(h]h ](jfunctioneh"]h$]h&]jjjj2jj2jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct dentry *old_dentry`` existing file ``struct inode *dir`` new parent directory ``struct dentry *new_dentry`` new link **Description** Check permission before creating a new hard link to a file. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj<h]h Parameters}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMvhj6ubj )}(hhh](j)}(h,``struct dentry *old_dentry`` existing file h](j)}(h``struct dentry *old_dentry``h]j)}(hj[h]hstruct dentry *old_dentry}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMshjUubj2)}(hhh]h)}(h existing fileh]h existing file}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphMshjqubah}(h]h ]h"]h$]h&]uh1j1hjUubeh}(h]h ]h"]h$]h&]uh1jhjphMshjRubj)}(h+``struct inode *dir`` new parent directory h](j)}(h``struct inode *dir``h]j)}(hjh]hstruct inode *dir}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMthjubj2)}(hhh]h)}(hnew parent directoryh]hnew parent directory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMthjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMthjRubj)}(h'``struct dentry *new_dentry`` new link h](j)}(h``struct dentry *new_dentry``h]j)}(hjͱh]hstruct dentry *new_dentry}(hjϱhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj˱ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMuhjDZubj2)}(hhh]h)}(hnew linkh]hnew link}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMuhjubah}(h]h ]h"]h$]h&]uh1j1hjDZubeh}(h]h ]h"]h$]h&]uh1jhjhMuhjRubeh}(h]h ]h"]h$]h&]uh1j hj6ubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMwhj6ubh)}(h;Check permission before creating a new hard link to a file.h]h;Check permission before creating a new hard link to a file.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMvhj6ubh)}(h **Return**h]j)}(hj/h]hReturn}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMxhj6ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMyhj6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_inode_unlink (C function)c.security_inode_unlinkhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hDint security_inode_unlink (struct inode *dir, struct dentry *dentry)h]j)}(hCint security_inode_unlink(struct inode *dir, struct dentry *dentry)h](j )}(hinth]hint}(hjthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjphhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjphhhjhMubj{)}(hsecurity_inode_unlinkh]j)}(hsecurity_inode_unlinkh]hsecurity_inode_unlink}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjphhhjhMubj)}(h*(struct inode *dir, struct dentry *dentry)h](j)}(hstruct inode *dirh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hjϲhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj̲ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjѲmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_unlinkasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdirh]hdir}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjCmodnameN classnameNj] j` )}jc ]jc.security_inode_unlinkasbuh1hhjubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjphhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjlhhhjhMubah}(h]jgah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjihhubj)}(hhh]h)}(h(Check if removing a hard link is allowedh]h(Check if removing a hard link is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjihhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct inode *dir`` parent directory ``struct dentry *dentry`` file **Description** Check the permission to remove a hard link to a file. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjƳh]h Parameters}(hjȳhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjijubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h'``struct inode *dir`` parent directory h](j)}(h``struct inode *dir``h]j)}(hjh]hstruct inode *dir}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj߳ubj2)}(hhh]h)}(hparent directoryh]hparent directory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj߳ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjܳubj)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hfileh]hfile}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj4ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj3hMhjܳubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjYh]h Description}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h5Check the permission to remove a hard link to a file.h]h5Check the permission to remove a hard link to a file.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_inode_symlink (C function)c.security_inode_symlinkhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h[int security_inode_symlink (struct inode *dir, struct dentry *dentry, const char *old_name)h]j)}(hZint security_inode_symlink(struct inode *dir, struct dentry *dentry, const char *old_name)h](j )}(hinth]hint}(hjŴhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjԴhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjӴhMubj{)}(hsecurity_inode_symlinkh]j)}(hsecurity_inode_symlinkh]hsecurity_inode_symlink}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjӴhMubj)}(h@(struct inode *dir, struct dentry *dentry, const char *old_name)h](j)}(hstruct inode *dirh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj"modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_symlinkasbuh1hhjubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdirh]hdir}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j<c.security_inode_symlinkasbuh1hhjpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj)}(hdentryh]hdentry}(hj˵hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *old_nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hold_nameh]hold_name}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjӴhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjӴhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjӴhMhjhhubj)}(hhh]h)}(h,Check if creating a symbolic link is allowedh]h,Check if creating a symbolic link is allowed}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjOhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjӴhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct inode *dir`` parent directory ``struct dentry *dentry`` symbolic link ``const char *old_name`` existing filename **Description** Check the permission to create a symbolic link to a file. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjth]h Parameters}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjnubj )}(hhh](j)}(h'``struct inode *dir`` parent directory h](j)}(h``struct inode *dir``h]j)}(hjh]hstruct inode *dir}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hparent directoryh]hparent directory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h(``struct dentry *dentry`` symbolic link h](j)}(h``struct dentry *dentry``h]j)}(hj̶h]hstruct dentry *dentry}(hjζhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjʶubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjƶubj2)}(hhh]h)}(h symbolic linkh]h symbolic link}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjƶubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h+``const char *old_name`` existing filename h](j)}(h``const char *old_name``h]j)}(hjh]hconst char *old_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hexisting filenameh]hexisting filename}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjnubh)}(h**Description**h]j)}(hj@h]h Description}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjnubh)}(h9Check the permission to create a symbolic link to a file.h]h9Check the permission to create a symbolic link to a file.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjnubh)}(h **Return**h]j)}(hjgh]hReturn}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjnubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjnubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !security_inode_rmdir (C function)c.security_inode_rmdirhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hCint security_inode_rmdir (struct inode *dir, struct dentry *dentry)h]j)}(hBint security_inode_rmdir(struct inode *dir, struct dentry *dentry)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inode_rmdirh]j)}(hsecurity_inode_rmdirh]hsecurity_inode_rmdir}(hjͷhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɷubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h*(struct inode *dir, struct dentry *dentry)h](j)}(hstruct inode *dirh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY jϷsbc.security_inode_rmdirasbuh1hhjubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdirh]hdir}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubh)}(hhh]j)}(hdentryh]hdentry}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj{modnameN classnameNj] j` )}jc ]j#c.security_inode_rmdirasbuh1hhjWubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h(Check if removing a directory is allowedh]h(Check if removing a directory is allowed}(hjܸhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjٸhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct inode *dir`` parent directory ``struct dentry *dentry`` directory to be removed **Description** Check the permission to remove a directory. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h'``struct inode *dir`` parent directory h](j)}(h``struct inode *dir``h]j)}(hjh]hstruct inode *dir}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hparent directoryh]hparent directory}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj3ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj2hMhjubj)}(h2``struct dentry *dentry`` directory to be removed h](j)}(h``struct dentry *dentry``h]j)}(hjVh]hstruct dentry *dentry}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjPubj2)}(hhh]h)}(hdirectory to be removedh]hdirectory to be removed}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMhjlubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhjkhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h+Check the permission to remove a directory.h]h+Check the permission to remove a directory.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjιhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !security_inode_mknod (C function)c.security_inode_mknodhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h\int security_inode_mknod (struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)h]j)}(h[int security_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj hMubj{)}(hsecurity_inode_mknodh]j)}(hsecurity_inode_mknodh]hsecurity_inode_mknod}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj hMubj)}(hC(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)h](j)}(hstruct inode *dirh](j)}(hjAh]hstruct}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubh)}(hhh]j)}(hinodeh]hinode}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjZmodnameN classnameNj] j` )}jc ]jf )}jY j sbc.security_inode_mknodasbuh1hhj6ubj2)}(h h]h }(hjxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hdirh]hdir}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj2ubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjʺhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǺubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj̺modnameN classnameNj] j` )}jc ]jtc.security_inode_mknodasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj2ubj)}(h umode_t modeh](h)}(hhh]j)}(humode_th]humode_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj!modnameN classnameNj] j` )}jc ]jtc.security_inode_mknodasbuh1hhjubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hmodeh]hmode}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj2ubj)}(h dev_t devh](h)}(hhh]j)}(hdev_th]hdev_t}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjimodnameN classnameNj] j` )}jc ]jtc.security_inode_mknodasbuh1hhj`ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj2ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hMhjhhubj)}(hhh]h)}(h+Check if creating a special file is allowedh]h+Check if creating a special file is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjջjjջjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct inode *dir`` parent directory ``struct dentry *dentry`` new file ``umode_t mode`` new file mode ``dev_t dev`` device number **Description** Check permissions when creating a special file (or a socket or a fifo file created via the mknod system call). Note that if mknod operation is being done for a regular file, then the create hook will be called and not this hook. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj߻h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݻubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjٻubj )}(hhh](j)}(h'``struct inode *dir`` parent directory h](j)}(h``struct inode *dir``h]j)}(hjh]hstruct inode *dir}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hparent directoryh]hparent directory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h#``struct dentry *dentry`` new file h](j)}(h``struct dentry *dentry``h]j)}(hj7h]hstruct dentry *dentry}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj1ubj2)}(hhh]h)}(hnew fileh]hnew file}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjMubah}(h]h ]h"]h$]h&]uh1j1hj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjubj)}(h``umode_t mode`` new file mode h](j)}(h``umode_t mode``h]j)}(hjph]h umode_t mode}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjjubj2)}(hhh]h)}(h new file modeh]h new file mode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``dev_t dev`` device number h](j)}(h ``dev_t dev``h]j)}(hjh]h dev_t dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h device numberh]h device number}(hj¼hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjٻubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjٻubh)}(hCheck permissions when creating a special file (or a socket or a fifo file created via the mknod system call). Note that if mknod operation is being done for a regular file, then the create hook will be called and not this hook.h]hCheck permissions when creating a special file (or a socket or a fifo file created via the mknod system call). Note that if mknod operation is being done for a regular file, then the create hook will be called and not this hook.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjٻubh)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjٻubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjٻubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_inode_rename (C function)c.security_inode_renamehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hint security_inode_rename (struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry, unsigned int flags)h]j)}(hint security_inode_rename(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry, unsigned int flags)h](j )}(hinth]hint}(hjPhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLhhhj^hMubj{)}(hsecurity_inode_renameh]j)}(hsecurity_inode_renameh]hsecurity_inode_rename}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjLhhhj^hMubj)}(hx(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry, unsigned int flags)h](j)}(hstruct inode *old_dirh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jssbc.security_inode_renameasbuh1hhjubj2)}(h h]h }(hj˽hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjٽhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hold_dirh]hold_dir}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *old_dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jǽc.security_inode_renameasbuh1hhjubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h old_dentryh]h old_dentry}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct inode *new_dirh](j)}(hjAh]hstruct}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jǽc.security_inode_renameasbuh1hhjkubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(hnew_dirh]hnew_dir}(hjƾhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *new_dentryh](j)}(hjAh]hstruct}(hj߾hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj۾ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj۾ubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jǽc.security_inode_renameasbuh1hhj۾ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj۾ubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj۾ubj)}(h new_dentryh]h new_dentry}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj۾ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int flagsh](j )}(hunsignedh]hunsigned}(hjOhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjKubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubj )}(hinth]hint}(hjkhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjKubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjLhhhj^hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjHhhhj^hMubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1jhj^hMhjEhhubj)}(hhh]h)}(h#Check if renaming a file is allowedh]h#Check if renaming a file is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjEhhhj^hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjɿjjɿjjjuh1jhhhj%hNhNubj)}(hX}**Parameters** ``struct inode *old_dir`` parent directory of the old file ``struct dentry *old_dentry`` the old file ``struct inode *new_dir`` parent directory of the new file ``struct dentry *new_dentry`` the new file ``unsigned int flags`` flags **Description** Check for permission to rename a file or directory. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjӿh]h Parameters}(hjտhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjѿubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjͿubj )}(hhh](j)}(h;``struct inode *old_dir`` parent directory of the old file h](j)}(h``struct inode *old_dir``h]j)}(hjh]hstruct inode *old_dir}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h parent directory of the old fileh]h parent directory of the old file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h+``struct dentry *old_dentry`` the old file h](j)}(h``struct dentry *old_dentry``h]j)}(hj+h]hstruct dentry *old_dentry}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj%ubj2)}(hhh]h)}(h the old fileh]h the old file}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhjAubah}(h]h ]h"]h$]h&]uh1j1hj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhjubj)}(h;``struct inode *new_dir`` parent directory of the new file h](j)}(h``struct inode *new_dir``h]j)}(hjdh]hstruct inode *new_dir}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj^ubj2)}(hhh]h)}(h parent directory of the new fileh]h parent directory of the new file}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhMhjzubah}(h]h ]h"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjubj)}(h+``struct dentry *new_dentry`` the new file h](j)}(h``struct dentry *new_dentry``h]j)}(hjh]hstruct dentry *new_dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h the new fileh]h the new file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``unsigned int flags`` flags h](j)}(h``unsigned int flags``h]j)}(hjh]hunsigned int flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjͿubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjͿubh)}(h3Check for permission to rename a file or directory.h]h3Check for permission to rename a file or directory.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjͿubh)}(h **Return**h]j)}(hj8h]hReturn}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjͿubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjͿubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_inode_readlink (C function)c.security_inode_readlinkhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h3int security_inode_readlink (struct dentry *dentry)h]j)}(h2int security_inode_readlink(struct dentry *dentry)h](j )}(hinth]hint}(hj}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjyhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyhhhjhMubj{)}(hsecurity_inode_readlinkh]j)}(hsecurity_inode_readlinkh]hsecurity_inode_readlink}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjyhhhjhMubj)}(h(struct dentry *dentry)h]j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_readlinkasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjyhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjuhhhjhMubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjrhhubj)}(hhh]h)}(h+Check if reading a symbolic link is allowedh]h+Check if reading a symbolic link is allowed}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj:hhubah}(h]h ]h"]h$]h&]uh1jhjrhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjUjjUjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct dentry *dentry`` link **Description** Check the permission to read the symbolic link. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj_h]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjYubj )}(hhh]j)}(h``struct dentry *dentry`` link h](j)}(h``struct dentry *dentry``h]j)}(hj~h]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjxubj2)}(hhh]h)}(hlinkh]hlink}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjxubeh}(h]h ]h"]h$]h&]uh1jhjhMhjuubah}(h]h ]h"]h$]h&]uh1j hjYubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjYubh)}(h/Check the permission to read the symbolic link.h]h/Check the permission to read the symbolic link.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjYubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjYubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjYubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_inode_follow_link (C function)c.security_inode_follow_linkhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hUint security_inode_follow_link (struct dentry *dentry, struct inode *inode, bool rcu)h]j)}(hTint security_inode_follow_link(struct dentry *dentry, struct inode *inode, bool rcu)h](j )}(hinth]hint}(hj%hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!hhhj3hMubj{)}(hsecurity_inode_follow_linkh]j)}(hsecurity_inode_follow_linkh]hsecurity_inode_follow_link}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj!hhhj3hMubj)}(h6(struct dentry *dentry, struct inode *inode, bool rcu)h](j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jHsbc.security_inode_follow_linkasbuh1hhj^ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_inode_follow_linkasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinodeh]hinode}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hbool rcuh](j )}(hj8h]hbool}(hjDhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj@ubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@ubj)}(hrcuh]hrcu}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubeh}(h]h ]h"]h$]h&]jjuh1jhj!hhhj3hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj3hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj3hMhjhhubj)}(hhh]h)}(h-Check if following a symbolic link is allowedh]h-Check if following a symbolic link is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj3hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX>**Parameters** ``struct dentry *dentry`` link dentry ``struct inode *inode`` link inode ``bool rcu`` true if in RCU-walk mode **Description** Check permission to follow a symbolic link when looking up a pathname. If **rcu** is true, **inode** is not stable. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h&``struct dentry *dentry`` link dentry h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h link dentryh]h link dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h#``struct inode *inode`` link inode h](j)}(h``struct inode *inode``h]j)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h link inodeh]h link inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h&``bool rcu`` true if in RCU-walk mode h](j)}(h ``bool rcu``h]j)}(hj<h]hbool rcu}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj6ubj2)}(hhh]h)}(htrue if in RCU-walk modeh]htrue if in RCU-walk mode}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMhjRubah}(h]h ]h"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjwh]h Description}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(htCheck permission to follow a symbolic link when looking up a pathname. If **rcu** is true, **inode** is not stable.h](hKCheck permission to follow a symbolic link when looking up a pathname. If }(hjhhhNhNubj)}(h**rcu**h]hrcu}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is true, }(hjhhhNhNubj)}(h **inode**h]hinode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is not stable.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_inode_permission (C function)c.security_inode_permissionhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h=int security_inode_permission (struct inode *inode, int mask)h]j)}(hah"]h$]h&]uh1j1hjhhhjhM!ubj{)}(hsecurity_inode_permissionh]j)}(hsecurity_inode_permissionh]hsecurity_inode_permission}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM!ubj)}(h(struct inode *inode, int mask)h](j)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@ubh)}(hhh]j)}(hinodeh]hinode}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjdmodnameN classnameNj] j` )}jc ]jf )}jY j*sbc.security_inode_permissionasbuh1hhj@ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<ubj)}(hint maskh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hmaskh]hmask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM!ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM!ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM!hjhhubj)}(hhh]h)}(h&Check if accessing an inode is allowedh]h&Check if accessing an inode is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM!hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM!ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX'**Parameters** ``struct inode *inode`` inode ``int mask`` access mask **Description** Check permission before accessing an inode. This hook is called by the existing Linux permission function, so a security module can use it to provide additional checking for existing Linux permission checks. Notice that this hook is called when a file is opened (as well as many other operations), whereas the file_security_ops permission hook is called when the actual read/write operations are performed. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM%hjubj )}(hhh](j)}(h``struct inode *inode`` inode h](j)}(h``struct inode *inode``h]j)}(hj=h]hstruct inode *inode}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM"hj7ubj2)}(hhh]h)}(hinodeh]hinode}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhM"hjSubah}(h]h ]h"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhM"hj4ubj)}(h``int mask`` access mask h](j)}(h ``int mask``h]j)}(hjvh]hint mask}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM#hjpubj2)}(hhh]h)}(h access maskh]h access mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM#hjubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhjhM#hj4ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM%hjubh)}(hXCheck permission before accessing an inode. This hook is called by the existing Linux permission function, so a security module can use it to provide additional checking for existing Linux permission checks. Notice that this hook is called when a file is opened (as well as many other operations), whereas the file_security_ops permission hook is called when the actual read/write operations are performed.h]hXCheck permission before accessing an inode. This hook is called by the existing Linux permission function, so a security module can use it to provide additional checking for existing Linux permission checks. Notice that this hook is called when a file is opened (as well as many other operations), whereas the file_security_ops permission hook is called when the actual read/write operations are performed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM$hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM+hjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM,hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_inode_post_setattr (C function)c.security_inode_post_setattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h_void security_inode_post_setattr (struct mnt_idmap *idmap, struct dentry *dentry, int ia_valid)h]j)}(h^void security_inode_post_setattr(struct mnt_idmap *idmap, struct dentry *dentry, int ia_valid)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMLubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj+hMLubj{)}(hsecurity_inode_post_setattrh]j)}(hsecurity_inode_post_setattrh]hsecurity_inode_post_setattr}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj+hMLubj)}(h>(struct mnt_idmap *idmap, struct dentry *dentry, int ia_valid)h](j)}(hstruct mnt_idmap *idmaph](j)}(hjAh]hstruct}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubh)}(hhh]j)}(h mnt_idmaph]h mnt_idmap}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjzmodnameN classnameNj] j` )}jc ]jf )}jY j@sbc.security_inode_post_setattrasbuh1hhjVubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj)}(hidmaph]hidmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjRubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_inode_post_setattrasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjRubj)}(h int ia_validh](j )}(hinth]hint}(hj<hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj8ubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubj)}(hia_validh]hia_valid}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjRubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj+hMLubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj+hMLubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj+hMLhjhhubj)}(hhh]h)}(h*Update the inode after a setattr operationh]h*Update the inode after a setattr operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMLhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj+hMLubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct mnt_idmap *idmap`` idmap of the mount ``struct dentry *dentry`` file ``int ia_valid`` file attributes set **Description** Update inode security field after successful setting file attributes.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMPhjubj )}(hhh](j)}(h/``struct mnt_idmap *idmap`` idmap of the mount h](j)}(h``struct mnt_idmap *idmap``h]j)}(hjh]hstruct mnt_idmap *idmap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMMhjubj2)}(hhh]h)}(hidmap of the mounth]hidmap of the mount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMMhjubj)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMNhjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMNhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMNhjubj)}(h%``int ia_valid`` file attributes set h](j)}(h``int ia_valid``h]j)}(hj5h]h int ia_valid}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMOhj/ubj2)}(hhh]h)}(hfile attributes seth]hfile attributes set}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMOhjKubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhjJhMOhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjph]h Description}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMQhjubh)}(hEUpdate inode security field after successful setting file attributes.h]hEUpdate inode security field after successful setting file attributes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMPhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_inode_getattr (C function)c.security_inode_getattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h4int security_inode_getattr (const struct path *path)h]j)}(h3int security_inode_getattr(const struct path *path)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM\ubj{)}(hsecurity_inode_getattrh]j)}(hsecurity_inode_getattrh]hsecurity_inode_getattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM\ubj)}(h(const struct path *path)h]j)}(hconst struct path *pathh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hpathh]hpath}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj-modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_getattrasbuh1hhjubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpathh]hpath}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM\ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM\ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM\hjhhubj)}(hhh]h)}(h+Check if getting file attributes is allowedh]h+Check if getting file attributes is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM\ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``const struct path *path`` file **Description** Check permission before obtaining file attributes. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM`hjubj )}(hhh]j)}(h!``const struct path *path`` file h](j)}(h``const struct path *path``h]j)}(hjh]hconst struct path *path}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM]hjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM]hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM]hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM_hjubh)}(h2Check permission before obtaining file attributes.h]h2Check permission before obtaining file attributes.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM^hjubh)}(h **Return**h]j)}(hj3h]hReturn}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM`hjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMahjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_inode_setxattr (C function)c.security_inode_setxattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hint security_inode_setxattr (struct mnt_idmap *idmap, struct dentry *dentry, const char *name, const void *value, size_t size, int flags)h]j)}(hint security_inode_setxattr(struct mnt_idmap *idmap, struct dentry *dentry, const char *name, const void *value, size_t size, int flags)h](j )}(hinth]hint}(hjxhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjthhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMkubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjthhhjhMkubj{)}(hsecurity_inode_setxattrh]j)}(hsecurity_inode_setxattrh]hsecurity_inode_setxattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjthhhjhMkubj)}(hm(struct mnt_idmap *idmap, struct dentry *dentry, const char *name, const void *value, size_t size, int flags)h](j)}(hstruct mnt_idmap *idmaph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h mnt_idmaph]h mnt_idmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_setxattrasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidmaph]hidmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#ubh)}(hhh]j)}(hdentryh]hdentry}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjGmodnameN classnameNj] j` )}jc ]jc.security_inode_setxattrasbuh1hhj#ubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#ubj)}(hjh]h*}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(hdentryh]hdentry}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst void *valueh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hvalueh]hvalue}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjVmodnameN classnameNj] j` )}jc ]jc.security_inode_setxattrasbuh1hhjMubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int flagsh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjthhhjhMkubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjphhhjhMkubah}(h]jkah ](jjeh"]h$]h&]jj)jhuh1jhjhMkhjmhhubj)}(hhh]h)}(h'Check if setting file xattrs is allowedh]h'Check if setting file xattrs is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMkhjhhubah}(h]h ]h"]h$]h&]uh1jhjmhhhjhMkubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct mnt_idmap *idmap`` idmap of the mount ``struct dentry *dentry`` file ``const char *name`` xattr name ``const void *value`` xattr value ``size_t size`` size of xattr value ``int flags`` flags **Description** This hook performs the desired permission checks before setting the extended attributes (xattrs) on **dentry**. It is important to note that we have some additional logic before the main LSM implementation calls to detect if we need to perform an additional capability check at the LSM layer. Normally we enforce a capability check prior to executing the various LSM hook implementations, but if a LSM wants to avoid this capability check, it can register a 'inode_xattr_skipcap' hook and return a value of 1 for xattrs that it wants to avoid the capability check, leaving the LSM fully responsible for enforcing the access control for the specific xattr. If all of the enabled LSMs refrain from registering a 'inode_xattr_skipcap' hook, or return a 0 (the default return value), the capability check is still performed. If no 'inode_xattr_skipcap' hooks are registered the capability check is performed. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMohjubj )}(hhh](j)}(h/``struct mnt_idmap *idmap`` idmap of the mount h](j)}(h``struct mnt_idmap *idmap``h]j)}(hj h]hstruct mnt_idmap *idmap}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMlhjubj2)}(hhh]h)}(hidmap of the mounth]hidmap of the mount}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMlhj6ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj5hMlhjubj)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjYh]hstruct dentry *dentry}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMmhjSubj2)}(hhh]h)}(hfileh]hfile}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhMmhjoubah}(h]h ]h"]h$]h&]uh1j1hjSubeh}(h]h ]h"]h$]h&]uh1jhjnhMmhjubj)}(h ``const char *name`` xattr name h](j)}(h``const char *name``h]j)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMnhjubj2)}(hhh]h)}(h xattr nameh]h xattr name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMnhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMnhjubj)}(h"``const void *value`` xattr value h](j)}(h``const void *value``h]j)}(hjh]hconst void *value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMohjubj2)}(hhh]h)}(h xattr valueh]h xattr value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMohjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMohjubj)}(h$``size_t size`` size of xattr value h](j)}(h``size_t size``h]j)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMphjubj2)}(hhh]h)}(hsize of xattr valueh]hsize of xattr value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMphjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMphjubj)}(h``int flags`` flags h](j)}(h ``int flags``h]j)}(hj=h]h int flags}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMqhj7ubj2)}(hhh]h)}(hflagsh]hflags}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMqhjSubah}(h]h ]h"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhMqhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjxh]h Description}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMshjubh)}(hX%This hook performs the desired permission checks before setting the extended attributes (xattrs) on **dentry**. It is important to note that we have some additional logic before the main LSM implementation calls to detect if we need to perform an additional capability check at the LSM layer.h](hdThis hook performs the desired permission checks before setting the extended attributes (xattrs) on }(hjhhhNhNubj)}(h **dentry**h]hdentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. It is important to note that we have some additional logic before the main LSM implementation calls to detect if we need to perform an additional capability check at the LSM layer.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMrhjubh)}(hXeNormally we enforce a capability check prior to executing the various LSM hook implementations, but if a LSM wants to avoid this capability check, it can register a 'inode_xattr_skipcap' hook and return a value of 1 for xattrs that it wants to avoid the capability check, leaving the LSM fully responsible for enforcing the access control for the specific xattr. If all of the enabled LSMs refrain from registering a 'inode_xattr_skipcap' hook, or return a 0 (the default return value), the capability check is still performed. If no 'inode_xattr_skipcap' hooks are registered the capability check is performed.h]hXqNormally we enforce a capability check prior to executing the various LSM hook implementations, but if a LSM wants to avoid this capability check, it can register a ‘inode_xattr_skipcap’ hook and return a value of 1 for xattrs that it wants to avoid the capability check, leaving the LSM fully responsible for enforcing the access control for the specific xattr. If all of the enabled LSMs refrain from registering a ‘inode_xattr_skipcap’ hook, or return a 0 (the default return value), the capability check is still performed. If no ‘inode_xattr_skipcap’ hooks are registered the capability check is performed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMwhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_inode_set_acl (C function)c.security_inode_set_aclhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hyint security_inode_set_acl (struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name, struct posix_acl *kacl)h]j)}(hxint security_inode_set_acl(struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name, struct posix_acl *kacl)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inode_set_aclh]j)}(hsecurity_inode_set_aclh]hsecurity_inode_set_acl}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h^(struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name, struct posix_acl *kacl)h](j)}(hstruct mnt_idmap *idmaph](j)}(hjAh]hstruct}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hjOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubh)}(hhh]j)}(h mnt_idmaph]h mnt_idmap}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjbmodnameN classnameNj] j` )}jc ]jf )}jY j(sbc.security_inode_set_aclasbuh1hhj>ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hidmaph]hidmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j|c.security_inode_set_aclasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hconst char *acl_nameh](j)}(hjh]hconst}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hcharh]hchar}(hj?hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hacl_nameh]hacl_name}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hstruct posix_acl *kaclh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubh)}(hhh]j)}(h posix_aclh]h posix_acl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j|c.security_inode_set_aclasbuh1hhj}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj)}(hkaclh]hkacl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h&Check if setting posix acls is allowedh]h&Check if setting posix acls is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hXZ**Parameters** ``struct mnt_idmap *idmap`` idmap of the mount ``struct dentry *dentry`` file ``const char *acl_name`` acl name ``struct posix_acl *kacl`` acl struct **Description** Check permission before setting posix acls, the posix acls in **kacl** are identified by **acl_name**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h/``struct mnt_idmap *idmap`` idmap of the mount h](j)}(h``struct mnt_idmap *idmap``h]j)}(hjCh]hstruct mnt_idmap *idmap}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj=ubj2)}(hhh]h)}(hidmap of the mounth]hidmap of the mount}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMhjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhMhj:ubj)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hj|h]hstruct dentry *dentry}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjvubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhMhj:ubj)}(h"``const char *acl_name`` acl name h](j)}(h``const char *acl_name``h]j)}(hjh]hconst char *acl_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hacl nameh]hacl name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj:ubj)}(h&``struct posix_acl *kacl`` acl struct h](j)}(h``struct posix_acl *kacl``h]j)}(hjh]hstruct posix_acl *kacl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h acl structh]h acl struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj:ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj)h]h Description}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hfCheck permission before setting posix acls, the posix acls in **kacl** are identified by **acl_name**.h](h>Check permission before setting posix acls, the posix acls in }(hj?hhhNhNubj)}(h**kacl**h]hkacl}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh are identified by }(hj?hhhNhNubj)}(h **acl_name**h]hacl_name}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjth]hReturn}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_inode_post_set_acl (C function)c.security_inode_post_set_aclhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hfvoid security_inode_post_set_acl (struct dentry *dentry, const char *acl_name, struct posix_acl *kacl)h]j)}(hevoid security_inode_post_set_acl(struct dentry *dentry, const char *acl_name, struct posix_acl *kacl)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inode_post_set_aclh]j)}(hsecurity_inode_post_set_aclh]hsecurity_inode_post_set_acl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hE(struct dentry *dentry, const char *acl_name, struct posix_acl *kacl)h](j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_post_set_aclasbuh1hhjubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *acl_nameh](j)}(hjh]hconst}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hacl_nameh]hacl_name}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct posix_acl *kaclh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h posix_aclh]h posix_acl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j0c.security_inode_post_set_aclasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hkaclh]hkacl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h)Update inode security from posix acls seth]h)Update inode security from posix acls set}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjChhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj^jj^jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct dentry *dentry`` file ``const char *acl_name`` acl name ``struct posix_acl *kacl`` acl struct **Description** Update inode security data after successfully setting posix acls on **dentry**. The posix acls in **kacl** are identified by **acl_name**.h](h)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjbubj )}(hhh](j)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj~ubj)}(h"``const char *acl_name`` acl name h](j)}(h``const char *acl_name``h]j)}(hjh]hconst char *acl_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hacl nameh]hacl name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj~ubj)}(h&``struct posix_acl *kacl`` acl struct h](j)}(h``struct posix_acl *kacl``h]j)}(hjh]hstruct posix_acl *kacl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h acl structh]h acl struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj~ubeh}(h]h ]h"]h$]h&]uh1j hjbubh)}(h**Description**h]j)}(hj4h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjbubh)}(hUpdate inode security data after successfully setting posix acls on **dentry**. The posix acls in **kacl** are identified by **acl_name**.h](hDUpdate inode security data after successfully setting posix acls on }(hjJhhhNhNubj)}(h **dentry**h]hdentry}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh. The posix acls in }(hjJhhhNhNubj)}(h**kacl**h]hkacl}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh are identified by }(hjJhhhNhNubj)}(h **acl_name**h]hacl_name}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh.}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_inode_get_acl (C function)c.security_inode_get_aclhNtauh1hhj%hhhNhNubj)}(hhh](j)}(haint security_inode_get_acl (struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name)h]j)}(h`int security_inode_get_acl(struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inode_get_aclh]j)}(hsecurity_inode_get_aclh]hsecurity_inode_get_acl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hF(struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name)h](j)}(hstruct mnt_idmap *idmaph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h mnt_idmaph]h mnt_idmap}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_get_aclasbuh1hhjubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidmaph]hidmap}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj2)}(h h]h }(hjkhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubh)}(hhh]j)}(hdentryh]hdentry}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj~modnameN classnameNj] j` )}jc ]j&c.security_inode_get_aclasbuh1hhjZubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *acl_nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hacl_nameh]hacl_name}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h&Check if reading posix acls is allowedh]h&Check if reading posix acls is allowed}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj9hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjTjjTjjjuh1jhhhj%hNhNubj)}(hX$**Parameters** ``struct mnt_idmap *idmap`` idmap of the mount ``struct dentry *dentry`` file ``const char *acl_name`` acl name **Description** Check permission before getting osix acls, the posix acls are identified by **acl_name**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj^h]h Parameters}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjXubj )}(hhh](j)}(h/``struct mnt_idmap *idmap`` idmap of the mount h](j)}(h``struct mnt_idmap *idmap``h]j)}(hj}h]hstruct mnt_idmap *idmap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjwubj2)}(hhh]h)}(hidmap of the mounth]hidmap of the mount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjwubeh}(h]h ]h"]h$]h&]uh1jhjhMhjtubj)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjtubj)}(h"``const char *acl_name`` acl name h](j)}(h``const char *acl_name``h]j)}(hjh]hconst char *acl_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hacl nameh]hacl name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjtubeh}(h]h ]h"]h$]h&]uh1j hjXubh)}(h**Description**h]j)}(hj*h]h Description}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjXubh)}(hYCheck permission before getting osix acls, the posix acls are identified by **acl_name**.h](hLCheck permission before getting osix acls, the posix acls are identified by }(hj@hhhNhNubj)}(h **acl_name**h]hacl_name}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubh.}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjXubh)}(h **Return**h]j)}(hjch]hReturn}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjXubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_inode_remove_acl (C function)c.security_inode_remove_aclhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hdint security_inode_remove_acl (struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name)h]j)}(hcint security_inode_remove_acl(struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inode_remove_aclh]j)}(hsecurity_inode_remove_aclh]hsecurity_inode_remove_acl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hF(struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name)h](j)}(hstruct mnt_idmap *idmaph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h mnt_idmaph]h mnt_idmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_remove_aclasbuh1hhjubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidmaph]hidmap}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubh)}(hhh]j)}(hdentryh]hdentry}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjwmodnameN classnameNj] j` )}jc ]jc.security_inode_remove_aclasbuh1hhjSubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *acl_nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hacl_nameh]hacl_name}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h(Check if removing a posix acl is allowedh]h(Check if removing a posix acl is allowed}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj2hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjMjjMjjjuh1jhhhj%hNhNubj)}(hX&**Parameters** ``struct mnt_idmap *idmap`` idmap of the mount ``struct dentry *dentry`` file ``const char *acl_name`` acl name **Description** Check permission before removing posix acls, the posix acls are identified by **acl_name**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjWh]h Parameters}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjQubj )}(hhh](j)}(h/``struct mnt_idmap *idmap`` idmap of the mount h](j)}(h``struct mnt_idmap *idmap``h]j)}(hjvh]hstruct mnt_idmap *idmap}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjpubj2)}(hhh]h)}(hidmap of the mounth]hidmap of the mount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhjhMhjmubj)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjmubj)}(h"``const char *acl_name`` acl name h](j)}(h``const char *acl_name``h]j)}(hjh]hconst char *acl_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hacl nameh]hacl name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjmubeh}(h]h ]h"]h$]h&]uh1j hjQubh)}(h**Description**h]j)}(hj#h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjQubh)}(h[Check permission before removing posix acls, the posix acls are identified by **acl_name**.h](hNCheck permission before removing posix acls, the posix acls are identified by }(hj9hhhNhNubj)}(h **acl_name**h]hacl_name}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubh.}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjQubh)}(h **Return**h]j)}(hj\h]hReturn}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjQubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjQubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j +security_inode_post_remove_acl (C function) c.security_inode_post_remove_aclhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hjvoid security_inode_post_remove_acl (struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name)h]j)}(hivoid security_inode_post_remove_acl(struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inode_post_remove_aclh]j)}(hsecurity_inode_post_remove_aclh]hsecurity_inode_post_remove_acl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hF(struct mnt_idmap *idmap, struct dentry *dentry, const char *acl_name)h](j)}(hstruct mnt_idmap *idmaph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h mnt_idmaph]h mnt_idmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.security_inode_post_remove_aclasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidmaph]hidmap}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubh)}(hhh]j)}(hdentryh]hdentry}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjpmodnameN classnameNj] j` )}jc ]j c.security_inode_post_remove_aclasbuh1hhjLubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *acl_nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hacl_nameh]hacl_name}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h)Update inode security after rm posix aclsh]h)Update inode security after rm posix acls}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj+hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjFjjFjjjuh1jhhhj%hNhNubj)}(hX&**Parameters** ``struct mnt_idmap *idmap`` idmap of the mount ``struct dentry *dentry`` file ``const char *acl_name`` acl name **Description** Update inode security data after successfully removing posix acls on **dentry** in **idmap**. The posix acls are identified by **acl_name**.h](h)}(h**Parameters**h]j)}(hjPh]h Parameters}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJubj )}(hhh](j)}(h/``struct mnt_idmap *idmap`` idmap of the mount h](j)}(h``struct mnt_idmap *idmap``h]j)}(hjoh]hstruct mnt_idmap *idmap}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjiubj2)}(hhh]h)}(hidmap of the mounth]hidmap of the mount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjiubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubj)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubj)}(h"``const char *acl_name`` acl name h](j)}(h``const char *acl_name``h]j)}(hjh]hconst char *acl_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hacl nameh]hacl name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubeh}(h]h ]h"]h$]h&]uh1j hjJubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJubh)}(hUpdate inode security data after successfully removing posix acls on **dentry** in **idmap**. The posix acls are identified by **acl_name**.h](hEUpdate inode security data after successfully removing posix acls on }(hj2hhhNhNubj)}(h **dentry**h]hdentry}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh in }(hj2hhhNhNubj)}(h **idmap**h]hidmap}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh#. The posix acls are identified by }(hj2hhhNhNubj)}(h **acl_name**h]hacl_name}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )security_inode_post_setxattr (C function)c.security_inode_post_setxattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hvvoid security_inode_post_setxattr (struct dentry *dentry, const char *name, const void *value, size_t size, int flags)h]j)}(huvoid security_inode_post_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inode_post_setxattrh]j)}(hsecurity_inode_post_setxattrh]hsecurity_inode_post_setxattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hT(struct dentry *dentry, const char *name, const void *value, size_t size, int flags)h](j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_post_setxattrasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *nameh](j)}(hjh]hconst}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj )}(hcharh]hchar}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst void *valueh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hvalueh]hvalue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_inode_post_setxattrasbuh1hhjubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int flagsh](j )}(hinth]hint}(hjHhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjDubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDubj)}(hflagsh]hflags}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h+Update the inode after a setxattr operationh]h+Update the inode after a setxattr operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct dentry *dentry`` file ``const char *name`` xattr name ``const void *value`` xattr value ``size_t size`` xattr value size ``int flags`` flags **Description** Update inode security field after successful setxattr operation.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h ``const char *name`` xattr name h](j)}(h``const char *name``h]j)}(hjh]hconst char *name}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h xattr nameh]h xattr name}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h"``const void *value`` xattr value h](j)}(h``const void *value``h]j)}(hjAh]hconst void *value}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj;ubj2)}(hhh]h)}(h xattr valueh]h xattr value}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjWubah}(h]h ]h"]h$]h&]uh1j1hj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhMhjubj)}(h!``size_t size`` xattr value size h](j)}(h``size_t size``h]j)}(hjzh]h size_t size}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjtubj2)}(hhh]h)}(hxattr value sizeh]hxattr value size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjtubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``int flags`` flags h](j)}(h ``int flags``h]j)}(hjh]h int flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h@Update inode security field after successful setxattr operation.h]h@Update inode security field after successful setxattr operation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_inode_getxattr (C function)c.security_inode_getxattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hEint security_inode_getxattr (struct dentry *dentry, const char *name)h]j)}(hDint security_inode_getxattr(struct dentry *dentry, const char *name)h](j )}(hinth]hint}(hj3hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj/hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/hhhjAhMubj{)}(hsecurity_inode_getxattrh]j)}(hsecurity_inode_getxattrh]hsecurity_inode_getxattr}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj/hhhjAhMubj)}(h)(struct dentry *dentry, const char *name)h](j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jVsbc.security_inode_getxattrasbuh1hhjlubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubj)}(hconst char *nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnameh]hname}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubeh}(h]h ]h"]h$]h&]jjuh1jhj/hhhjAhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj+hhhjAhMubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1jhjAhMhj(hhubj)}(hhh]h)}(h Check if xattr access is allowedh]h Check if xattr access is allowed}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjMhhubah}(h]h ]h"]h$]h&]uh1jhj(hhhjAhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjhjjhjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct dentry *dentry`` file ``const char *name`` xattr name **Description** Check permission before obtaining the extended attributes identified by **name** for **dentry**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjrh]h Parameters}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjlubj )}(hhh](j)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h ``const char *name`` xattr name h](j)}(h``const char *name``h]j)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(h xattr nameh]h xattr name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1j hjlubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjlubh)}(h`Check permission before obtaining the extended attributes identified by **name** for **dentry**.h](hHCheck permission before obtaining the extended attributes identified by }(hjhhhNhNubj)}(h**name**h]hname}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh for }(hjhhhNhNubj)}(h **dentry**h]hdentry}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjlubh)}(h **Return**h]j)}(hjPh]hReturn}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjlubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjlubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_inode_listxattr (C function)c.security_inode_listxattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h4int security_inode_listxattr (struct dentry *dentry)h]j)}(h3int security_inode_listxattr(struct dentry *dentry)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inode_listxattrh]j)}(hsecurity_inode_listxattrh]hsecurity_inode_listxattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct dentry *dentry)h]j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_listxattrasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h"Check if listing xattrs is allowedh]h"Check if listing xattrs is allowed}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjRhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjmjjmjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct dentry *dentry`` file **Description** Check permission before obtaining the list of extended attribute names for **dentry**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjwh]h Parameters}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjqubj )}(hhh]j)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjqubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjqubh)}(hVCheck permission before obtaining the list of extended attribute names for **dentry**.h](hKCheck permission before obtaining the list of extended attribute names for }(hjhhhNhNubj)}(h **dentry**h]hdentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjqubh)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjqubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjqubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_inode_removexattr (C function)c.security_inode_removexattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(haint security_inode_removexattr (struct mnt_idmap *idmap, struct dentry *dentry, const char *name)h]j)}(h`int security_inode_removexattr(struct mnt_idmap *idmap, struct dentry *dentry, const char *name)h](j )}(hinth]hint}(hjOhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjKhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM)ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKhhhj]hM)ubj{)}(hsecurity_inode_removexattrh]j)}(hsecurity_inode_removexattrh]hsecurity_inode_removexattr}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjKhhhj]hM)ubj)}(hB(struct mnt_idmap *idmap, struct dentry *dentry, const char *name)h](j)}(hstruct mnt_idmap *idmaph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h mnt_idmaph]h mnt_idmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jrsbc.security_inode_removexattrasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidmaph]hidmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_inode_removexattrasbuh1hhjubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *nameh](j)}(hjh]hconst}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjKhhhj]hM)ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjGhhhj]hM)ubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jhj]hM)hjDhhubj)}(hhh]h)}(h%Check if removing an xattr is allowedh]h%Check if removing an xattr is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM)hjhhubah}(h]h ]h"]h$]h&]uh1jhjDhhhj]hM)ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hXU**Parameters** ``struct mnt_idmap *idmap`` idmap of the mount ``struct dentry *dentry`` file ``const char *name`` xattr name **Description** This hook performs the desired permission checks before setting the extended attributes (xattrs) on **dentry**. It is important to note that we have some additional logic before the main LSM implementation calls to detect if we need to perform an additional capability check at the LSM layer. Normally we enforce a capability check prior to executing the various LSM hook implementations, but if a LSM wants to avoid this capability check, it can register a 'inode_xattr_skipcap' hook and return a value of 1 for xattrs that it wants to avoid the capability check, leaving the LSM fully responsible for enforcing the access control for the specific xattr. If all of the enabled LSMs refrain from registering a 'inode_xattr_skipcap' hook, or return a 0 (the default return value), the capability check is still performed. If no 'inode_xattr_skipcap' hooks are registered the capability check is performed. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM-hjubj )}(hhh](j)}(h/``struct mnt_idmap *idmap`` idmap of the mount h](j)}(h``struct mnt_idmap *idmap``h]j)}(hjh]hstruct mnt_idmap *idmap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM*hjubj2)}(hhh]h)}(hidmap of the mounth]hidmap of the mount}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hM*hj3ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj2hM*hjubj)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjVh]hstruct dentry *dentry}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM+hjPubj2)}(hhh]h)}(hfileh]hfile}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhM+hjlubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhjkhM+hjubj)}(h ``const char *name`` xattr name h](j)}(h``const char *name``h]j)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM,hjubj2)}(hhh]h)}(h xattr nameh]h xattr name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM,hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM,hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM.hjubh)}(hX%This hook performs the desired permission checks before setting the extended attributes (xattrs) on **dentry**. It is important to note that we have some additional logic before the main LSM implementation calls to detect if we need to perform an additional capability check at the LSM layer.h](hdThis hook performs the desired permission checks before setting the extended attributes (xattrs) on }(hjhhhNhNubj)}(h **dentry**h]hdentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. It is important to note that we have some additional logic before the main LSM implementation calls to detect if we need to perform an additional capability check at the LSM layer.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM-hjubh)}(hXeNormally we enforce a capability check prior to executing the various LSM hook implementations, but if a LSM wants to avoid this capability check, it can register a 'inode_xattr_skipcap' hook and return a value of 1 for xattrs that it wants to avoid the capability check, leaving the LSM fully responsible for enforcing the access control for the specific xattr. If all of the enabled LSMs refrain from registering a 'inode_xattr_skipcap' hook, or return a 0 (the default return value), the capability check is still performed. If no 'inode_xattr_skipcap' hooks are registered the capability check is performed.h]hXqNormally we enforce a capability check prior to executing the various LSM hook implementations, but if a LSM wants to avoid this capability check, it can register a ‘inode_xattr_skipcap’ hook and return a value of 1 for xattrs that it wants to avoid the capability check, leaving the LSM fully responsible for enforcing the access control for the specific xattr. If all of the enabled LSMs refrain from registering a ‘inode_xattr_skipcap’ hook, or return a 0 (the default return value), the capability check is still performed. If no ‘inode_xattr_skipcap’ hooks are registered the capability check is performed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM2hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM<hjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM=hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ,security_inode_post_removexattr (C function)!c.security_inode_post_removexattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hNvoid security_inode_post_removexattr (struct dentry *dentry, const char *name)h]j)}(hMvoid security_inode_post_removexattr(struct dentry *dentry, const char *name)h](j )}(hvoidh]hvoid}(hjWhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjShhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMRubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjShhhjehMRubj{)}(hsecurity_inode_post_removexattrh]j)}(hsecurity_inode_post_removexattrh]hsecurity_inode_post_removexattr}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjShhhjehMRubj)}(h)(struct dentry *dentry, const char *name)h](j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jzsb!c.security_inode_post_removexattrasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnameh]hname}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjShhhjehMRubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjOhhhjehMRubah}(h]jJah ](jjeh"]h$]h&]jj)jhuh1jhjehMRhjLhhubj)}(hhh]h)}(h'Update the inode after a removexattr oph]h'Update the inode after a removexattr op}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMRhjqhhubah}(h]h ]h"]h$]h&]uh1jhjLhhhjehMRubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct dentry *dentry`` file ``const char *name`` xattr name **Description** Update the inode after a successful removexattr operation.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMVhjubj )}(hhh](j)}(h``struct dentry *dentry`` file h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMShjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMShjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMShjubj)}(h ``const char *name`` xattr name h](j)}(h``const char *name``h]j)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMThjubj2)}(hhh]h)}(h xattr nameh]h xattr name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMThjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMThjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj)h]h Description}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMVhjubh)}(h:Update the inode after a successful removexattr operation.h]h:Update the inode after a successful removexattr operation.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMUhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_inode_file_setattr (C function)c.security_inode_file_setattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hNint security_inode_file_setattr (struct dentry *dentry, struct file_kattr *fa)h]j)}(hMint security_inode_file_setattr(struct dentry *dentry, struct file_kattr *fa)h](j )}(hinth]hint}(hjnhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM`ubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjhhhj|hM`ubj{)}(hsecurity_inode_file_setattrh]j)}(hsecurity_inode_file_setattrh]hsecurity_inode_file_setattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjjhhhj|hM`ubj)}(h.(struct dentry *dentry, struct file_kattr *fa)h](j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_file_setattrasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct file_kattr *fah](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h file_kattrh]h file_kattr}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj=modnameN classnameNj] j` )}jc ]jc.security_inode_file_setattrasbuh1hhjubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfah]hfa}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjjhhhj|hM`ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjfhhhj|hM`ubah}(h]jaah ](jjeh"]h$]h&]jj)jhuh1jhj|hM`hjchhubj)}(hhh]h)}(h#check if setting fsxattr is allowedh]h#check if setting fsxattr is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM`hjhhubah}(h]h ]h"]h$]h&]uh1jhjchhhj|hM`ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX4**Parameters** ``struct dentry *dentry`` file to set filesystem extended attributes on ``struct file_kattr *fa`` extended attributes to set on the inode **Description** Called when file_setattr() syscall or FS_IOC_FSSETXATTR ioctl() is called on inode **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMdhjubj )}(hhh](j)}(hH``struct dentry *dentry`` file to set filesystem extended attributes on h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMahjubj2)}(hhh]h)}(h-file to set filesystem extended attributes onh]h-file to set filesystem extended attributes on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMahjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMahjubj)}(hB``struct file_kattr *fa`` extended attributes to set on the inode h](j)}(h``struct file_kattr *fa``h]j)}(hjh]hstruct file_kattr *fa}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMbhjubj2)}(hhh]h)}(h'extended attributes to set on the inodeh]h'extended attributes to set on the inode}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMbhj.ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj-hMbhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjSh]h Description}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMdhjubh)}(hRCalled when file_setattr() syscall or FS_IOC_FSSETXATTR ioctl() is called on inodeh]hRCalled when file_setattr() syscall or FS_IOC_FSSETXATTR ioctl() is called on inode}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMchjubh)}(h **Return**h]j)}(hjzh]hReturn}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMfhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMghjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_inode_file_getattr (C function)c.security_inode_file_getattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hNint security_inode_file_getattr (struct dentry *dentry, struct file_kattr *fa)h]j)}(hMint security_inode_file_getattr(struct dentry *dentry, struct file_kattr *fa)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMoubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMoubj{)}(hsecurity_inode_file_getattrh]j)}(hsecurity_inode_file_getattrh]hsecurity_inode_file_getattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMoubj)}(h.(struct dentry *dentry, struct file_kattr *fa)h](j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_file_getattrasbuh1hhjubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdentryh]hdentry}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct file_kattr *fah](j)}(hjAh]hstruct}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubh)}(hhh]j)}(h file_kattrh]h file_kattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j6c.security_inode_file_getattrasbuh1hhjjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(hfah]hfa}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMoubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMoubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMohjhhubj)}(hhh]h)}(h&check if retrieving fsxattr is allowedh]h&check if retrieving fsxattr is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMohjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMoubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX.**Parameters** ``struct dentry *dentry`` file to retrieve filesystem extended attributes from ``struct file_kattr *fa`` extended attributes to get **Description** Called when file_getattr() syscall or FS_IOC_FSGETXATTR ioctl() is called on inode **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMshj ubj )}(hhh](j)}(hO``struct dentry *dentry`` file to retrieve filesystem extended attributes from h](j)}(h``struct dentry *dentry``h]j)}(hj0h]hstruct dentry *dentry}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMphj*ubj2)}(hhh]h)}(h4file to retrieve filesystem extended attributes fromh]h4file to retrieve filesystem extended attributes from}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhMphjFubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhjEhMphj'ubj)}(h5``struct file_kattr *fa`` extended attributes to get h](j)}(h``struct file_kattr *fa``h]j)}(hjih]hstruct file_kattr *fa}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMqhjcubj2)}(hhh]h)}(hextended attributes to geth]hextended attributes to get}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hMqhjubah}(h]h ]h"]h$]h&]uh1j1hjcubeh}(h]h ]h"]h$]h&]uh1jhj~hMqhj'ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMshj ubh)}(hRCalled when file_getattr() syscall or FS_IOC_FSGETXATTR ioctl() is called on inodeh]hRCalled when file_getattr() syscall or FS_IOC_FSGETXATTR ioctl() is called on inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMrhj ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMuhj ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMvhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )security_inode_need_killpriv (C function)c.security_inode_need_killprivhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h8int security_inode_need_killpriv (struct dentry *dentry)h]j)}(h7int security_inode_need_killpriv(struct dentry *dentry)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM~ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhM~ubj{)}(hsecurity_inode_need_killprivh]j)}(hsecurity_inode_need_killprivh]hsecurity_inode_need_killpriv}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhM~ubj)}(h(struct dentry *dentry)h]j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubh)}(hhh]j)}(hdentryh]hdentry}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmmodnameN classnameNj] j` )}jc ]jf )}jY j3sbc.security_inode_need_killprivasbuh1hhjIubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubah}(h]h ]h"]h$]h&]jjuh1jhj hhhjhM~ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM~ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM~hjhhubj)}(hhh]h)}(h+Check if security_inode_killpriv() requiredh]h+Check if security_inode_killpriv() required}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM~hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM~ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hXw**Parameters** ``struct dentry *dentry`` associated dentry **Description** Called when an inode has been changed to determine if security_inode_killpriv() should be called. **Return** Return <0 on error to abort the inode change operation, return 0 if security_inode_killpriv() does not need to be called, return >0 if security_inode_killpriv() does need to be called.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh]j)}(h,``struct dentry *dentry`` associated dentry h](j)}(h``struct dentry *dentry``h]j)}(hjh]hstruct dentry *dentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubj2)}(hhh]h)}(hassociated dentryh]hassociated dentry}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMhj'ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjLh]h Description}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(haCalled when an inode has been changed to determine if security_inode_killpriv() should be called.h]haCalled when an inode has been changed to determine if security_inode_killpriv() should be called.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjsh]hReturn}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hReturn <0 on error to abort the inode change operation, return 0 if security_inode_killpriv() does not need to be called, return >0 if security_inode_killpriv() does need to be called.h]hReturn <0 on error to abort the inode change operation, return 0 if security_inode_killpriv() does not need to be called, return >0 if security_inode_killpriv() does need to be called.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_inode_killpriv (C function)c.security_inode_killprivhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hLint security_inode_killpriv (struct mnt_idmap *idmap, struct dentry *dentry)h]j)}(hKint security_inode_killpriv(struct mnt_idmap *idmap, struct dentry *dentry)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inode_killprivh]j)}(hsecurity_inode_killprivh]hsecurity_inode_killpriv}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h0(struct mnt_idmap *idmap, struct dentry *dentry)h](j)}(hstruct mnt_idmap *idmaph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h mnt_idmaph]h mnt_idmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_killprivasbuh1hhjubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidmaph]hidmap}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubh)}(hhh]j)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j/c.security_inode_killprivasbuh1hhjcubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hdentryh]hdentry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h+The setuid bit is removed, update LSM stateh]h+The setuid bit is removed, update LSM state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hXq**Parameters** ``struct mnt_idmap *idmap`` idmap of the mount ``struct dentry *dentry`` associated dentry **Description** The **dentry**'s setuid bit is being removed. Remove similar security labels. Called with the dentry->d_inode->i_mutex held. **Return** Return 0 on success. If error is returned, then the operation causing setuid bit removal is failed.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h/``struct mnt_idmap *idmap`` idmap of the mount h](j)}(h``struct mnt_idmap *idmap``h]j)}(hj)h]hstruct mnt_idmap *idmap}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj#ubj2)}(hhh]h)}(hidmap of the mounth]hidmap of the mount}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj?ubah}(h]h ]h"]h$]h&]uh1j1hj#ubeh}(h]h ]h"]h$]h&]uh1jhj>hMhj ubj)}(h,``struct dentry *dentry`` associated dentry h](j)}(h``struct dentry *dentry``h]j)}(hjbh]hstruct dentry *dentry}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj\ubj2)}(hhh]h)}(hassociated dentryh]hassociated dentry}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhMhjxubah}(h]h ]h"]h$]h&]uh1j1hj\ubeh}(h]h ]h"]h$]h&]uh1jhjwhMhj ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h}The **dentry**'s setuid bit is being removed. Remove similar security labels. Called with the dentry->d_inode->i_mutex held.h](hThe }(hjhhhNhNubj)}(h **dentry**h]hdentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhq’s setuid bit is being removed. Remove similar security labels. Called with the dentry->d_inode->i_mutex held.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hdReturn 0 on success. If error is returned, then the operation causing setuid bit removal is failed.h]hdReturn 0 on success. If error is returned, then the operation causing setuid bit removal is failed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_inode_getsecurity (C function)c.security_inode_getsecurityhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hzint security_inode_getsecurity (struct mnt_idmap *idmap, struct inode *inode, const char *name, void **buffer, bool alloc)h]j)}(hyint security_inode_getsecurity(struct mnt_idmap *idmap, struct inode *inode, const char *name, void **buffer, bool alloc)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj)hMubj{)}(hsecurity_inode_getsecurityh]j)}(hsecurity_inode_getsecurityh]hsecurity_inode_getsecurity}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj)hMubj)}(h[(struct mnt_idmap *idmap, struct inode *inode, const char *name, void **buffer, bool alloc)h](j)}(hstruct mnt_idmap *idmaph](j)}(hjAh]hstruct}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubh)}(hhh]j)}(h mnt_idmaph]h mnt_idmap}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjxmodnameN classnameNj] j` )}jc ]jf )}jY j>sbc.security_inode_getsecurityasbuh1hhjTubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hidmaph]hidmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_inode_getsecurityasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinodeh]hinode}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(hconst char *nameh](j)}(hjh]hconst}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj )}(hcharh]hchar}(hjUhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj)}(hjh]h*}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hnameh]hname}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(h void **bufferh](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufferh]hbuffer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubj)}(h bool alloch](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(halloch]halloc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj)hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj)hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj)hMhjhhubj)}(hhh]h)}(h(Get the xattr security label of an inodeh]h(Get the xattr security label of an inode}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj(hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj)hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjCjjCjjjuh1jhhhj%hNhNubj)}(hXh**Parameters** ``struct mnt_idmap *idmap`` idmap of the mount ``struct inode *inode`` inode ``const char *name`` xattr name ``void **buffer`` security label buffer ``bool alloc`` allocation flag **Description** Retrieve a copy of the extended attribute representation of the security label associated with **name** for **inode** via **buffer**. Note that **name** is the remainder of the attribute name after the security prefix has been removed. **alloc** is used to specify if the call should return a value via the buffer or just the value length. **Return** Returns size of buffer on success.h](h)}(h**Parameters**h]j)}(hjMh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGubj )}(hhh](j)}(h/``struct mnt_idmap *idmap`` idmap of the mount h](j)}(h``struct mnt_idmap *idmap``h]j)}(hjlh]hstruct mnt_idmap *idmap}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubj2)}(hhh]h)}(hidmap of the mounth]hidmap of the mount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjfubeh}(h]h ]h"]h$]h&]uh1jhjhMhjcubj)}(h``struct inode *inode`` inode h](j)}(h``struct inode *inode``h]j)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjcubj)}(h ``const char *name`` xattr name h](j)}(h``const char *name``h]j)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h xattr nameh]h xattr name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjcubj)}(h(``void **buffer`` security label buffer h](j)}(h``void **buffer``h]j)}(hjh]h void **buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hsecurity label bufferh]hsecurity label buffer}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj-ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj,hMhjcubj)}(h``bool alloc`` allocation flag h](j)}(h``bool alloc``h]j)}(hjPh]h bool alloc}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjJubj2)}(hhh]h)}(hallocation flagh]hallocation flag}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMhjfubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjehMhjcubeh}(h]h ]h"]h$]h&]uh1j hjGubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGubh)}(hXTRetrieve a copy of the extended attribute representation of the security label associated with **name** for **inode** via **buffer**. Note that **name** is the remainder of the attribute name after the security prefix has been removed. **alloc** is used to specify if the call should return a value via the buffer or just the value length.h](h_Retrieve a copy of the extended attribute representation of the security label associated with }(hjhhhNhNubj)}(h**name**h]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh for }(hjhhhNhNubj)}(h **inode**h]hinode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh via }(hjhhhNhNubj)}(h **buffer**h]hbuffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh . Note that }(hjhhhNhNubj)}(h**name**h]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhT is the remainder of the attribute name after the security prefix has been removed. }(hjhhhNhNubj)}(h **alloc**h]halloc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh^ is used to specify if the call should return a value via the buffer or just the value length.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGubh)}(h **Return**h]j)}(hj h]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGubh)}(h"Returns size of buffer on success.h]h"Returns size of buffer on success.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_inode_setsecurity (C function)c.security_inode_setsecurityhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hqint security_inode_setsecurity (struct inode *inode, const char *name, const void *value, size_t size, int flags)h]j)}(hpint security_inode_setsecurity(struct inode *inode, const char *name, const void *value, size_t size, int flags)h](j )}(hinth]hint}(hjQhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjMhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMhhhj_hMubj{)}(hsecurity_inode_setsecurityh]j)}(hsecurity_inode_setsecurityh]hsecurity_inode_setsecurity}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjMhhhj_hMubj)}(hR(struct inode *inode, const char *name, const void *value, size_t size, int flags)h](j)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jtsbc.security_inode_setsecurityasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnameh]hname}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst void *valueh](j)}(hjh]hconst}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj )}(hvoidh]hvoid}(hjxhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjYubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hvalueh]hvalue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_inode_setsecurityasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int flagsh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjMhhhj_hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjIhhhj_hMubah}(h]jDah ](jjeh"]h$]h&]jj)jhuh1jhj_hMhjFhhubj)}(hhh]h)}(h(Set the xattr security label of an inodeh]h(Set the xattr security label of an inode}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjEhhubah}(h]h ]h"]h$]h&]uh1jhjFhhhj_hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj`jj`jjjuh1jhhhj%hNhNubj)}(hX0**Parameters** ``struct inode *inode`` inode ``const char *name`` xattr name ``const void *value`` security label ``size_t size`` length of security label ``int flags`` flags **Description** Set the security label associated with **name** for **inode** from the extended attribute value **value**. **size** indicates the size of the **value** in bytes. **flags** may be XATTR_CREATE, XATTR_REPLACE, or 0. Note that **name** is the remainder of the attribute name after the security. prefix has been removed. **Return** Returns 0 on success.h](h)}(h**Parameters**h]j)}(hjjh]h Parameters}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubj )}(hhh](j)}(h``struct inode *inode`` inode h](j)}(h``struct inode *inode``h]j)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h ``const char *name`` xattr name h](j)}(h``const char *name``h]j)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h xattr nameh]h xattr name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h%``const void *value`` security label h](j)}(h``const void *value``h]j)}(hjh]hconst void *value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hsecurity labelh]hsecurity label}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h)``size_t size`` length of security label h](j)}(h``size_t size``h]j)}(hj4h]h size_t size}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj.ubj2)}(hhh]h)}(hlength of security labelh]hlength of security label}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhMhjJubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhMhjubj)}(h``int flags`` flags h](j)}(h ``int flags``h]j)}(hjmh]h int flags}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjgubj2)}(hhh]h)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjgubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjdubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubh)}(hX=Set the security label associated with **name** for **inode** from the extended attribute value **value**. **size** indicates the size of the **value** in bytes. **flags** may be XATTR_CREATE, XATTR_REPLACE, or 0. Note that **name** is the remainder of the attribute name after the security. prefix has been removed.h](h'Set the security label associated with }(hjhhhNhNubj)}(h**name**h]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh for }(hjhhhNhNubj)}(h **inode**h]hinode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh# from the extended attribute value }(hjhhhNhNubj)}(h **value**h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. }(hjhhhNhNubj)}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh indicates the size of the }(hjhhhNhNubj)}(h **value**h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh in bytes. }(hjhhhNhNubj)}(h **flags**h]hflags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh5 may be XATTR_CREATE, XATTR_REPLACE, or 0. Note that }(hjhhhNhNubj)}(h**name**h]hname}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhT is the remainder of the attribute name after the security. prefix has been removed.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubh)}(h **Return**h]j)}(hjMh]hReturn}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubh)}(hReturns 0 on success.h]hReturns 0 on success.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_inode_getlsmprop (C function)c.security_inode_getlsmprophNtauh1hhj%hhhNhNubj)}(hhh](j)}(hKvoid security_inode_getlsmprop (struct inode *inode, struct lsm_prop *prop)h]j)}(hJvoid security_inode_getlsmprop(struct inode *inode, struct lsm_prop *prop)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inode_getlsmproph]j)}(hsecurity_inode_getlsmproph]hsecurity_inode_getlsmprop}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h,(struct inode *inode, struct lsm_prop *prop)h](j)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inode_getlsmpropasbuh1hhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinodeh]hinode}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct lsm_prop *proph](j)}(hjAh]hstruct}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=ubh)}(hhh]j)}(hlsm_proph]hlsm_prop}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjamodnameN classnameNj] j` )}jc ]j c.security_inode_getlsmpropasbuh1hhj=ubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(hproph]hprop}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hGet an inode's LSM datah]hGet an inode’s LSM data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct inode *inode`` inode ``struct lsm_prop *prop`` lsm specific information to return **Description** Get the lsm specific information associated with the node.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h``struct inode *inode`` inode h](j)}(h``struct inode *inode``h]j)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h=``struct lsm_prop *prop`` lsm specific information to return h](j)}(h``struct lsm_prop *prop``h]j)}(hj<h]hstruct lsm_prop *prop}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj6ubj2)}(hhh]h)}(h"lsm specific information to returnh]h"lsm specific information to return}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMhjRubah}(h]h ]h"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjwh]h Description}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h:Get the lsm specific information associated with the node.h]h:Get the lsm specific information associated with the node.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *security_kernfs_init_security (C function)c.security_kernfs_init_securityhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hVint security_kernfs_init_security (struct kernfs_node *kn_dir, struct kernfs_node *kn)h]j)}(hUint security_kernfs_init_security(struct kernfs_node *kn_dir, struct kernfs_node *kn)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM4 ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM4 ubj{)}(hsecurity_kernfs_init_securityh]j)}(hsecurity_kernfs_init_securityh]hsecurity_kernfs_init_security}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM4 ubj)}(h4(struct kernfs_node *kn_dir, struct kernfs_node *kn)h](j)}(hstruct kernfs_node *kn_dirh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h kernfs_nodeh]h kernfs_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_kernfs_init_securityasbuh1hhjubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hkn_dirh]hkn_dir}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct kernfs_node *knh](j)}(hjAh]hstruct}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj2)}(h h]h }(hjxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgubh)}(hhh]j)}(h kernfs_nodeh]h kernfs_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j3c.security_kernfs_init_securityasbuh1hhjgubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(hknh]hkn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM4 ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM4 ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM4 hjhhubj)}(hhh]h)}(h"Init LSM context for a kernfs nodeh]h"Init LSM context for a kernfs node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM4 hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM4 ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX/**Parameters** ``struct kernfs_node *kn_dir`` parent kernfs node ``struct kernfs_node *kn`` the kernfs node to initialize **Description** Initialize the security context of a newly created kernfs node based on its own and its parent's attributes. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM8 hjubj )}(hhh](j)}(h2``struct kernfs_node *kn_dir`` parent kernfs node h](j)}(h``struct kernfs_node *kn_dir``h]j)}(hj-h]hstruct kernfs_node *kn_dir}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5 hj'ubj2)}(hhh]h)}(hparent kernfs nodeh]hparent kernfs node}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhM5 hjCubah}(h]h ]h"]h$]h&]uh1j1hj'ubeh}(h]h ]h"]h$]h&]uh1jhjBhM5 hj$ubj)}(h9``struct kernfs_node *kn`` the kernfs node to initialize h](j)}(h``struct kernfs_node *kn``h]j)}(hjfh]hstruct kernfs_node *kn}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM6 hj`ubj2)}(hhh]h)}(hthe kernfs node to initializeh]hthe kernfs node to initialize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hM6 hj|ubah}(h]h ]h"]h$]h&]uh1j1hj`ubeh}(h]h ]h"]h$]h&]uh1jhj{hM6 hj$ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM8 hjubh)}(hlInitialize the security context of a newly created kernfs node based on its own and its parent's attributes.h]hnInitialize the security context of a newly created kernfs node based on its own and its parent’s attributes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM7 hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM: hjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM; hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_file_permission (C function)c.security_file_permissionhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h:int security_file_permission (struct file *file, int mask)h]j)}(h9int security_file_permission(struct file *file, int mask)h](j )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMD ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhMD ubj{)}(hsecurity_file_permissionh]j)}(hsecurity_file_permissionh]hsecurity_file_permission}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhMD ubj)}(h(struct file *file, int mask)h](j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubh)}(hhh]j)}(hfileh]hfile}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjjmodnameN classnameNj] j` )}jc ]jf )}jY j0sbc.security_file_permissionasbuh1hhjFubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubj)}(hint maskh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hmaskh]hmask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhjhMD ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMD ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMD hjhhubj)}(hhh]h)}(hCheck file permissionsh]hCheck file permissions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMD hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMD ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct file *file`` file ``int mask`` requested permissions **Description** Check file permissions before accessing an open file. This hook is called by various operations that read or write files. A security module can use this hook to perform additional checking on these operations, e.g. to revalidate permissions on use to support privilege bracketing or policy changes. Notice that this hook is used when the actual read/write operations are performed, whereas the inode_security_ops hook is called when a file is opened (as well as many other operations). Although this hook can be used to revalidate permissions for various system call operations that read or write files, it does not address the revalidation of permissions for memory-mapped files. Security modules must handle this separately if they need such revalidation. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMH hjubj )}(hhh](j)}(h``struct file *file`` file h](j)}(h``struct file *file``h]j)}(hjCh]hstruct file *file}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chME hj=ubj2)}(hhh]h)}(hfileh]hfile}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhME hjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhME hj:ubj)}(h#``int mask`` requested permissions h](j)}(h ``int mask``h]j)}(hj|h]hint mask}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMF hjvubj2)}(hhh]h)}(hrequested permissionsh]hrequested permissions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMF hjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhMF hj:ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMH hjubh)}(hXCheck file permissions before accessing an open file. This hook is called by various operations that read or write files. A security module can use this hook to perform additional checking on these operations, e.g. to revalidate permissions on use to support privilege bracketing or policy changes. Notice that this hook is used when the actual read/write operations are performed, whereas the inode_security_ops hook is called when a file is opened (as well as many other operations). Although this hook can be used to revalidate permissions for various system call operations that read or write files, it does not address the revalidation of permissions for memory-mapped files. Security modules must handle this separately if they need such revalidation.h]hXCheck file permissions before accessing an open file. This hook is called by various operations that read or write files. A security module can use this hook to perform additional checking on these operations, e.g. to revalidate permissions on use to support privilege bracketing or policy changes. Notice that this hook is used when the actual read/write operations are performed, whereas the inode_security_ops hook is called when a file is opened (as well as many other operations). Although this hook can be used to revalidate permissions for various system call operations that read or write files, it does not address the revalidation of permissions for memory-mapped files. Security modules must handle this separately if they need such revalidation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMG hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMS hjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMT hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_file_alloc (C function)c.security_file_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h+int security_file_alloc (struct file *file)h]j)}(h*int security_file_alloc(struct file *file)h](j )}(hinth]hint}(hj#hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\ ubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj1hM\ ubj{)}(hsecurity_file_alloch]j)}(hsecurity_file_alloch]hsecurity_file_alloc}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj1hM\ ubj)}(h(struct file *file)h]j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubh)}(hhh]j)}(hfileh]hfile}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jFsbc.security_file_allocasbuh1hhj\ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjXubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj1hM\ ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj1hM\ ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj1hM\ hjhhubj)}(hhh]h)}(h#Allocate and init a file's LSM blobh]h%Allocate and init a file’s LSM blob}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\ hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj1hM\ ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX%**Parameters** ``struct file *file`` the file **Description** Allocate and attach a security structure to the file->f_security field. The security field is initialized to NULL when the structure is first created. **Return** Return 0 if the hook is successful and permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM` hjubj )}(hhh]j)}(h``struct file *file`` the file h](j)}(h``struct file *file``h]j)}(hj$h]hstruct file *file}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM] hjubj2)}(hhh]h)}(hthe fileh]hthe file}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hM] hj:ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj9hM] hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj_h]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM_ hjubh)}(hAllocate and attach a security structure to the file->f_security field. The security field is initialized to NULL when the structure is first created.h]hAllocate and attach a security structure to the file->f_security field. The security field is initialized to NULL when the structure is first created.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM^ hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMa hjubh)}(h=Return 0 if the hook is successful and permission is granted.h]h=Return 0 if the hook is successful and permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMb hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_file_release (C function)c.security_file_releasehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h.void security_file_release (struct file *file)h]j)}(h-void security_file_release(struct file *file)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMq ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMq ubj{)}(hsecurity_file_releaseh]j)}(hsecurity_file_releaseh]hsecurity_file_release}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMq ubj)}(h(struct file *file)h]j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hfileh]hfile}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj(modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_file_releaseasbuh1hhjubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfileh]hfile}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMq ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMq ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMq hjhhubj)}(hhh]h)}(h-Perform actions before releasing the file refh]h-Perform actions before releasing the file ref}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMq hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMq ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct file *file`` the file **Description** Perform actions before releasing the last reference to a file.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMu hjubj )}(hhh]j)}(h``struct file *file`` the file h](j)}(h``struct file *file``h]j)}(hjh]hstruct file *file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMr hjubj2)}(hhh]h)}(hthe fileh]hthe file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMr hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMr hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMt hjubh)}(h>Perform actions before releasing the last reference to a file.h]h>Perform actions before releasing the last reference to a file.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMs hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_file_free (C function)c.security_file_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h+void security_file_free (struct file *file)h]j)}(h*void security_file_free(struct file *file)h](j )}(hvoidh]hvoid}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM| ubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHhhhjZhM| ubj{)}(hsecurity_file_freeh]j)}(hsecurity_file_freeh]hsecurity_file_free}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjHhhhjZhM| ubj)}(h(struct file *file)h]j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY josbc.security_file_freeasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjHhhhjZhM| ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjDhhhjZhM| ubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1jhjZhM| hjAhhubj)}(hhh]h)}(hFree a file's LSM blobh]hFree a file’s LSM blob}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM| hj hhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjZhM| ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj$ jj$ jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct file *file`` the file **Description** Deallocate and free any security structures stored in file->f_security.h](h)}(h**Parameters**h]j)}(hj. h]h Parameters}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj, ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj( ubj )}(hhh]j)}(h``struct file *file`` the file h](j)}(h``struct file *file``h]j)}(hjM h]hstruct file *file}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM} hjG ubj2)}(hhh]h)}(hthe fileh]hthe file}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb hM} hjc ubah}(h]h ]h"]h$]h&]uh1j1hjG ubeh}(h]h ]h"]h$]h&]uh1jhjb hM} hjD ubah}(h]h ]h"]h$]h&]uh1j hj( ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj( ubh)}(hGDeallocate and free any security structures stored in file->f_security.h]hGDeallocate and free any security structures stored in file->f_security.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM~ hj( ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_backing_file_alloc (C function)c.security_backing_file_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(hYint security_backing_file_alloc (struct file *backing_file, const struct file *user_file)h]j)}(hXint security_backing_file_alloc(struct file *backing_file, const struct file *user_file)h](j )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj hM ubj{)}(hsecurity_backing_file_alloch]j)}(hsecurity_backing_file_alloch]hsecurity_backing_file_alloc}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj hM ubj)}(h9(struct file *backing_file, const struct file *user_file)h](j)}(hstruct file *backing_fileh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hfileh]hfile}(hj( hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj% ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj* modnameN classnameNj] j` )}jc ]jf )}jY j sbc.security_backing_file_allocasbuh1hhj ubj2)}(h h]h }(hjH hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hjV hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h backing_fileh]h backing_file}(hjc hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hconst struct file *user_fileh](j)}(hjh]hconst}(hj| hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjx ubj)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjx ubh)}(hhh]j)}(hfileh]hfile}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jD c.security_backing_file_allocasbuh1hhjx ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjx ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx ubj)}(h user_fileh]h user_file}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhj hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hM ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hM hj hhubj)}(hhh]h)}(h&Allocate and setup a backing file blobh]h&Allocate and setup a backing file blob}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj0 jj0 jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct file *backing_file`` the backing file ``const struct file *user_file`` the associated user visible file **Description** Allocate a backing file LSM blob and perform any necessary initialization of the LSM blob. There will be some operations where the LSM will not have access to **user_file** after this point, so any important state associated with **user_file** that is important to the LSM should be captured in the backing file's LSM blob. LSM's should avoid taking a reference to **user_file** in this hook as it will result in problems later when the system attempts to drop/put the file references due to a circular dependency. **Return** Return 0 if the hook is successful, negative values otherwise.h](h)}(h**Parameters**h]j)}(hj: h]h Parameters}(hj< hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8 ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj4 ubj )}(hhh](j)}(h/``struct file *backing_file`` the backing file h](j)}(h``struct file *backing_file``h]j)}(hjY h]hstruct file *backing_file}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjS ubj2)}(hhh]h)}(hthe backing fileh]hthe backing file}(hjr hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjn hM hjo ubah}(h]h ]h"]h$]h&]uh1j1hjS ubeh}(h]h ]h"]h$]h&]uh1jhjn hM hjP ubj)}(hB``const struct file *user_file`` the associated user visible file h](j)}(h ``const struct file *user_file``h]j)}(hj h]hconst struct file *user_file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj ubj2)}(hhh]h)}(h the associated user visible fileh]h the associated user visible file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM hj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hM hjP ubeh}(h]h ]h"]h$]h&]uh1j hj4 ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj4 ubh)}(hXDAllocate a backing file LSM blob and perform any necessary initialization of the LSM blob. There will be some operations where the LSM will not have access to **user_file** after this point, so any important state associated with **user_file** that is important to the LSM should be captured in the backing file's LSM blob.h](hAllocate a backing file LSM blob and perform any necessary initialization of the LSM blob. There will be some operations where the LSM will not have access to }(hj hhhNhNubj)}(h **user_file**h]h user_file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh: after this point, so any important state associated with }(hj hhhNhNubj)}(h **user_file**h]h user_file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhR that is important to the LSM should be captured in the backing file’s LSM blob.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj4 ubh)}(hLSM's should avoid taking a reference to **user_file** in this hook as it will result in problems later when the system attempts to drop/put the file references due to a circular dependency.h](h+LSM’s should avoid taking a reference to }(hj hhhNhNubj)}(h **user_file**h]h user_file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh in this hook as it will result in problems later when the system attempts to drop/put the file references due to a circular dependency.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj4 ubh)}(h **Return**h]j)}(hj9 h]hReturn}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7 ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj4 ubh)}(h>Return 0 if the hook is successful, negative values otherwise.h]h>Return 0 if the hook is successful, negative values otherwise.}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj4 ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_backing_file_free (C function)c.security_backing_file_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h;void security_backing_file_free (struct file *backing_file)h]j)}(h:void security_backing_file_free(struct file *backing_file)h](j )}(hvoidh]hvoid}(hj~ hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjz hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjz hhhj hM ubj{)}(hsecurity_backing_file_freeh]j)}(hsecurity_backing_file_freeh]hsecurity_backing_file_free}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjz hhhj hM ubj)}(h(struct file *backing_file)h]j)}(hstruct file *backing_fileh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hfileh]hfile}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY j sbc.security_backing_file_freeasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h backing_fileh]h backing_file}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhjz hhhj hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjv hhhj hM ubah}(h]jq ah ](jjeh"]h$]h&]jj)jhuh1jhj hM hjs hhubj)}(hhh]h)}(hFree a backing file blobh]hFree a backing file blob}(hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj; hhubah}(h]h ]h"]h$]h&]uh1jhjs hhhj hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjV jjV jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct file *backing_file`` the backing file **Description** Free any LSM state associate with a backing file's LSM blob, including the blob itself.h](h)}(h**Parameters**h]j)}(hj` h]h Parameters}(hjb hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjZ ubj )}(hhh]j)}(h/``struct file *backing_file`` the backing file h](j)}(h``struct file *backing_file``h]j)}(hj h]hstruct file *backing_file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj} ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjy ubj2)}(hhh]h)}(hthe backing fileh]hthe backing file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM hj ubah}(h]h ]h"]h$]h&]uh1j1hjy ubeh}(h]h ]h"]h$]h&]uh1jhj hM hjv ubah}(h]h ]h"]h$]h&]uh1j hjZ ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjZ ubh)}(hWFree any LSM state associate with a backing file's LSM blob, including the blob itself.h]hYFree any LSM state associate with a backing file’s LSM blob, including the blob itself.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjZ ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_mmap_file (C function)c.security_mmap_filehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hSint security_mmap_file (struct file *file, unsigned long prot, unsigned long flags)h]j)}(hRint security_mmap_file(struct file *file, unsigned long prot, unsigned long flags)h](j )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj hM ubj{)}(hsecurity_mmap_fileh]j)}(hsecurity_mmap_fileh]hsecurity_mmap_file}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj hM ubj)}(h<(struct file *file, unsigned long prot, unsigned long flags)h](j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubh)}(hhh]j)}(hfileh]hfile}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj\modnameN classnameNj] j` )}jc ]jf )}jY j"sbc.security_mmap_fileasbuh1hhj8ubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj4ubj)}(hunsigned long proth](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hproth]hprot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj4ubj)}(hunsigned long flagsh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hflagsh]hflags}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj4ubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhj hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hM ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hM hj hhubj)}(hhh]h)}(h#Check if mmap'ing a file is allowedh]h%Check if mmap’ing a file is allowed}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj^hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjyjjyjjjuh1jhhhj%hNhNubj)}(hX0**Parameters** ``struct file *file`` file ``unsigned long prot`` protection applied by the kernel ``unsigned long flags`` flags **Description** Check permissions for a mmap operation. The **file** may be NULL, e.g. if mapping anonymous memory. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj}ubj )}(hhh](j)}(h``struct file *file`` file h](j)}(h``struct file *file``h]j)}(hjh]hstruct file *file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h8``unsigned long prot`` protection applied by the kernel h](j)}(h``unsigned long prot``h]j)}(hjh]hunsigned long prot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(h protection applied by the kernelh]h protection applied by the kernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h``unsigned long flags`` flags h](j)}(h``unsigned long flags``h]j)}(hjh]hunsigned long flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(hflagsh]hflags}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hM hj*ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj)hM hjubeh}(h]h ]h"]h$]h&]uh1j hj}ubh)}(h**Description**h]j)}(hjOh]h Description}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj}ubh)}(hdCheck permissions for a mmap operation. The **file** may be NULL, e.g. if mapping anonymous memory.h](h-Check permissions for a mmap operation. The }(hjehhhNhNubj)}(h**file**h]hfile}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubh/ may be NULL, e.g. if mapping anonymous memory.}(hjehhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj}ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj}ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_mmap_addr (C function)c.security_mmap_addrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h+int security_mmap_addr (unsigned long addr)h]j)}(h*int security_mmap_addr(unsigned long addr)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM4 ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM4 ubj{)}(hsecurity_mmap_addrh]j)}(hsecurity_mmap_addrh]hsecurity_mmap_addr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM4 ubj)}(h(unsigned long addr)h]j)}(hunsigned long addrh](j )}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hj&hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(haddrh]haddr}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM4 ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM4 ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM4 hjhhubj)}(hhh]h)}(h'Check if mmap'ing an address is allowedh]h)Check if mmap’ing an address is allowed}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM4 hjihhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM4 ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``unsigned long addr`` address **Description** Check permissions for a mmap operation at **addr**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM8 hjubj )}(hhh]j)}(h``unsigned long addr`` address h](j)}(h``unsigned long addr``h]j)}(hjh]hunsigned long addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5 hjubj2)}(hhh]h)}(haddressh]haddress}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM5 hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM5 hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM7 hjubh)}(h3Check permissions for a mmap operation at **addr**.h](h*Check permissions for a mmap operation at }(hjhhhNhNubj)}(h**addr**h]haddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM6 hjubh)}(h **Return**h]j)}(hj!h]hReturn}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM8 hjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM9 hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_file_mprotect (C function)c.security_file_mprotecthNtauh1hhj%hhhNhNubj)}(hhh](j)}(hbint security_file_mprotect (struct vm_area_struct *vma, unsigned long reqprot, unsigned long prot)h]j)}(haint security_file_mprotect(struct vm_area_struct *vma, unsigned long reqprot, unsigned long prot)h](j )}(hinth]hint}(hjfhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjbhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMA ubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbhhhjthMA ubj{)}(hsecurity_file_mprotecth]j)}(hsecurity_file_mprotecth]hsecurity_file_mprotect}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjbhhhjthMA ubj)}(hG(struct vm_area_struct *vma, unsigned long reqprot, unsigned long prot)h](j)}(hstruct vm_area_struct *vmah](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_file_mprotectasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long reqproth](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hreqproth]hreqprot}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long proth](j )}(hunsignedh]hunsigned}(hjfhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjbubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjbubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbubj)}(hproth]hprot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjbhhhjthMA ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj^hhhjthMA ubah}(h]jYah ](jjeh"]h$]h&]jj)jhuh1jhjthMA hj[hhubj)}(hhh]h)}(h/Check if changing memory protections is allowedh]h/Check if changing memory protections is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMA hjhhubah}(h]h ]h"]h$]h&]uh1jhj[hhhjthMA ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX7**Parameters** ``struct vm_area_struct *vma`` memory region ``unsigned long reqprot`` application requested protection ``unsigned long prot`` protection applied by the kernel **Description** Check permissions before changing memory access permissions. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chME hjubj )}(hhh](j)}(h-``struct vm_area_struct *vma`` memory region h](j)}(h``struct vm_area_struct *vma``h]j)}(hj h]hstruct vm_area_struct *vma}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMB hjubj2)}(hhh]h)}(h memory regionh]h memory region}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMB hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMB hjubj)}(h;``unsigned long reqprot`` application requested protection h](j)}(h``unsigned long reqprot``h]j)}(hjBh]hunsigned long reqprot}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMC hj<ubj2)}(hhh]h)}(h application requested protectionh]h application requested protection}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMC hjXubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhjWhMC hjubj)}(h8``unsigned long prot`` protection applied by the kernel h](j)}(h``unsigned long prot``h]j)}(hj{h]hunsigned long prot}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMD hjuubj2)}(hhh]h)}(h protection applied by the kernelh]h protection applied by the kernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMD hjubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjhMD hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMF hjubh)}(hah"]h$]h&]uh1j1hjhhhj0hMQ ubj{)}(hsecurity_file_lockh]j)}(hsecurity_file_lockh]hsecurity_file_lock}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj0hMQ ubj)}(h%(struct file *file, unsigned int cmd)h](j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[ubh)}(hhh]j)}(hfileh]hfile}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jEsbc.security_file_lockasbuh1hhj[ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjWubj)}(hunsigned int cmdh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcmdh]hcmd}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjWubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj0hMQ ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj0hMQ ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj0hMQ hjhhubj)}(hhh]h)}(hCheck if a file lock is allowedh]hCheck if a file lock is allowed}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMQ hj0hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj0hMQ ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjKjjKjjjuh1jhhhj%hNhNubj)}(hX$**Parameters** ``struct file *file`` file ``unsigned int cmd`` lock operation (e.g. F_RDLCK, F_WRLCK) **Description** Check permission before performing file locking operations. Note the hook mediates both flock and fcntl style locks. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMU hjOubj )}(hhh](j)}(h``struct file *file`` file h](j)}(h``struct file *file``h]j)}(hjth]hstruct file *file}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMR hjnubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMR hjubah}(h]h ]h"]h$]h&]uh1j1hjnubeh}(h]h ]h"]h$]h&]uh1jhjhMR hjkubj)}(h<``unsigned int cmd`` lock operation (e.g. F_RDLCK, F_WRLCK) h](j)}(h``unsigned int cmd``h]j)}(hjh]hunsigned int cmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMS hjubj2)}(hhh]h)}(h&lock operation (e.g. F_RDLCK, F_WRLCK)h]h&lock operation (e.g. F_RDLCK, F_WRLCK)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMS hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMS hjkubeh}(h]h ]h"]h$]h&]uh1j hjOubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMU hjOubh)}(huCheck permission before performing file locking operations. Note the hook mediates both flock and fcntl style locks.h]huCheck permission before performing file locking operations. Note the hook mediates both flock and fcntl style locks.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMT hjOubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMW hjOubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMX hjOubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_file_fcntl (C function)c.security_file_fcntlhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hPint security_file_fcntl (struct file *file, unsigned int cmd, unsigned long arg)h]j)}(hOint security_file_fcntl(struct file *file, unsigned int cmd, unsigned long arg)h](j )}(hinth]hint}(hjThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjPhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM` ubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPhhhjbhM` ubj{)}(hsecurity_file_fcntlh]j)}(hsecurity_file_fcntlh]hsecurity_file_fcntl}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjPhhhjbhM` ubj)}(h8(struct file *file, unsigned int cmd, unsigned long arg)h](j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jwsbc.security_file_fcntlasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int cmdh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcmdh]hcmd}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long argh](j )}(hunsignedh]hunsigned}(hjThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjPubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubj )}(hlongh]hlong}(hjphhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjPubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubj)}(hargh]harg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjPhhhjbhM` ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjLhhhjbhM` ubah}(h]jGah ](jjeh"]h$]h&]jj)jhuh1jhjbhM` hjIhhubj)}(hhh]h)}(hCheck if fcntl() op is allowedh]hCheck if fcntl() op is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM` hjhhubah}(h]h ]h"]h$]h&]uh1jhjIhhhjbhM` ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct file *file`` file ``unsigned int cmd`` fcntl command ``unsigned long arg`` command argument **Description** Check permission before allowing the file operation specified by **cmd** from being performed on the file **file**. Note that **arg** sometimes represents a user space pointer; in other cases, it may be a simple integer value. When **arg** represents a user space pointer, it should never be used by the security module. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMd hjubj )}(hhh](j)}(h``struct file *file`` file h](j)}(h``struct file *file``h]j)}(hjh]hstruct file *file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMa hjubj2)}(hhh]h)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMa hj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMa hjubj)}(h#``unsigned int cmd`` fcntl command h](j)}(h``unsigned int cmd``h]j)}(hj0h]hunsigned int cmd}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMb hj*ubj2)}(hhh]h)}(h fcntl commandh]h fcntl command}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhMb hjFubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhjEhMb hjubj)}(h'``unsigned long arg`` command argument h](j)}(h``unsigned long arg``h]j)}(hjih]hunsigned long arg}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMc hjcubj2)}(hhh]h)}(hcommand argumenth]hcommand argument}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hMc hjubah}(h]h ]h"]h$]h&]uh1j1hjcubeh}(h]h ]h"]h$]h&]uh1jhj~hMc hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMe hjubh)}(hXBCheck permission before allowing the file operation specified by **cmd** from being performed on the file **file**. Note that **arg** sometimes represents a user space pointer; in other cases, it may be a simple integer value. When **arg** represents a user space pointer, it should never be used by the security module.h](hACheck permission before allowing the file operation specified by }(hjhhhNhNubj)}(h**cmd**h]hcmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh" from being performed on the file }(hjhhhNhNubj)}(h**file**h]hfile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh . Note that }(hjhhhNhNubj)}(h**arg**h]harg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhd sometimes represents a user space pointer; in other cases, it may be a simple integer value. When }(hjhhhNhNubj)}(h**arg**h]harg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhQ represents a user space pointer, it should never be used by the security module.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMd hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMj hjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMk hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_file_set_fowner (C function)c.security_file_set_fownerhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h1void security_file_set_fowner (struct file *file)h]j)}(h0void security_file_set_fowner(struct file *file)h](j )}(hvoidh]hvoid}(hjXhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjThhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMs ubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjThhhjfhMs ubj{)}(hsecurity_file_set_fownerh]j)}(hsecurity_file_set_fownerh]hsecurity_file_set_fowner}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjThhhjfhMs ubj)}(h(struct file *file)h]j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j{sbc.security_file_set_fownerasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjThhhjfhMs ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjPhhhjfhMs ubah}(h]jKah ](jjeh"]h$]h&]jj)jhuh1jhjfhMs hjMhhubj)}(hhh]h)}(h'Set the file owner info in the LSM blobh]h'Set the file owner info in the LSM blob}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMs hjhhubah}(h]h ]h"]h$]h&]uh1jhjMhhhjfhMs ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj0jj0jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct file *file`` the file **Description** Save owner security information (typically from current->security) in file->f_security for later use by the send_sigiotask hook. This hook is called with file->f_owner.lock held. **Return** Returns 0 on success.h](h)}(h**Parameters**h]j)}(hj:h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMw hj4ubj )}(hhh]j)}(h``struct file *file`` the file h](j)}(h``struct file *file``h]j)}(hjYh]hstruct file *file}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMt hjSubj2)}(hhh]h)}(hthe fileh]hthe file}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhMt hjoubah}(h]h ]h"]h$]h&]uh1j1hjSubeh}(h]h ]h"]h$]h&]uh1jhjnhMt hjPubah}(h]h ]h"]h$]h&]uh1j hj4ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMv hj4ubh)}(hSave owner security information (typically from current->security) in file->f_security for later use by the send_sigiotask hook.h]hSave owner security information (typically from current->security) in file->f_security for later use by the send_sigiotask hook.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMu hj4ubh)}(h1This hook is called with file->f_owner.lock held.h]h1This hook is called with file->f_owner.lock held.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMx hj4ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMz hj4ubh)}(hReturns 0 on success.h]hReturns 0 on success.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM{ hj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )security_file_send_sigiotask (C function)c.security_file_send_sigiotaskhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h]int security_file_send_sigiotask (struct task_struct *tsk, struct fown_struct *fown, int sig)h]j)}(h\int security_file_send_sigiotask(struct task_struct *tsk, struct fown_struct *fown, int sig)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhM ubj{)}(hsecurity_file_send_sigiotaskh]j)}(hsecurity_file_send_sigiotaskh]hsecurity_file_send_sigiotask}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhM ubj)}(h<(struct task_struct *tsk, struct fown_struct *fown, int sig)h](j)}(hstruct task_struct *tskh](j)}(hjAh]hstruct}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubh)}(hhh]j)}(h task_structh]h task_struct}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlmodnameN classnameNj] j` )}jc ]jf )}jY j2sbc.security_file_send_sigiotaskasbuh1hhjHubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(htskh]htsk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubj)}(hstruct fown_struct *fownh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h fown_structh]h fown_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_file_send_sigiotaskasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfownh]hfown}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubj)}(hint sigh](j )}(hinth]hint}(hj.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj)}(hsigh]hsig}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h(Check if sending SIGIO/SIGURG is allowedh]h(Check if sending SIGIO/SIGURG is allowed}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjqhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hXH**Parameters** ``struct task_struct *tsk`` target task ``struct fown_struct *fown`` signal sender ``int sig`` signal to be sent, SIGIO is sent if 0 **Description** Check permission for the file owner **fown** to send SIGIO or SIGURG to the process **tsk**. Note that this hook is sometimes called from interrupt. Note that the fown_struct, **fown**, is never outside the context of a struct file, so the file structure (and associated security information) can always be obtained: container_of(fown, struct file, f_owner). **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj )}(hhh](j)}(h(``struct task_struct *tsk`` target task h](j)}(h``struct task_struct *tsk``h]j)}(hjh]hstruct task_struct *tsk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(h target taskh]h target task}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h+``struct fown_struct *fown`` signal sender h](j)}(h``struct fown_struct *fown``h]j)}(hjh]hstruct fown_struct *fown}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(h signal senderh]h signal sender}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h2``int sig`` signal to be sent, SIGIO is sent if 0 h](j)}(h ``int sig``h]j)}(hj'h]hint sig}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj!ubj2)}(hhh]h)}(h%signal to be sent, SIGIO is sent if 0h]h%signal to be sent, SIGIO is sent if 0}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hM hj=ubah}(h]h ]h"]h$]h&]uh1j1hj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hM hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjbh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubh)}(hXhCheck permission for the file owner **fown** to send SIGIO or SIGURG to the process **tsk**. Note that this hook is sometimes called from interrupt. Note that the fown_struct, **fown**, is never outside the context of a struct file, so the file structure (and associated security information) can always be obtained: container_of(fown, struct file, f_owner).h](h$Check permission for the file owner }(hjxhhhNhNubj)}(h**fown**h]hfown}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubh( to send SIGIO or SIGURG to the process }(hjxhhhNhNubj)}(h**tsk**h]htsk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubhW. Note that this hook is sometimes called from interrupt. Note that the fown_struct, }(hjxhhhNhNubj)}(h**fown**h]hfown}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubh, is never outside the context of a struct file, so the file structure (and associated security information) can always be obtained: container_of(fown, struct file, f_owner).}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_file_receive (C function)c.security_file_receivehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h-int security_file_receive (struct file *file)h]j)}(h,int security_file_receive(struct file *file)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM ubj{)}(hsecurity_file_receiveh]j)}(hsecurity_file_receiveh]hsecurity_file_receive}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM ubj)}(h(struct file *file)h]j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=ubh)}(hhh]j)}(hfileh]hfile}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjamodnameN classnameNj] j` )}jc ]jf )}jY j'sbc.security_file_receiveasbuh1hhj=ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h,Check if receiving a file via IPC is allowedh]h,Check if receiving a file via IPC is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct file *file`` file being received **Description** This hook allows security modules to control the ability of a process to receive an open file descriptor via socket IPC. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj )}(hhh]j)}(h*``struct file *file`` file being received h](j)}(h``struct file *file``h]j)}(hj h]hstruct file *file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(hfile being receivedh]hfile being received}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM hj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hM hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj@ h]h Description}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj> ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubh)}(hxThis hook allows security modules to control the ability of a process to receive an open file descriptor via socket IPC.h]hxThis hook allows security modules to control the ability of a process to receive an open file descriptor via socket IPC.}(hjV hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubh)}(h **Return**h]j)}(hjg h]hReturn}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_file_open (C function)c.security_file_openhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h*int security_file_open (struct file *file)h]j)}(h)int security_file_open(struct file *file)h](j )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj hM ubj{)}(hsecurity_file_openh]j)}(hsecurity_file_openh]hsecurity_file_open}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj hM ubj)}(h(struct file *file)h]j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hfileh]hfile}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj !modnameN classnameNj] j` )}jc ]jf )}jY j sbc.security_file_openasbuh1hhj ubj2)}(h h]h }(hj'!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj5!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hfileh]hfile}(hjB!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhj hhhj hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hM ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hM hj hhubj)}(hhh]h)}(h.Save open() time state for late use by the LSMh]h.Save open() time state for late use by the LSM}(hjl!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hji!hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!jj!jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct file *file`` **Description** Save open-time permission checking state for later use upon file_permission, and recheck access if anything has changed since inode_permission. We can check if a file is opened for execution (e.g. execve(2) call), either directly or indirectly (e.g. ELF's ld.so) by checking file->f_flags & __FMODE_EXEC . **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj!ubh)}(h``struct file *file``h]j)}(hj!h]hstruct file *file}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj!ubh)}(h**Description**h]j)}(hj!h]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj!ubh)}(hSave open-time permission checking state for later use upon file_permission, and recheck access if anything has changed since inode_permission.h]hSave open-time permission checking state for later use upon file_permission, and recheck access if anything has changed since inode_permission.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj!ubh)}(hWe can check if a file is opened for execution (e.g. execve(2) call), either directly or indirectly (e.g. ELF's ld.so) by checking file->f_flags & __FMODE_EXEC .h]hWe can check if a file is opened for execution (e.g. execve(2) call), either directly or indirectly (e.g. ELF’s ld.so) by checking file->f_flags & __FMODE_EXEC .}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj!ubh)}(h **Return**h]j)}(hj!h]hReturn}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj!ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj "hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_file_truncate (C function)c.security_file_truncatehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h.int security_file_truncate (struct file *file)h]j)}(h-int security_file_truncate(struct file *file)h](j )}(hinth]hint}(hj9"hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5"hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjH"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5"hhhjG"hM ubj{)}(hsecurity_file_truncateh]j)}(hsecurity_file_truncateh]hsecurity_file_truncate}(hjZ"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV"ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj5"hhhjG"hM ubj)}(h(struct file *file)h]j)}(hstruct file *fileh](j)}(hjAh]hstruct}(hjv"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr"ubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjr"ubh)}(hhh]j)}(hfileh]hfile}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj"modnameN classnameNj] j` )}jc ]jf )}jY j\"sbc.security_file_truncateasbuh1hhjr"ubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjr"ubj)}(hjh]h*}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr"ubj)}(hfileh]hfile}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr"ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjn"ubah}(h]h ]h"]h$]h&]jjuh1jhj5"hhhjG"hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj1"hhhjG"hM ubah}(h]j,"ah ](jjeh"]h$]h&]jj)jhuh1jhjG"hM hj."hhubj)}(hhh]h)}(h%Check if truncating a file is allowedh]h%Check if truncating a file is allowed}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj"hhubah}(h]h ]h"]h$]h&]uh1jhj."hhhjG"hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj#jj#jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct file *file`` file **Description** Check permission before truncating a file, i.e. using ftruncate. Note that truncation permission may also be checked based on the path, using the **path_truncate** hook. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj#h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj#ubj )}(hhh]j)}(h``struct file *file`` file h](j)}(h``struct file *file``h]j)}(hj:#h]hstruct file *file}(hj<#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8#ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj4#ubj2)}(hhh]h)}(hfileh]hfile}(hjS#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjO#hM hjP#ubah}(h]h ]h"]h$]h&]uh1j1hj4#ubeh}(h]h ]h"]h$]h&]uh1jhjO#hM hj1#ubah}(h]h ]h"]h$]h&]uh1j hj#ubh)}(h**Description**h]j)}(hju#h]h Description}(hjw#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs#ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj#ubh)}(hCheck permission before truncating a file, i.e. using ftruncate. Note that truncation permission may also be checked based on the path, using the **path_truncate** hook.h](hCheck permission before truncating a file, i.e. using ftruncate. Note that truncation permission may also be checked based on the path, using the }(hj#hhhNhNubj)}(h**path_truncate**h]h path_truncate}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh hook.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj#ubh)}(h **Return**h]j)}(hj#h]hReturn}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj#ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_task_alloc (C function)c.security_task_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(hCint security_task_alloc (struct task_struct *task, u64 clone_flags)h]j)}(hBint security_task_alloc(struct task_struct *task, u64 clone_flags)h](j )}(hinth]hint}(hj#hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#hhhj$hM ubj{)}(hsecurity_task_alloch]j)}(hsecurity_task_alloch]hsecurity_task_alloc}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj#hhhj$hM ubj)}(h+(struct task_struct *task, u64 clone_flags)h](j)}(hstruct task_struct *taskh](j)}(hjAh]hstruct}(hj0$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,$ubj2)}(h h]h }(hj=$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,$ubh)}(hhh]j)}(h task_structh]h task_struct}(hjN$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK$ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjP$modnameN classnameNj] j` )}jc ]jf )}jY j$sbc.security_task_allocasbuh1hhj,$ubj2)}(h h]h }(hjn$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,$ubj)}(hjh]h*}(hj|$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,$ubj)}(htaskh]htask}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj($ubj)}(hu64 clone_flagsh](h)}(hhh]j)}(hu64h]hu64}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj$modnameN classnameNj] j` )}jc ]jj$c.security_task_allocasbuh1hhj$ubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(h clone_flagsh]h clone_flags}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj($ubeh}(h]h ]h"]h$]h&]jjuh1jhj#hhhj$hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj#hhhj$hM ubah}(h]j#ah ](jjeh"]h$]h&]jj)jhuh1jhj$hM hj#hhubj)}(hhh]h)}(hAllocate a task's LSM blobh]hAllocate a task’s LSM blob}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj$hhubah}(h]h ]h"]h$]h&]uh1jhj#hhhj$hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj%jj%jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *task`` the task ``u64 clone_flags`` flags indicating what is being shared **Description** Handle allocation of task-related resources. **Return** Returns a zero on success, negative values on failure.h](h)}(h**Parameters**h]j)}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj%ubj )}(hhh](j)}(h&``struct task_struct *task`` the task h](j)}(h``struct task_struct *task``h]j)}(hj<%h]hstruct task_struct *task}(hj>%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:%ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj6%ubj2)}(hhh]h)}(hthe taskh]hthe task}(hjU%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ%hM hjR%ubah}(h]h ]h"]h$]h&]uh1j1hj6%ubeh}(h]h ]h"]h$]h&]uh1jhjQ%hM hj3%ubj)}(h:``u64 clone_flags`` flags indicating what is being shared h](j)}(h``u64 clone_flags``h]j)}(hju%h]hu64 clone_flags}(hjw%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs%ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjo%ubj2)}(hhh]h)}(h%flags indicating what is being sharedh]h%flags indicating what is being shared}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hM hj%ubah}(h]h ]h"]h$]h&]uh1j1hjo%ubeh}(h]h ]h"]h$]h&]uh1jhj%hM hj3%ubeh}(h]h ]h"]h$]h&]uh1j hj%ubh)}(h**Description**h]j)}(hj%h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj%ubh)}(h,Handle allocation of task-related resources.h]h,Handle allocation of task-related resources.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj%ubh)}(h **Return**h]j)}(hj%h]hReturn}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj%ubh)}(h6Returns a zero on success, negative values on failure.h]h6Returns a zero on success, negative values on failure.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_task_free (C function)c.security_task_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h2void security_task_free (struct task_struct *task)h]j)}(h1void security_task_free(struct task_struct *task)h](j )}(hvoidh]hvoid}(hj&hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj+&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&hhhj*&hM ubj{)}(hsecurity_task_freeh]j)}(hsecurity_task_freeh]hsecurity_task_free}(hj=&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9&ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj&hhhj*&hM ubj)}(h(struct task_struct *task)h]j)}(hstruct task_struct *taskh](j)}(hjAh]hstruct}(hjY&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU&ubj2)}(h h]h }(hjf&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjU&ubh)}(hhh]j)}(h task_structh]h task_struct}(hjw&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt&ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjy&modnameN classnameNj] j` )}jc ]jf )}jY j?&sbc.security_task_freeasbuh1hhjU&ubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjU&ubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU&ubj)}(htaskh]htask}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQ&ubah}(h]h ]h"]h$]h&]jjuh1jhj&hhhj*&hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj&hhhj*&hM ubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1jhj*&hM hj&hhubj)}(hhh]h)}(h,Free a task's LSM blob and related resourcesh]h.Free a task’s LSM blob and related resources}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj&hhubah}(h]h ]h"]h$]h&]uh1jhj&hhhj*&hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj&jj&jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *task`` task **Description** Handle release of task-related resources. Note that this can be called from interrupt context.h](h)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj&ubj )}(hhh]j)}(h"``struct task_struct *task`` task h](j)}(h``struct task_struct *task``h]j)}(hj'h]hstruct task_struct *task}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj'ubj2)}(hhh]h)}(htaskh]htask}(hj6'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2'hM hj3'ubah}(h]h ]h"]h$]h&]uh1j1hj'ubeh}(h]h ]h"]h$]h&]uh1jhj2'hM hj'ubah}(h]h ]h"]h$]h&]uh1j hj&ubh)}(h**Description**h]j)}(hjX'h]h Description}(hjZ'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV'ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj&ubh)}(h_Handle release of task-related resources. Note that this can be called from interrupt context.h]h_Handle release of task-related resources. Note that this can be called from interrupt context.}(hjn'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_cred_alloc_blank (C function)c.security_cred_alloc_blankhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hj'hhhj'hM ubj{)}(hsecurity_cred_alloc_blankh]j)}(hsecurity_cred_alloc_blankh]hsecurity_cred_alloc_blank}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj'hhhj'hM ubj)}(h(struct cred *cred, gfp_t gfp)h](j)}(hstruct cred *credh](j)}(hjAh]hstruct}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'ubh)}(hhh]j)}(hcredh]hcred}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj'modnameN classnameNj] j` )}jc ]jf )}jY j'sbc.security_cred_alloc_blankasbuh1hhj'ubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'ubj)}(hjh]h*}(hj&(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hcredh]hcred}(hj3(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'ubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjO(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL(ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjQ(modnameN classnameNj] j` )}jc ]j(c.security_cred_alloc_blankasbuh1hhjH(ubj2)}(h h]h }(hjm(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjH(ubj)}(hgfph]hgfp}(hj{(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH(ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'ubeh}(h]h ]h"]h$]h&]jjuh1jhj'hhhj'hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj'hhhj'hM ubah}(h]j'ah ](jjeh"]h$]h&]jj)jhuh1jhj'hM hj'hhubj)}(hhh]h)}(h.Allocate the min memory to allow cred_transferh]h.Allocate the min memory to allow cred_transfer}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(hhubah}(h]h ]h"]h$]h&]uh1jhj'hhhj'hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj(jj(jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct cred *cred`` credentials ``gfp_t gfp`` gfp flags **Description** Only allocate sufficient memory and attach to **cred** such that cred_transfer() will not get ENOMEM. **Return** Returns 0 on success, negative values on failure.h](h)}(h**Parameters**h]j)}(hj(h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(ubj )}(hhh](j)}(h"``struct cred *cred`` credentials h](j)}(h``struct cred *cred``h]j)}(hj(h]hstruct cred *cred}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(ubj2)}(hhh]h)}(h credentialsh]h credentials}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hM hj(ubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhj(hM hj(ubj)}(h``gfp_t gfp`` gfp flags h](j)}(h ``gfp_t gfp``h]j)}(hj)h]h gfp_t gfp}(hj!)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj)ubj2)}(hhh]h)}(h gfp flagsh]h gfp flags}(hj8)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4)hM hj5)ubah}(h]h ]h"]h$]h&]uh1j1hj)ubeh}(h]h ]h"]h$]h&]uh1jhj4)hM hj(ubeh}(h]h ]h"]h$]h&]uh1j hj(ubh)}(h**Description**h]j)}(hjZ)h]h Description}(hj\)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX)ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(ubh)}(heOnly allocate sufficient memory and attach to **cred** such that cred_transfer() will not get ENOMEM.h](h.Only allocate sufficient memory and attach to }(hjp)hhhNhNubj)}(h**cred**h]hcred}(hjx)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp)ubh/ such that cred_transfer() will not get ENOMEM.}(hjp)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(ubh)}(h **Return**h]j)}(hj)h]hReturn}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(ubh)}(h1Returns 0 on success, negative values on failure.h]h1Returns 0 on success, negative values on failure.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_cred_free (C function)c.security_cred_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h+void security_cred_free (struct cred *cred)h]j)}(h*void security_cred_free(struct cred *cred)h](j )}(hvoidh]hvoid}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)hhhj)hM ubj{)}(hsecurity_cred_freeh]j)}(hsecurity_cred_freeh]hsecurity_cred_free}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj)hhhj)hM ubj)}(h(struct cred *cred)h]j)}(hstruct cred *credh](j)}(hjAh]hstruct}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj"*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubh)}(hhh]j)}(hcredh]hcred}(hj3*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0*ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj5*modnameN classnameNj] j` )}jc ]jf )}jY j)sbc.security_cred_freeasbuh1hhj*ubj2)}(h h]h }(hjS*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj)}(hjh]h*}(hja*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hcredh]hcred}(hjn*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj *ubah}(h]h ]h"]h$]h&]jjuh1jhj)hhhj)hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj)hhhj)hM ubah}(h]j)ah ](jjeh"]h$]h&]jj)jhuh1jhj)hM hj)hhubj)}(hhh]h)}(h1Free the cred's LSM blob and associated resourcesh]h3Free the cred’s LSM blob and associated resources}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj*hhubah}(h]h ]h"]h$]h&]uh1jhj)hhhj)hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj*jj*jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct cred *cred`` credentials **Description** Deallocate and clear the cred->security field in a set of credentials.h](h)}(h**Parameters**h]j)}(hj*h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj*ubj )}(hhh]j)}(h"``struct cred *cred`` credentials h](j)}(h``struct cred *cred``h]j)}(hj*h]hstruct cred *cred}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj*ubj2)}(hhh]h)}(h credentialsh]h credentials}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hM hj*ubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hM hj*ubah}(h]h ]h"]h$]h&]uh1j hj*ubh)}(h**Description**h]j)}(hj+h]h Description}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj*ubh)}(hFDeallocate and clear the cred->security field in a set of credentials.h]hFDeallocate and clear the cred->security field in a set of credentials.}(hj*+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_prepare_creds (C function)c.security_prepare_credshNtauh1hhj%hhhNhNubj)}(hhh](j)}(hPint security_prepare_creds (struct cred *new, const struct cred *old, gfp_t gfp)h]j)}(hOint security_prepare_creds(struct cred *new, const struct cred *old, gfp_t gfp)h](j )}(hinth]hint}(hjY+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjU+hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM' ubj2)}(h h]h }(hjh+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjU+hhhjg+hM' ubj{)}(hsecurity_prepare_credsh]j)}(hsecurity_prepare_credsh]hsecurity_prepare_creds}(hjz+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv+ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjU+hhhjg+hM' ubj)}(h5(struct cred *new, const struct cred *old, gfp_t gfp)h](j)}(hstruct cred *newh](j)}(hjAh]hstruct}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubh)}(hhh]j)}(hcredh]hcred}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj+modnameN classnameNj] j` )}jc ]jf )}jY j|+sbc.security_prepare_credsasbuh1hhj+ubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hnewh]hnew}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(hconst struct cred *oldh](j)}(hjh]hconst}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubj)}(hjAh]hstruct}(hj#,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj2)}(h h]h }(hj0,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubh)}(hhh]j)}(hcredh]hcred}(hjA,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>,ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjC,modnameN classnameNj] j` )}jc ]j+c.security_prepare_credsasbuh1hhj,ubj2)}(h h]h }(hj_,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubj)}(hjh]h*}(hjm,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(holdh]hold}(hjz,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(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&] refdomainjreftypejY reftargetj,modnameN classnameNj] j` )}jc ]j+c.security_prepare_credsasbuh1hhj,ubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubj)}(hgfph]hgfp}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubeh}(h]h ]h"]h$]h&]jjuh1jhjU+hhhjg+hM' ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjQ+hhhjg+hM' ubah}(h]jL+ah ](jjeh"]h$]h&]jj)jhuh1jhjg+hM' hjN+hhubj)}(hhh]h)}(h Prepare a new set of credentialsh]h Prepare a new set of credentials}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM' hj,hhubah}(h]h ]h"]h$]h&]uh1jhjN+hhhjg+hM' ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj-jj-jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct cred *new`` new credentials ``const struct cred *old`` original credentials ``gfp_t gfp`` gfp flags **Description** Prepare a new set of credentials by copying the data from the old set. **Return** Returns 0 on success, negative values on failure.h](h)}(h**Parameters**h]j)}(hj-h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj -ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM+ hj-ubj )}(hhh](j)}(h%``struct cred *new`` new credentials h](j)}(h``struct cred *new``h]j)}(hj--h]hstruct cred *new}(hj/-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+-ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM( hj'-ubj2)}(hhh]h)}(hnew credentialsh]hnew credentials}(hjF-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjB-hM( hjC-ubah}(h]h ]h"]h$]h&]uh1j1hj'-ubeh}(h]h ]h"]h$]h&]uh1jhjB-hM( hj$-ubj)}(h0``const struct cred *old`` original credentials h](j)}(h``const struct cred *old``h]j)}(hjf-h]hconst struct cred *old}(hjh-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjd-ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM) hj`-ubj2)}(hhh]h)}(horiginal credentialsh]horiginal credentials}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{-hM) hj|-ubah}(h]h ]h"]h$]h&]uh1j1hj`-ubeh}(h]h ]h"]h$]h&]uh1jhj{-hM) hj$-ubj)}(h``gfp_t gfp`` gfp flags h](j)}(h ``gfp_t gfp``h]j)}(hj-h]h gfp_t gfp}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM* hj-ubj2)}(hhh]h)}(h gfp flagsh]h gfp flags}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hM* hj-ubah}(h]h ]h"]h$]h&]uh1j1hj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hM* hj$-ubeh}(h]h ]h"]h$]h&]uh1j hj-ubh)}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM, hj-ubh)}(hFPrepare a new set of credentials by copying the data from the old set.h]hFPrepare a new set of credentials by copying the data from the old set.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM+ hj-ubh)}(h **Return**h]j)}(hj.h]hReturn}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM- hj-ubh)}(h1Returns 0 on success, negative values on failure.h]h1Returns 0 on success, negative values on failure.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM. hj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_transfer_creds (C function)c.security_transfer_credshNtauh1hhj%hhhNhNubj)}(hhh](j)}(hGvoid security_transfer_creds (struct cred *new, const struct cred *old)h]j)}(hFvoid security_transfer_creds(struct cred *new, const struct cred *old)h](j )}(hvoidh]hvoid}(hjF.hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjB.hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM> ubj2)}(h h]h }(hjU.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjB.hhhjT.hM> ubj{)}(hsecurity_transfer_credsh]j)}(hsecurity_transfer_credsh]hsecurity_transfer_creds}(hjg.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjc.ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjB.hhhjT.hM> ubj)}(h*(struct cred *new, const struct cred *old)h](j)}(hstruct cred *newh](j)}(hjAh]hstruct}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubh)}(hhh]j)}(hcredh]hcred}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj.modnameN classnameNj] j` )}jc ]jf )}jY ji.sbc.security_transfer_credsasbuh1hhj.ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hnewh]hnew}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{.ubj)}(hconst struct cred *oldh](j)}(hjh]hconst}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hjAh]hstruct}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubh)}(hhh]j)}(hcredh]hcred}(hj./hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+/ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj0/modnameN classnameNj] j` )}jc ]j.c.security_transfer_credsasbuh1hhj.ubj2)}(h h]h }(hjL/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hjh]h*}(hjZ/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(holdh]hold}(hjg/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{.ubeh}(h]h ]h"]h$]h&]jjuh1jhjB.hhhjT.hM> ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj>.hhhjT.hM> ubah}(h]j9.ah ](jjeh"]h$]h&]jj)jhuh1jhjT.hM> hj;.hhubj)}(hhh]h)}(hTransfer credsh]hTransfer creds}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM> hj/hhubah}(h]h ]h"]h$]h&]uh1jhj;.hhhjT.hM> ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj/jj/jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct cred *new`` target credentials ``const struct cred *old`` original credentials **Description** Transfer data from original creds to new creds.h](h)}(h**Parameters**h]j)}(hj/h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMB hj/ubj )}(hhh](j)}(h(``struct cred *new`` target credentials h](j)}(h``struct cred *new``h]j)}(hj/h]hstruct cred *new}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM? hj/ubj2)}(hhh]h)}(htarget credentialsh]htarget credentials}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hM? hj/ubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhj/hM? hj/ubj)}(h0``const struct cred *old`` original credentials h](j)}(h``const struct cred *old``h]j)}(hj 0h]hconst struct cred *old}(hj 0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 0ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM@ hj0ubj2)}(hhh]h)}(horiginal credentialsh]horiginal credentials}(hj$0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 0hM@ hj!0ubah}(h]h ]h"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]uh1jhj 0hM@ hj/ubeh}(h]h ]h"]h$]h&]uh1j hj/ubh)}(h**Description**h]j)}(hjF0h]h Description}(hjH0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD0ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMB hj/ubh)}(h/Transfer data from original creds to new creds.h]h/Transfer data from original creds to new creds.}(hj\0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMA hj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_kernel_act_as (C function)c.security_kernel_act_ashNtauh1hhj%hhhNhNubj)}(hhh](j)}(h8int security_kernel_act_as (struct cred *new, u32 secid)h]j)}(h7int security_kernel_act_as(struct cred *new, u32 secid)h](j )}(hinth]hint}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj0hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMh ubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0hhhj0hMh ubj{)}(hsecurity_kernel_act_ash]j)}(hsecurity_kernel_act_ash]hsecurity_kernel_act_as}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj0hhhj0hMh ubj)}(h(struct cred *new, u32 secid)h](j)}(hstruct cred *newh](j)}(hjAh]hstruct}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0ubh)}(hhh]j)}(hcredh]hcred}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj0modnameN classnameNj] j` )}jc ]jf )}jY j0sbc.security_kernel_act_asasbuh1hhj0ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0ubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hnewh]hnew}(hj!1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj0ubj)}(h u32 secidh](h)}(hhh]j)}(hu32h]hu32}(hj=1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:1ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj?1modnameN classnameNj] j` )}jc ]j1c.security_kernel_act_asasbuh1hhj61ubj2)}(h h]h }(hj[1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj61ubj)}(hsecidh]hsecid}(hji1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj61ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj0ubeh}(h]h ]h"]h$]h&]jjuh1jhj0hhhj0hMh ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj0hhhj0hMh ubah}(h]j~0ah ](jjeh"]h$]h&]jj)jhuh1jhj0hMh hj0hhubj)}(hhh]h)}(h*Set the kernel credentials to act as secidh]h*Set the kernel credentials to act as secid}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMh hj1hhubah}(h]h ]h"]h$]h&]uh1jhj0hhhj0hMh ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj1jj1jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct cred *new`` credentials ``u32 secid`` secid **Description** Set the credentials for a kernel service to act as (subjective context). The current task must be the one that nominated **secid**. **Return** Returns 0 if successful.h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMl hj1ubj )}(hhh](j)}(h!``struct cred *new`` credentials h](j)}(h``struct cred *new``h]j)}(hj1h]hstruct cred *new}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMi hj1ubj2)}(hhh]h)}(h credentialsh]h credentials}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMi hj1ubah}(h]h ]h"]h$]h&]uh1j1hj1ubeh}(h]h ]h"]h$]h&]uh1jhj1hMi hj1ubj)}(h``u32 secid`` secid h](j)}(h ``u32 secid``h]j)}(hj 2h]h u32 secid}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 2ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMj hj2ubj2)}(hhh]h)}(hsecidh]hsecid}(hj&2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"2hMj hj#2ubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhj"2hMj hj1ubeh}(h]h ]h"]h$]h&]uh1j hj1ubh)}(h**Description**h]j)}(hjH2h]h Description}(hjJ2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF2ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMl hj1ubh)}(hSet the credentials for a kernel service to act as (subjective context). The current task must be the one that nominated **secid**.h](hySet the credentials for a kernel service to act as (subjective context). The current task must be the one that nominated }(hj^2hhhNhNubj)}(h **secid**h]hsecid}(hjf2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^2ubh.}(hj^2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMk hj1ubh)}(h **Return**h]j)}(hj2h]hReturn}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMn hj1ubh)}(hReturns 0 if successful.h]hReturns 0 if successful.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMo hj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ,security_kernel_create_files_as (C function)!c.security_kernel_create_files_ashNtauh1hhj%hhhNhNubj)}(hhh](j)}(hKint security_kernel_create_files_as (struct cred *new, struct inode *inode)h]j)}(hJint security_kernel_create_files_as(struct cred *new, struct inode *inode)h](j )}(hinth]hint}(hj2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj2hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMw ubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2hhhj2hMw ubj{)}(hsecurity_kernel_create_files_ash]j)}(hsecurity_kernel_create_files_ash]hsecurity_kernel_create_files_as}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj2hhhj2hMw ubj)}(h'(struct cred *new, struct inode *inode)h](j)}(hstruct cred *newh](j)}(hjAh]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubh)}(hhh]j)}(hcredh]hcred}(hj!3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj#3modnameN classnameNj] j` )}jc ]jf )}jY j2sb!c.security_kernel_create_files_asasbuh1hhj2ubj2)}(h h]h }(hjA3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubj)}(hjh]h*}(hjO3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hnewh]hnew}(hj\3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj2ubj)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hju3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq3ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjq3ubh)}(hhh]j)}(hinodeh]hinode}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj3modnameN classnameNj] j` )}jc ]j=3!c.security_kernel_create_files_asasbuh1hhjq3ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjq3ubj)}(hjh]h*}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq3ubj)}(hinodeh]hinode}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj2ubeh}(h]h ]h"]h$]h&]jjuh1jhj2hhhj2hMw ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj2hhhj2hMw ubah}(h]j2ah ](jjeh"]h$]h&]jj)jhuh1jhj2hMw hj2hhubj)}(hhh]h)}(h(Set file creation context using an inodeh]h(Set file creation context using an inode}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMw hj3hhubah}(h]h ]h"]h$]h&]uh1jhj2hhhj2hMw ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4jj4jjjuh1jhhhj%hNhNubj)}(hXN**Parameters** ``struct cred *new`` target credentials ``struct inode *inode`` reference inode **Description** Set the file creation context in a set of credentials to be the same as the objective context of the specified inode. The current task must be the one that nominated **inode**. **Return** Returns 0 if successful.h](h)}(h**Parameters**h]j)}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM{ hj4ubj )}(hhh](j)}(h(``struct cred *new`` target credentials h](j)}(h``struct cred *new``h]j)}(hj74h]hstruct cred *new}(hj94hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj54ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMx hj14ubj2)}(hhh]h)}(htarget credentialsh]htarget credentials}(hjP4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjL4hMx hjM4ubah}(h]h ]h"]h$]h&]uh1j1hj14ubeh}(h]h ]h"]h$]h&]uh1jhjL4hMx hj.4ubj)}(h(``struct inode *inode`` reference inode h](j)}(h``struct inode *inode``h]j)}(hjp4h]hstruct inode *inode}(hjr4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjn4ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMy hjj4ubj2)}(hhh]h)}(hreference inodeh]hreference inode}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hMy hj4ubah}(h]h ]h"]h$]h&]uh1j1hjj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hMy hj.4ubeh}(h]h ]h"]h$]h&]uh1j hj4ubh)}(h**Description**h]j)}(hj4h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM{ hj4ubh)}(hSet the file creation context in a set of credentials to be the same as the objective context of the specified inode. The current task must be the one that nominated **inode**.h](hSet the file creation context in a set of credentials to be the same as the objective context of the specified inode. The current task must be the one that nominated }(hj4hhhNhNubj)}(h **inode**h]hinode}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh.}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMz hj4ubh)}(h **Return**h]j)}(hj4h]hReturn}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM~ hj4ubh)}(hReturns 0 if successful.h]hReturns 0 if successful.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j +security_kernel_module_request (C function) c.security_kernel_module_requesthNtauh1hhj%hhhNhNubj)}(hhh](j)}(h4int security_kernel_module_request (char *kmod_name)h]j)}(h3int security_kernel_module_request(char *kmod_name)h](j )}(hinth]hint}(hj)5hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj%5hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj85hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%5hhhj75hM ubj{)}(hsecurity_kernel_module_requesth]j)}(hsecurity_kernel_module_requesth]hsecurity_kernel_module_request}(hjJ5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF5ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj%5hhhj75hM ubj)}(h(char *kmod_name)h]j)}(hchar *kmod_nameh](j )}(hcharh]hchar}(hjf5hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjb5ubj2)}(h h]h }(hjt5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjb5ubj)}(hjh]h*}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb5ubj)}(h kmod_nameh]h kmod_name}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj^5ubah}(h]h ]h"]h$]h&]jjuh1jhj%5hhhj75hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj!5hhhj75hM ubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1jhj75hM hj5hhubj)}(hhh]h)}(h$Check if loading a module is allowedh]h$Check if loading a module is allowed}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj5hhubah}(h]h ]h"]h$]h&]uh1jhj5hhhj75hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj5jj5jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``char *kmod_name`` module name **Description** Ability to trigger the kernel to automatically upcall to userspace for userspace to load a kernel module with the given name. **Return** Returns 0 if successful.h](h)}(h**Parameters**h]j)}(hj5h]h Parameters}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj5ubj )}(hhh]j)}(h ``char *kmod_name`` module name h](j)}(h``char *kmod_name``h]j)}(hj5h]hchar *kmod_name}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj5ubj2)}(hhh]h)}(h module nameh]h module name}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hM hj6ubah}(h]h ]h"]h$]h&]uh1j1hj5ubeh}(h]h ]h"]h$]h&]uh1jhj6hM hj5ubah}(h]h ]h"]h$]h&]uh1j hj5ubh)}(h**Description**h]j)}(hj56h]h Description}(hj76hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj36ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj5ubh)}(h}Ability to trigger the kernel to automatically upcall to userspace for userspace to load a kernel module with the given name.h]h}Ability to trigger the kernel to automatically upcall to userspace for userspace to load a kernel module with the given name.}(hjK6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj5ubh)}(h **Return**h]j)}(hj\6h]hReturn}(hj^6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ6ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj5ubh)}(hReturns 0 if successful.h]hReturns 0 if successful.}(hjr6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_task_fix_setuid (C function)c.security_task_fix_setuidhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hRint security_task_fix_setuid (struct cred *new, const struct cred *old, int flags)h]j)}(hQint security_task_fix_setuid(struct cred *new, const struct cred *old, int flags)h](j )}(hinth]hint}(hj6hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj6hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6hhhj6hM ubj{)}(hsecurity_task_fix_setuidh]j)}(hsecurity_task_fix_setuidh]hsecurity_task_fix_setuid}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj6hhhj6hM ubj)}(h5(struct cred *new, const struct cred *old, int flags)h](j)}(hstruct cred *newh](j)}(hjAh]hstruct}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubh)}(hhh]j)}(hcredh]hcred}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj6modnameN classnameNj] j` )}jc ]jf )}jY j6sbc.security_task_fix_setuidasbuh1hhj6ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj)}(hjh]h*}(hj*7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hnewh]hnew}(hj77hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj6ubj)}(hconst struct cred *oldh](j)}(hjh]hconst}(hjP7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL7ubj2)}(h h]h }(hj]7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjL7ubj)}(hjAh]hstruct}(hjk7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL7ubj2)}(h h]h }(hjx7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjL7ubh)}(hhh]j)}(hcredh]hcred}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7modnameN classnameNj] j` )}jc ]j7c.security_task_fix_setuidasbuh1hhjL7ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjL7ubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL7ubj)}(holdh]hold}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj6ubj)}(h int flagsh](j )}(hinth]hint}(hj7hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj7ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7ubj)}(hflagsh]hflags}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj6ubeh}(h]h ]h"]h$]h&]jjuh1jhj6hhhj6hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj6hhhj6hM ubah}(h]j6ah ](jjeh"]h$]h&]jj)jhuh1jhj6hM hj6hhubj)}(hhh]h)}(h&Update LSM with new user id attributesh]h&Update LSM with new user id attributes}(hj!8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj8hhubah}(h]h ]h"]h$]h&]uh1jhj6hhhj6hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj98jj98jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct cred *new`` updated credentials ``const struct cred *old`` credentials being replaced ``int flags`` LSM_SETID_* flag values **Description** Update the module's state after setting one or more of the user identity attributes of the current process. The **flags** parameter indicates which of the set*uid system calls invoked this hook. If **new** is the set of credentials that will be installed. Modifications should be made to this rather than to **current->cred**. **Return** Returns 0 on success.h](h)}(h**Parameters**h]j)}(hjC8h]h Parameters}(hjE8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA8ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj=8ubj )}(hhh](j)}(h)``struct cred *new`` updated credentials h](j)}(h``struct cred *new``h]j)}(hjb8h]hstruct cred *new}(hjd8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`8ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj\8ubj2)}(hhh]h)}(hupdated credentialsh]hupdated credentials}(hj{8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjw8hM hjx8ubah}(h]h ]h"]h$]h&]uh1j1hj\8ubeh}(h]h ]h"]h$]h&]uh1jhjw8hM hjY8ubj)}(h6``const struct cred *old`` credentials being replaced h](j)}(h``const struct cred *old``h]j)}(hj8h]hconst struct cred *old}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj8ubj2)}(hhh]h)}(hcredentials being replacedh]hcredentials being replaced}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hM hj8ubah}(h]h ]h"]h$]h&]uh1j1hj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hM hjY8ubj)}(h&``int flags`` LSM_SETID_* flag values h](j)}(h ``int flags``h]j)}(hj8h]h int flags}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj8ubj2)}(hhh]h)}(hLSM_SETID_* flag valuesh]hLSM_SETID_* flag values}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hM hj8ubah}(h]h ]h"]h$]h&]uh1j1hj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hM hjY8ubeh}(h]h ]h"]h$]h&]uh1j hj=8ubh)}(h**Description**h]j)}(hj9h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 9ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj=8ubh)}(hXIUpdate the module's state after setting one or more of the user identity attributes of the current process. The **flags** parameter indicates which of the set*uid system calls invoked this hook. If **new** is the set of credentials that will be installed. Modifications should be made to this rather than to **current->cred**.h](hsUpdate the module’s state after setting one or more of the user identity attributes of the current process. The }(hj%9hhhNhNubj)}(h **flags**h]hflags}(hj-9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%9ubhN parameter indicates which of the set*uid system calls invoked this hook. If }(hj%9hhhNhNubj)}(h**new**h]hnew}(hj?9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%9ubhh is the set of credentials that will be installed. Modifications should be made to this rather than to }(hj%9hhhNhNubj)}(h**current->cred**h]h current->cred}(hjQ9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%9ubh.}(hj%9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj=8ubh)}(h **Return**h]j)}(hjl9h]hReturn}(hjn9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj9ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj=8ubh)}(hReturns 0 on success.h]hReturns 0 on success.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj=8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_task_fix_setgid (C function)c.security_task_fix_setgidhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hRint security_task_fix_setgid (struct cred *new, const struct cred *old, int flags)h]j)}(hQint security_task_fix_setgid(struct cred *new, const struct cred *old, int flags)h](j )}(hinth]hint}(hj9hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj9hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9hhhj9hM ubj{)}(hsecurity_task_fix_setgidh]j)}(hsecurity_task_fix_setgidh]hsecurity_task_fix_setgid}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj9hhhj9hM ubj)}(h5(struct cred *new, const struct cred *old, int flags)h](j)}(hstruct cred *newh](j)}(hjAh]hstruct}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubh)}(hhh]j)}(hcredh]hcred}(hj :hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj :ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj:modnameN classnameNj] j` )}jc ]jf )}jY j9sbc.security_task_fix_setgidasbuh1hhj9ubj2)}(h h]h }(hj,:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubj)}(hjh]h*}(hj::hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hnewh]hnew}(hjG:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubj)}(hconst struct cred *oldh](j)}(hjh]hconst}(hj`:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\:ubj2)}(h h]h }(hjm:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\:ubj)}(hjAh]hstruct}(hj{:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\:ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\:ubh)}(hhh]j)}(hcredh]hcred}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj:modnameN classnameNj] j` )}jc ]j(:c.security_task_fix_setgidasbuh1hhj\:ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\:ubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\:ubj)}(holdh]hold}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubj)}(h int flagsh](j )}(hinth]hint}(hj:hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj:ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(hflagsh]hflags}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubeh}(h]h ]h"]h$]h&]jjuh1jhj9hhhj9hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj9hhhj9hM ubah}(h]j9ah ](jjeh"]h$]h&]jj)jhuh1jhj9hM hj9hhubj)}(hhh]h)}(h'Update LSM with new group id attributesh]h'Update LSM with new group id attributes}(hj1;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj.;hhubah}(h]h ]h"]h$]h&]uh1jhj9hhhj9hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjI;jjI;jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct cred *new`` updated credentials ``const struct cred *old`` credentials being replaced ``int flags`` LSM_SETID_* flag value **Description** Update the module's state after setting one or more of the group identity attributes of the current process. The **flags** parameter indicates which of the set*gid system calls invoked this hook. **new** is the set of credentials that will be installed. Modifications should be made to this rather than to **current->cred**. **Return** Returns 0 on success.h](h)}(h**Parameters**h]j)}(hjS;h]h Parameters}(hjU;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ;ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjM;ubj )}(hhh](j)}(h)``struct cred *new`` updated credentials h](j)}(h``struct cred *new``h]j)}(hjr;h]hstruct cred *new}(hjt;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp;ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjl;ubj2)}(hhh]h)}(hupdated credentialsh]hupdated credentials}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hM hj;ubah}(h]h ]h"]h$]h&]uh1j1hjl;ubeh}(h]h ]h"]h$]h&]uh1jhj;hM hji;ubj)}(h6``const struct cred *old`` credentials being replaced h](j)}(h``const struct cred *old``h]j)}(hj;h]hconst struct cred *old}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj;ubj2)}(hhh]h)}(hcredentials being replacedh]hcredentials being replaced}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hM hj;ubah}(h]h ]h"]h$]h&]uh1j1hj;ubeh}(h]h ]h"]h$]h&]uh1jhj;hM hji;ubj)}(h%``int flags`` LSM_SETID_* flag value h](j)}(h ``int flags``h]j)}(hj;h]h int flags}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj;ubj2)}(hhh]h)}(hLSM_SETID_* flag valueh]hLSM_SETID_* flag value}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hM hj;ubah}(h]h ]h"]h$]h&]uh1j1hj;ubeh}(h]h ]h"]h$]h&]uh1jhj;hM hji;ubeh}(h]h ]h"]h$]h&]uh1j hjM;ubh)}(h**Description**h]j)}(hj<h]h Description}(hj!<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjM;ubh)}(hXGUpdate the module's state after setting one or more of the group identity attributes of the current process. The **flags** parameter indicates which of the set*gid system calls invoked this hook. **new** is the set of credentials that will be installed. Modifications should be made to this rather than to **current->cred**.h](htUpdate the module’s state after setting one or more of the group identity attributes of the current process. The }(hj5<hhhNhNubj)}(h **flags**h]hflags}(hj=<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5<ubhK parameter indicates which of the set*gid system calls invoked this hook. }(hj5<hhhNhNubj)}(h**new**h]hnew}(hjO<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5<ubhh is the set of credentials that will be installed. Modifications should be made to this rather than to }(hj5<hhhNhNubj)}(h**current->cred**h]h current->cred}(hja<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5<ubh.}(hj5<hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjM;ubh)}(h **Return**h]j)}(hj|<h]hReturn}(hj~<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz<ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjM;ubh)}(hReturns 0 on success.h]hReturns 0 on success.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjM;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_task_fix_setgroups (C function)c.security_task_fix_setgroupshNtauh1hhj%hhhNhNubj)}(hhh](j)}(hJint security_task_fix_setgroups (struct cred *new, const struct cred *old)h]j)}(hIint security_task_fix_setgroups(struct cred *new, const struct cred *old)h](j )}(hinth]hint}(hj<hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj<hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<hhhj<hM ubj{)}(hsecurity_task_fix_setgroupsh]j)}(hsecurity_task_fix_setgroupsh]hsecurity_task_fix_setgroups}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj<hhhj<hM ubj)}(h*(struct cred *new, const struct cred *old)h](j)}(hstruct cred *newh](j)}(hjAh]hstruct}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj2)}(h h]h }(hj =hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubh)}(hhh]j)}(hcredh]hcred}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj=modnameN classnameNj] j` )}jc ]jf )}jY j<sbc.security_task_fix_setgroupsasbuh1hhj<ubj2)}(h h]h }(hj<=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubj)}(hjh]h*}(hjJ=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hnewh]hnew}(hjW=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<ubj)}(hconst struct cred *oldh](j)}(hjh]hconst}(hjp=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl=ubj2)}(h h]h }(hj}=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjl=ubj)}(hjAh]hstruct}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl=ubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjl=ubh)}(hhh]j)}(hcredh]hcred}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj=modnameN classnameNj] j` )}jc ]j8=c.security_task_fix_setgroupsasbuh1hhjl=ubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjl=ubj)}(hjh]h*}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl=ubj)}(holdh]hold}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl=ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<ubeh}(h]h ]h"]h$]h&]jjuh1jhj<hhhj<hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj<hhhj<hM ubah}(h]j<ah ](jjeh"]h$]h&]jj)jhuh1jhj<hM hj<hhubj)}(hhh]h)}(h(Update LSM with new supplementary groupsh]h(Update LSM with new supplementary groups}(hj >hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj >hhubah}(h]h ]h"]h$]h&]uh1jhj<hhhj<hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj$>jj$>jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct cred *new`` updated credentials ``const struct cred *old`` credentials being replaced **Description** Update the module's state after setting the supplementary group identity attributes of the current process. **new** is the set of credentials that will be installed. Modifications should be made to this rather than to **current->cred**. **Return** Returns 0 on success.h](h)}(h**Parameters**h]j)}(hj.>h]h Parameters}(hj0>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,>ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(>ubj )}(hhh](j)}(h)``struct cred *new`` updated credentials h](j)}(h``struct cred *new``h]j)}(hjM>h]hstruct cred *new}(hjO>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK>ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjG>ubj2)}(hhh]h)}(hupdated credentialsh]hupdated credentials}(hjf>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb>hM hjc>ubah}(h]h ]h"]h$]h&]uh1j1hjG>ubeh}(h]h ]h"]h$]h&]uh1jhjb>hM hjD>ubj)}(h6``const struct cred *old`` credentials being replaced h](j)}(h``const struct cred *old``h]j)}(hj>h]hconst struct cred *old}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj>ubj2)}(hhh]h)}(hcredentials being replacedh]hcredentials being replaced}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hM hj>ubah}(h]h ]h"]h$]h&]uh1j1hj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hM hjD>ubeh}(h]h ]h"]h$]h&]uh1j hj(>ubh)}(h**Description**h]j)}(hj>h]h Description}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(>ubh)}(hUpdate the module's state after setting the supplementary group identity attributes of the current process. **new** is the set of credentials that will be installed. Modifications should be made to this rather than to **current->cred**.h](hoUpdate the module’s state after setting the supplementary group identity attributes of the current process. }(hj>hhhNhNubj)}(h**new**h]hnew}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubhh is the set of credentials that will be installed. Modifications should be made to this rather than to }(hj>hhhNhNubj)}(h**current->cred**h]h current->cred}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh.}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(>ubh)}(h **Return**h]j)}(hj ?h]hReturn}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ?ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(>ubh)}(hReturns 0 on success.h]hReturns 0 on success.}(hj"?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj(>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_task_setpgid (C function)c.security_task_setpgidhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h=int security_task_setpgid (struct task_struct *p, pid_t pgid)h]j)}(hah"]h$]h&]uh1j1hjM?hhhj_?hM ubj{)}(hsecurity_task_setpgidh]j)}(hsecurity_task_setpgidh]hsecurity_task_setpgid}(hjr?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn?ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjM?hhhj_?hM ubj)}(h#(struct task_struct *p, pid_t pgid)h](j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubh)}(hhh]j)}(h task_structh]h task_struct}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj?modnameN classnameNj] j` )}jc ]jf )}jY jt?sbc.security_task_setpgidasbuh1hhj?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubj)}(hjh]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hjh]hp}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj?ubj)}(h pid_t pgidh](h)}(hhh]j)}(hpid_th]hpid_t}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj@modnameN classnameNj] j` )}jc ]j?c.security_task_setpgidasbuh1hhj?ubj2)}(h h]h }(hj @hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubj)}(hpgidh]hpgid}(hj.@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj?ubeh}(h]h ]h"]h$]h&]jjuh1jhjM?hhhj_?hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjI?hhhj_?hM ubah}(h]jD?ah ](jjeh"]h$]h&]jj)jhuh1jhj_?hM hjF?hhubj)}(hhh]h)}(h$Check if setting the pgid is allowedh]h$Check if setting the pgid is allowed}(hjX@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjU@hhubah}(h]h ]h"]h$]h&]uh1jhjF?hhhj_?hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjp@jjp@jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *p`` task being modified ``pid_t pgid`` new pgid **Description** Check permission before setting the process group identifier of the process **p** to **pgid**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjz@h]h Parameters}(hj|@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx@ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjt@ubj )}(hhh](j)}(h.``struct task_struct *p`` task being modified h](j)}(h``struct task_struct *p``h]j)}(hj@h]hstruct task_struct *p}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj@ubj2)}(hhh]h)}(htask being modifiedh]htask being modified}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hM hj@ubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hM hj@ubj)}(h``pid_t pgid`` new pgid h](j)}(h``pid_t pgid``h]j)}(hj@h]h pid_t pgid}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj@ubj2)}(hhh]h)}(hnew pgidh]hnew pgid}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hM hj@ubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hM hj@ubeh}(h]h ]h"]h$]h&]uh1j hjt@ubh)}(h**Description**h]j)}(hj Ah]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Aubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjt@ubh)}(h^Check permission before setting the process group identifier of the process **p** to **pgid**.h](hLCheck permission before setting the process group identifier of the process }(hj#AhhhNhNubj)}(h**p**h]hp}(hj+AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#Aubh to }(hj#AhhhNhNubj)}(h**pgid**h]hpgid}(hj=AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#Aubh.}(hj#AhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjt@ubh)}(h **Return**h]j)}(hjXAh]hReturn}(hjZAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVAubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjt@ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjnAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjt@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_task_getpgid (C function)c.security_task_getpgidhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h1int security_task_getpgid (struct task_struct *p)h]j)}(h0int security_task_getpgid(struct task_struct *p)h](j )}(hinth]hint}(hjAhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjAhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM' ubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAhhhjAhM' ubj{)}(hsecurity_task_getpgidh]j)}(hsecurity_task_getpgidh]hsecurity_task_getpgid}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjAhhhjAhM' ubj)}(h(struct task_struct *p)h]j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubh)}(hhh]j)}(h task_structh]h task_struct}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjAmodnameN classnameNj] j` )}jc ]jf )}jY jAsbc.security_task_getpgidasbuh1hhjAubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubj)}(hjh]h*}(hj&BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(hjh]hp}(hj3BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjAubah}(h]h ]h"]h$]h&]jjuh1jhjAhhhjAhM' ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjAhhhjAhM' ubah}(h]jAah ](jjeh"]h$]h&]jj)jhuh1jhjAhM' hjAhhubj)}(hhh]h)}(h$Check if getting the pgid is allowedh]h$Check if getting the pgid is allowed}(hj\BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM' hjYBhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjAhM' ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjtBjjtBjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *p`` task **Description** Check permission before getting the process group identifier of the process **p**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj~Bh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|Bubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM+ hjxBubj )}(hhh]j)}(h``struct task_struct *p`` task h](j)}(h``struct task_struct *p``h]j)}(hjBh]hstruct task_struct *p}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM( hjBubj2)}(hhh]h)}(htaskh]htask}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhM( hjBubah}(h]h ]h"]h$]h&]uh1j1hjBubeh}(h]h ]h"]h$]h&]uh1jhjBhM( hjBubah}(h]h ]h"]h$]h&]uh1j hjxBubh)}(h**Description**h]j)}(hjBh]h Description}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM* hjxBubh)}(hRCheck permission before getting the process group identifier of the process **p**.h](hLCheck permission before getting the process group identifier of the process }(hjBhhhNhNubj)}(h**p**h]hp}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubh.}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM) hjxBubh)}(h **Return**h]j)}(hjCh]hReturn}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM, hjxBubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj'ChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM- hjxBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !security_task_getsid (C function)c.security_task_getsidhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h0int security_task_getsid (struct task_struct *p)h]j)}(h/int security_task_getsid(struct task_struct *p)h](j )}(hinth]hint}(hjVChhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjRChhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5 ubj2)}(h h]h }(hjeChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRChhhjdChM5 ubj{)}(hsecurity_task_getsidh]j)}(hsecurity_task_getsidh]hsecurity_task_getsid}(hjwChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsCubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjRChhhjdChM5 ubj)}(h(struct task_struct *p)h]j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubh)}(hhh]j)}(h task_structh]h task_struct}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjCmodnameN classnameNj] j` )}jc ]jf )}jY jyCsbc.security_task_getsidasbuh1hhjCubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjCubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hjh]hp}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubah}(h]h ]h"]h$]h&]jjuh1jhjRChhhjdChM5 ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjNChhhjdChM5 ubah}(h]jICah ](jjeh"]h$]h&]jj)jhuh1jhjdChM5 hjKChhubj)}(hhh]h)}(h*Check if getting the session id is allowedh]h*Check if getting the session id is allowed}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5 hjDhhubah}(h]h ]h"]h$]h&]uh1jhjKChhhjdChM5 ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj-Djj-Djjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *p`` task **Description** Check permission before getting the session identifier of the process **p**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj7Dh]h Parameters}(hj9DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5Dubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM9 hj1Dubj )}(hhh]j)}(h``struct task_struct *p`` task h](j)}(h``struct task_struct *p``h]j)}(hjVDh]hstruct task_struct *p}(hjXDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTDubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM6 hjPDubj2)}(hhh]h)}(htaskh]htask}(hjoDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkDhM6 hjlDubah}(h]h ]h"]h$]h&]uh1j1hjPDubeh}(h]h ]h"]h$]h&]uh1jhjkDhM6 hjMDubah}(h]h ]h"]h$]h&]uh1j hj1Dubh)}(h**Description**h]j)}(hjDh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM8 hj1Dubh)}(hLCheck permission before getting the session identifier of the process **p**.h](hFCheck permission before getting the session identifier of the process }(hjDhhhNhNubj)}(h**p**h]hp}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh.}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM7 hj1Dubh)}(h **Return**h]j)}(hjDh]hReturn}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM9 hj1Dubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM: hj1Dubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_task_setnice (C function)c.security_task_setnicehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h;int security_task_setnice (struct task_struct *p, int nice)h]j)}(h:int security_task_setnice(struct task_struct *p, int nice)h](j )}(hinth]hint}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj EhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM_ ubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj EhhhjEhM_ ubj{)}(hsecurity_task_setniceh]j)}(hsecurity_task_setniceh]hsecurity_task_setnice}(hj0EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,Eubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj EhhhjEhM_ ubj)}(h!(struct task_struct *p, int nice)h](j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hjLEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHEubj2)}(h h]h }(hjYEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHEubh)}(hhh]j)}(h task_structh]h task_struct}(hjjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgEubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlEmodnameN classnameNj] j` )}jc ]jf )}jY j2Esbc.security_task_setniceasbuh1hhjHEubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHEubj)}(hjh]h*}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHEubj)}(hjh]hp}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHEubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDEubj)}(hint niceh](j )}(hinth]hint}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjEubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEubj)}(hniceh]hnice}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDEubeh}(h]h ]h"]h$]h&]jjuh1jhj EhhhjEhM_ ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjEhhhjEhM_ ubah}(h]jEah ](jjeh"]h$]h&]jj)jhuh1jhjEhM_ hjEhhubj)}(hhh]h)}(h/Check if setting a task's nice value is allowedh]h1Check if setting a task’s nice value is allowed}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM_ hjFhhubah}(h]h ]h"]h$]h&]uh1jhjEhhhjEhM_ ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjFjjFjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *p`` target task ``int nice`` nice value **Description** Check permission before setting the nice value of **p** to **nice**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj%Fh]h Parameters}(hj'FhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#Fubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMc hjFubj )}(hhh](j)}(h&``struct task_struct *p`` target task h](j)}(h``struct task_struct *p``h]j)}(hjDFh]hstruct task_struct *p}(hjFFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBFubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM` hj>Fubj2)}(hhh]h)}(h target taskh]h target task}(hj]FhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYFhM` hjZFubah}(h]h ]h"]h$]h&]uh1j1hj>Fubeh}(h]h ]h"]h$]h&]uh1jhjYFhM` hj;Fubj)}(h``int nice`` nice value h](j)}(h ``int nice``h]j)}(hj}Fh]hint nice}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{Fubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMa hjwFubj2)}(hhh]h)}(h nice valueh]h nice value}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMa hjFubah}(h]h ]h"]h$]h&]uh1j1hjwFubeh}(h]h ]h"]h$]h&]uh1jhjFhMa hj;Fubeh}(h]h ]h"]h$]h&]uh1j hjFubh)}(h**Description**h]j)}(hjFh]h Description}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMc hjFubh)}(hDCheck permission before setting the nice value of **p** to **nice**.h](h2Check permission before setting the nice value of }(hjFhhhNhNubj)}(h**p**h]hp}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubh to }(hjFhhhNhNubj)}(h**nice**h]hnice}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubh.}(hjFhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMb hjFubh)}(h **Return**h]j)}(hjGh]hReturn}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMd hjFubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMe hjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_task_setioprio (C function)c.security_task_setiopriohNtauh1hhj%hhhNhNubj)}(hhh](j)}(h?int security_task_setioprio (struct task_struct *p, int ioprio)h]j)}(h>int security_task_setioprio(struct task_struct *p, int ioprio)h](j )}(hinth]hint}(hjHGhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjDGhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMm ubj2)}(h h]h }(hjWGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDGhhhjVGhMm ubj{)}(hsecurity_task_setioprioh]j)}(hsecurity_task_setioprioh]hsecurity_task_setioprio}(hjiGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeGubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjDGhhhjVGhMm ubj)}(h#(struct task_struct *p, int ioprio)h](j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubh)}(hhh]j)}(h task_structh]h task_struct}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjGmodnameN classnameNj] j` )}jc ]jf )}jY jkGsbc.security_task_setioprioasbuh1hhjGubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubj)}(hjh]h*}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj)}(hjh]hp}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj}Gubj)}(h int ioprioh](j )}(hinth]hint}(hjGhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjGubj2)}(h h]h }(hjHhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubj)}(hioprioh]hioprio}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj}Gubeh}(h]h ]h"]h$]h&]jjuh1jhjDGhhhjVGhMm ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj@GhhhjVGhMm ubah}(h]j;Gah ](jjeh"]h$]h&]jj)jhuh1jhjVGhMm hj=Ghhubj)}(hhh]h)}(h+Check if setting a task's ioprio is allowedh]h-Check if setting a task’s ioprio is allowed}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:Iubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMr hjXHubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjRIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMs hjXHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_task_getioprio (C function)c.security_task_getiopriohNtauh1hhj%hhhNhNubj)}(hhh](j)}(h3int security_task_getioprio (struct task_struct *p)h]j)}(h2int security_task_getioprio(struct task_struct *p)h](j )}(hinth]hint}(hjIhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}IhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM{ ubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}IhhhjIhM{ ubj{)}(hsecurity_task_getioprioh]j)}(hsecurity_task_getioprioh]hsecurity_task_getioprio}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj}IhhhjIhM{ ubj)}(h(struct task_struct *p)h]j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubh)}(hhh]j)}(h task_structh]h task_struct}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjImodnameN classnameNj] j` )}jc ]jf )}jY jIsbc.security_task_getioprioasbuh1hhjIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjh]h*}(hj JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hjh]hp}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjIubah}(h]h ]h"]h$]h&]jjuh1jhj}IhhhjIhM{ ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjyIhhhjIhM{ ubah}(h]jtIah ](jjeh"]h$]h&]jj)jhuh1jhjIhM{ hjvIhhubj)}(hhh]h)}(h+Check if getting a task's ioprio is allowedh]h-Check if getting a task’s ioprio is allowed}(hj@JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM{ hj=Jhhubah}(h]h ]h"]h$]h&]uh1jhjvIhhhjIhM{ ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjXJjjXJjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *p`` task **Description** Check permission before getting the ioprio value of **p**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjbJh]h Parameters}(hjdJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`Jubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj\Jubj )}(hhh]j)}(h``struct task_struct *p`` task h](j)}(h``struct task_struct *p``h]j)}(hjJh]hstruct task_struct *p}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM| hj{Jubj2)}(hhh]h)}(htaskh]htask}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhM| hjJubah}(h]h ]h"]h$]h&]uh1j1hj{Jubeh}(h]h ]h"]h$]h&]uh1jhjJhM| hjxJubah}(h]h ]h"]h$]h&]uh1j hj\Jubh)}(h**Description**h]j)}(hjJh]h Description}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM~ hj\Jubh)}(h:Check permission before getting the ioprio value of **p**.h](h4Check permission before getting the ioprio value of }(hjJhhhNhNubj)}(h**p**h]hp}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh.}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM} hj\Jubh)}(h **Return**h]j)}(hjJh]hReturn}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj\Jubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj KhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj\Jubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_task_prlimit (C function)c.security_task_prlimithNtauh1hhj%hhhNhNubj)}(hhh](j)}(haint security_task_prlimit (const struct cred *cred, const struct cred *tcred, unsigned int flags)h]j)}(h`int security_task_prlimit(const struct cred *cred, const struct cred *tcred, unsigned int flags)h](j )}(hinth]hint}(hj:KhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj6KhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjIKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6KhhhjHKhM ubj{)}(hsecurity_task_prlimith]j)}(hsecurity_task_prlimith]hsecurity_task_prlimit}(hj[KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWKubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj6KhhhjHKhM ubj)}(hG(const struct cred *cred, const struct cred *tcred, unsigned int flags)h](j)}(hconst struct cred *credh](j)}(hjh]hconst}(hjwKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsKubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjsKubj)}(hjAh]hstruct}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsKubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjsKubh)}(hhh]j)}(hcredh]hcred}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjKmodnameN classnameNj] j` )}jc ]jf )}jY j]Ksbc.security_task_prlimitasbuh1hhjsKubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjsKubj)}(hjh]h*}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsKubj)}(hcredh]hcred}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjoKubj)}(hconst struct cred *tcredh](j)}(hjh]hconst}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hjAh]hstruct}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj2)}(h h]h }(hj,LhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubh)}(hhh]j)}(hcredh]hcred}(hj=LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:Lubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj?LmodnameN classnameNj] j` )}jc ]jKc.security_task_prlimitasbuh1hhjLubj2)}(h h]h }(hj[LhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hjh]h*}(hjiLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(htcredh]htcred}(hjvLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjoKubj)}(hunsigned int flagsh](j )}(hunsignedh]hunsigned}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj )}(hinth]hint}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hflagsh]hflags}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjoKubeh}(h]h ]h"]h$]h&]jjuh1jhj6KhhhjHKhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj2KhhhjHKhM ubah}(h]j-Kah ](jjeh"]h$]h&]jj)jhuh1jhjHKhM hj/Khhubj)}(hhh]h)}(h0Check if get/setting resources limits is allowedh]h0Check if get/setting resources limits is allowed}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjLhhubah}(h]h ]h"]h$]h&]uh1jhj/KhhhjHKhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj Mjj Mjjjuh1jhhhj%hNhNubj)}(hXa**Parameters** ``const struct cred *cred`` current task credentials ``const struct cred *tcred`` target task credentials ``unsigned int flags`` LSM_PRLIMIT_* flag bits indicating a get/set/both **Description** Check permission before getting and/or setting the resource limits of another task. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjMh]h Parameters}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj Mubj )}(hhh](j)}(h5``const struct cred *cred`` current task credentials h](j)}(h``const struct cred *cred``h]j)}(hj2Mh]hconst struct cred *cred}(hj4MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0Mubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj,Mubj2)}(hhh]h)}(hcurrent task credentialsh]hcurrent task credentials}(hjKMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGMhM hjHMubah}(h]h ]h"]h$]h&]uh1j1hj,Mubeh}(h]h ]h"]h$]h&]uh1jhjGMhM hj)Mubj)}(h5``const struct cred *tcred`` target task credentials h](j)}(h``const struct cred *tcred``h]j)}(hjkMh]hconst struct cred *tcred}(hjmMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiMubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjeMubj2)}(hhh]h)}(htarget task credentialsh]htarget task credentials}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhM hjMubah}(h]h ]h"]h$]h&]uh1j1hjeMubeh}(h]h ]h"]h$]h&]uh1jhjMhM hj)Mubj)}(hI``unsigned int flags`` LSM_PRLIMIT_* flag bits indicating a get/set/both h](j)}(h``unsigned int flags``h]j)}(hjMh]hunsigned int flags}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjMubj2)}(hhh]h)}(h1LSM_PRLIMIT_* flag bits indicating a get/set/bothh]h1LSM_PRLIMIT_* flag bits indicating a get/set/both}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhM hjMubah}(h]h ]h"]h$]h&]uh1j1hjMubeh}(h]h ]h"]h$]h&]uh1jhjMhM hj)Mubeh}(h]h ]h"]h$]h&]uh1j hj Mubh)}(h**Description**h]j)}(hjMh]h Description}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj Mubh)}(hSCheck permission before getting and/or setting the resource limits of another task.h]hSCheck permission before getting and/or setting the resource limits of another task.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj Mubh)}(h **Return**h]j)}(hjNh]hReturn}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj Mubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj Mubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_task_setrlimit (C function)c.security_task_setrlimithNtauh1hhj%hhhNhNubj)}(hhh](j)}(hcint security_task_setrlimit (struct task_struct *p, unsigned int resource, struct rlimit *new_rlim)h]j)}(hbint security_task_setrlimit(struct task_struct *p, unsigned int resource, struct rlimit *new_rlim)h](j )}(hinth]hint}(hjKNhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjGNhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjZNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGNhhhjYNhM ubj{)}(hsecurity_task_setrlimith]j)}(hsecurity_task_setrlimith]hsecurity_task_setrlimit}(hjlNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhNubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjGNhhhjYNhM ubj)}(hG(struct task_struct *p, unsigned int resource, struct rlimit *new_rlim)h](j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubh)}(hhh]j)}(h task_structh]h task_struct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjNmodnameN classnameNj] j` )}jc ]jf )}jY jnNsbc.security_task_setrlimitasbuh1hhjNubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj)}(hjh]hp}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjNubj)}(hunsigned int resourceh](j )}(hunsignedh]hunsigned}(hjNhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjNubj2)}(h h]h }(hjOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj )}(hinth]hint}(hjOhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjNubj2)}(h h]h }(hj#OhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj)}(hresourceh]hresource}(hj1OhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjNubj)}(hstruct rlimit *new_rlimh](j)}(hjAh]hstruct}(hjJOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFOubj2)}(h h]h }(hjWOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFOubh)}(hhh]j)}(hrlimith]hrlimit}(hjhOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeOubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjjOmodnameN classnameNj] j` )}jc ]jNc.security_task_setrlimitasbuh1hhjFOubj2)}(h h]h }(hjOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFOubj)}(hjh]h*}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFOubj)}(hnew_rlimh]hnew_rlim}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFOubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjNubeh}(h]h ]h"]h$]h&]jjuh1jhjGNhhhjYNhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjCNhhhjYNhM ubah}(h]j>Nah ](jjeh"]h$]h&]jj)jhuh1jhjYNhM hj@Nhhubj)}(hhh]h)}(h.Check if setting a new rlimit value is allowedh]h.Check if setting a new rlimit value is allowed}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjOhhubah}(h]h ]h"]h$]h&]uh1jhj@NhhhjYNhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjOjjOjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct task_struct *p`` target task's group leader ``unsigned int resource`` resource whose limit is being set ``struct rlimit *new_rlim`` new resource limit **Description** Check permission before setting the resource limits of process **p** for **resource** to **new_rlim**. The old resource limit values can be examined by dereferencing (p->signal->rlim + resource). **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjOh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjOubj )}(hhh](j)}(h5``struct task_struct *p`` target task's group leader h](j)}(h``struct task_struct *p``h]j)}(hj Ph]hstruct task_struct *p}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Pubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjPubj2)}(hhh]h)}(htarget task's group leaderh]htarget task’s group leader}(hj%PhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!PhM hj"Pubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhj!PhM hjPubj)}(h<``unsigned int resource`` resource whose limit is being set h](j)}(h``unsigned int resource``h]j)}(hjEPh]hunsigned int resource}(hjGPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCPubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj?Pubj2)}(hhh]h)}(h!resource whose limit is being seth]h!resource whose limit is being set}(hj^PhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZPhM hj[Pubah}(h]h ]h"]h$]h&]uh1j1hj?Pubeh}(h]h ]h"]h$]h&]uh1jhjZPhM hjPubj)}(h/``struct rlimit *new_rlim`` new resource limit h](j)}(h``struct rlimit *new_rlim``h]j)}(hj~Ph]hstruct rlimit *new_rlim}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|Pubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjxPubj2)}(hhh]h)}(hnew resource limith]hnew resource limit}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhM hjPubah}(h]h ]h"]h$]h&]uh1j1hjxPubeh}(h]h ]h"]h$]h&]uh1jhjPhM hjPubeh}(h]h ]h"]h$]h&]uh1j hjOubh)}(h**Description**h]j)}(hjPh]h Description}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjOubh)}(hCheck permission before setting the resource limits of process **p** for **resource** to **new_rlim**. The old resource limit values can be examined by dereferencing (p->signal->rlim + resource).h](h?Check permission before setting the resource limits of process }(hjPhhhNhNubj)}(h**p**h]hp}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh for }(hjPhhhNhNubj)}(h **resource**h]hresource}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh to }(hjPhhhNhNubj)}(h **new_rlim**h]hnew_rlim}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh_. The old resource limit values can be examined by dereferencing (p->signal->rlim + resource).}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjOubh)}(h **Return**h]j)}(hjQh]hReturn}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjOubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj,QhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjOubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_task_setscheduler (C function)c.security_task_setschedulerhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h6int security_task_setscheduler (struct task_struct *p)h]j)}(h5int security_task_setscheduler(struct task_struct *p)h](j )}(hinth]hint}(hj[QhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWQhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWQhhhjiQhM ubj{)}(hsecurity_task_setschedulerh]j)}(hsecurity_task_setschedulerh]hsecurity_task_setscheduler}(hj|QhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxQubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjWQhhhjiQhM ubj)}(h(struct task_struct *p)h]j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubh)}(hhh]j)}(h task_structh]h task_struct}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjQmodnameN classnameNj] j` )}jc ]jf )}jY j~Qsbc.security_task_setschedulerasbuh1hhjQubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hjh]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(hjh]hp}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubah}(h]h ]h"]h$]h&]jjuh1jhjWQhhhjiQhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjSQhhhjiQhM ubah}(h]jNQah ](jjeh"]h$]h&]jj)jhuh1jhjiQhM hjPQhhubj)}(hhh]h)}(h.Check if setting sched policy/param is allowedh]h.Check if setting sched policy/param is allowed}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjRhhubah}(h]h ]h"]h$]h&]uh1jhjPQhhhjiQhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj2Rjj2Rjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *p`` target task **Description** Check permission before setting scheduling policy and/or parameters of process **p**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:Rubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj6Rubj )}(hhh]j)}(h&``struct task_struct *p`` target task h](j)}(h``struct task_struct *p``h]j)}(hj[Rh]hstruct task_struct *p}(hj]RhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYRubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjURubj2)}(hhh]h)}(h target taskh]h target task}(hjtRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjpRhM hjqRubah}(h]h ]h"]h$]h&]uh1j1hjURubeh}(h]h ]h"]h$]h&]uh1jhjpRhM hjRRubah}(h]h ]h"]h$]h&]uh1j hj6Rubh)}(h**Description**h]j)}(hjRh]h Description}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj6Rubh)}(hUCheck permission before setting scheduling policy and/or parameters of process **p**.h](hOCheck permission before setting scheduling policy and/or parameters of process }(hjRhhhNhNubj)}(h**p**h]hp}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubh.}(hjRhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj6Rubh)}(h **Return**h]j)}(hjRh]hReturn}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj6Rubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj6Rubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_task_getscheduler (C function)c.security_task_getschedulerhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h6int security_task_getscheduler (struct task_struct *p)h]j)}(h5int security_task_getscheduler(struct task_struct *p)h](j )}(hinth]hint}(hjShhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjShhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj#ShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjShhhj"ShM ubj{)}(hsecurity_task_getschedulerh]j)}(hsecurity_task_getschedulerh]hsecurity_task_getscheduler}(hj5ShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1Subah}(h]h ](jjeh"]h$]h&]jjuh1jzhjShhhj"ShM ubj)}(h(struct task_struct *p)h]j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hjQShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMSubj2)}(h h]h }(hj^ShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMSubh)}(hhh]j)}(h task_structh]h task_struct}(hjoShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlSubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjqSmodnameN classnameNj] j` )}jc ]jf )}jY j7Ssbc.security_task_getschedulerasbuh1hhjMSubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMSubj)}(hjh]h*}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMSubj)}(hjh]hp}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjISubah}(h]h ]h"]h$]h&]jjuh1jhjShhhj"ShM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj Shhhj"ShM ubah}(h]jSah ](jjeh"]h$]h&]jj)jhuh1jhj"ShM hj Shhubj)}(hhh]h)}(h+Check if getting scheduling info is allowedh]h+Check if getting scheduling info is allowed}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjShhubah}(h]h ]h"]h$]h&]uh1jhj Shhhj"ShM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjSjjSjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *p`` target task **Description** Check permission before obtaining scheduling information for process **p**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjSh]h Parameters}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjSubj )}(hhh]j)}(h&``struct task_struct *p`` target task h](j)}(h``struct task_struct *p``h]j)}(hjTh]hstruct task_struct *p}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjTubj2)}(hhh]h)}(h target taskh]h target task}(hj-ThhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)ThM hj*Tubah}(h]h ]h"]h$]h&]uh1j1hjTubeh}(h]h ]h"]h$]h&]uh1jhj)ThM hj Tubah}(h]h ]h"]h$]h&]uh1j hjSubh)}(h**Description**h]j)}(hjOTh]h Description}(hjQThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMTubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjSubh)}(hKCheck permission before obtaining scheduling information for process **p**.h](hECheck permission before obtaining scheduling information for process }(hjeThhhNhNubj)}(h**p**h]hp}(hjmThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeTubh.}(hjeThhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjSubh)}(h **Return**h]j)}(hjTh]hReturn}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjSubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_task_movememory (C function)c.security_task_movememoryhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h4int security_task_movememory (struct task_struct *p)h]j)}(h3int security_task_movememory(struct task_struct *p)h](j )}(hinth]hint}(hjThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjThhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjThhhjThM ubj{)}(hsecurity_task_movememoryh]j)}(hsecurity_task_movememoryh]hsecurity_task_movememory}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjThhhjThM ubj)}(h(struct task_struct *p)h]j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hj UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubh)}(hhh]j)}(h task_structh]h task_struct}(hj(UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%Uubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj*UmodnameN classnameNj] j` )}jc ]jf )}jY jTsbc.security_task_movememoryasbuh1hhjUubj2)}(h h]h }(hjHUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj)}(hjh]h*}(hjVUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(hjh]hp}(hjcUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubah}(h]h ]h"]h$]h&]jjuh1jhjThhhjThM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjThhhjThM ubah}(h]jTah ](jjeh"]h$]h&]jj)jhuh1jhjThM hjThhubj)}(hhh]h)}(h!Check if moving memory is allowedh]h!Check if moving memory is allowed}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjUhhubah}(h]h ]h"]h$]h&]uh1jhjThhhjThM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjUjjUjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *p`` task **Description** Check permission before moving memory owned by process **p**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjUubj )}(hhh]j)}(h``struct task_struct *p`` task h](j)}(h``struct task_struct *p``h]j)}(hjUh]hstruct task_struct *p}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjUubj2)}(hhh]h)}(htaskh]htask}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhM hjUubah}(h]h ]h"]h$]h&]uh1j1hjUubeh}(h]h ]h"]h$]h&]uh1jhjUhM hjUubah}(h]h ]h"]h$]h&]uh1j hjUubh)}(h**Description**h]j)}(hjVh]h Description}(hj VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjUubh)}(h=Check permission before moving memory owned by process **p**.h](h7Check permission before moving memory owned by process }(hjVhhhNhNubj)}(h**p**h]hp}(hj&VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh.}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjUubh)}(h **Return**h]j)}(hjAVh]hReturn}(hjCVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?Vubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjUubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjWVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_task_kill (C function)c.security_task_killhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hmint security_task_kill (struct task_struct *p, struct kernel_siginfo *info, int sig, const struct cred *cred)h]j)}(hlint security_task_kill(struct task_struct *p, struct kernel_siginfo *info, int sig, const struct cred *cred)h](j )}(hinth]hint}(hjVhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjVhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVhhhjVhM ubj{)}(hsecurity_task_killh]j)}(hsecurity_task_killh]hsecurity_task_kill}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjVhhhjVhM ubj)}(hV(struct task_struct *p, struct kernel_siginfo *info, int sig, const struct cred *cred)h](j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubh)}(hhh]j)}(h task_structh]h task_struct}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjVmodnameN classnameNj] j` )}jc ]jf )}jY jVsbc.security_task_killasbuh1hhjVubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj)}(hjh]hp}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjVubj)}(hstruct kernel_siginfo *infoh](j)}(hjAh]hstruct}(hj4WhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0Wubj2)}(h h]h }(hjAWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0Wubh)}(hhh]j)}(hkernel_siginfoh]hkernel_siginfo}(hjRWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOWubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjTWmodnameN classnameNj] j` )}jc ]jVc.security_task_killasbuh1hhj0Wubj2)}(h h]h }(hjpWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0Wubj)}(hjh]h*}(hj~WhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0Wubj)}(hinfoh]hinfo}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0Wubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjVubj)}(hint sigh](j )}(hinth]hint}(hjWhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hsigh]hsig}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjVubj)}(hconst struct cred *credh](j)}(hjh]hconst}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjAh]hstruct}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubh)}(hhh]j)}(hcredh]hcred}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjXmodnameN classnameNj] j` )}jc ]jVc.security_task_killasbuh1hhjWubj2)}(h h]h }(hj0XhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjh]h*}(hj>XhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hcredh]hcred}(hjKXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjVubeh}(h]h ]h"]h$]h&]jjuh1jhjVhhhjVhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj~VhhhjVhM ubah}(h]jyVah ](jjeh"]h$]h&]jj)jhuh1jhjVhM hj{Vhhubj)}(hhh]h)}(h$Check if sending a signal is allowedh]h$Check if sending a signal is allowed}(hjuXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjrXhhubah}(h]h ]h"]h$]h&]uh1jhj{VhhhjVhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjXjjXjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct task_struct *p`` target process ``struct kernel_siginfo *info`` signal information ``int sig`` signal value ``const struct cred *cred`` credentials of the signal sender, NULL if **current** **Description** Check permission before sending signal **sig** to **p**. **info** can be NULL, the constant 1, or a pointer to a kernel_siginfo structure. If **info** is 1 or SI_FROMKERNEL(info) is true, then the signal should be viewed as coming from the kernel and should typically be permitted. SIGIO signals are handled separately by the send_sigiotask hook in file_security_ops. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjXh]h Parameters}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjXubj )}(hhh](j)}(h)``struct task_struct *p`` target process h](j)}(h``struct task_struct *p``h]j)}(hjXh]hstruct task_struct *p}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjXubj2)}(hhh]h)}(htarget processh]htarget process}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhM hjXubah}(h]h ]h"]h$]h&]uh1j1hjXubeh}(h]h ]h"]h$]h&]uh1jhjXhM hjXubj)}(h3``struct kernel_siginfo *info`` signal information h](j)}(h``struct kernel_siginfo *info``h]j)}(hjXh]hstruct kernel_siginfo *info}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjXubj2)}(hhh]h)}(hsignal informationh]hsignal information}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhM hjYubah}(h]h ]h"]h$]h&]uh1j1hjXubeh}(h]h ]h"]h$]h&]uh1jhjYhM hjXubj)}(h``int sig`` signal value h](j)}(h ``int sig``h]j)}(hj(Yh]hint sig}(hj*YhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&Yubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj"Yubj2)}(hhh]h)}(h signal valueh]h signal value}(hjAYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=YhM hj>Yubah}(h]h ]h"]h$]h&]uh1j1hj"Yubeh}(h]h ]h"]h$]h&]uh1jhj=YhM hjXubj)}(hR``const struct cred *cred`` credentials of the signal sender, NULL if **current** h](j)}(h``const struct cred *cred``h]j)}(hjaYh]hconst struct cred *cred}(hjcYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_Yubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj[Yubj2)}(hhh]h)}(h5credentials of the signal sender, NULL if **current**h](h*credentials of the signal sender, NULL if }(hjzYhhhNhNubj)}(h **current**h]hcurrent}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzYubeh}(h]h ]h"]h$]h&]uh1hhjvYhM hjwYubah}(h]h ]h"]h$]h&]uh1j1hj[Yubeh}(h]h ]h"]h$]h&]uh1jhjvYhM hjXubeh}(h]h ]h"]h$]h&]uh1j hjXubh)}(h**Description**h]j)}(hjYh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjXubh)}(hXrCheck permission before sending signal **sig** to **p**. **info** can be NULL, the constant 1, or a pointer to a kernel_siginfo structure. If **info** is 1 or SI_FROMKERNEL(info) is true, then the signal should be viewed as coming from the kernel and should typically be permitted. SIGIO signals are handled separately by the send_sigiotask hook in file_security_ops.h](h'Check permission before sending signal }(hjYhhhNhNubj)}(h**sig**h]hsig}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh to }(hjYhhhNhNubj)}(h**p**h]hp}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh. }(hjYhhhNhNubj)}(h**info**h]hinfo}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubhN can be NULL, the constant 1, or a pointer to a kernel_siginfo structure. If }(hjYhhhNhNubj)}(h**info**h]hinfo}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh is 1 or SI_FROMKERNEL(info) is true, then the signal should be viewed as coming from the kernel and should typically be permitted. SIGIO signals are handled separately by the send_sigiotask hook in file_security_ops.}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjXubh)}(h **Return**h]j)}(hjZh]hReturn}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjXubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj/ZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_task_prctl (C function)c.security_task_prctlhNtauh1hhj%hhhNhNubj)}(hhh](j)}(htint security_task_prctl (int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5)h]j)}(hsint security_task_prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5)h](j )}(hinth]hint}(hj^ZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZZhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjmZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZZhhhjlZhM ubj{)}(hsecurity_task_prctlh]j)}(hsecurity_task_prctlh]hsecurity_task_prctl}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{Zubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjZZhhhjlZhM ubj)}(h\(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5)h](j)}(h int optionh](j )}(hinth]hint}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hoptionh]hoption}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hunsigned long arg2h](j )}(hunsignedh]hunsigned}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj )}(hlongh]hlong}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(harg2h]harg2}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hunsigned long arg3h](j )}(hunsignedh]hunsigned}(hj![hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[ubj2)}(h h]h }(hj/[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[ubj )}(hlongh]hlong}(hj=[hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[ubj2)}(h h]h }(hjK[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[ubj)}(harg3h]harg3}(hjY[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hunsigned long arg4h](j )}(hunsignedh]hunsigned}(hjr[hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjn[ubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjn[ubj )}(hlongh]hlong}(hj[hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjn[ubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjn[ubj)}(harg4h]harg4}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn[ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hunsigned long arg5h](j )}(hunsignedh]hunsigned}(hj[hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[ubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[ubj )}(hlongh]hlong}(hj[hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[ubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[ubj)}(harg5h]harg5}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubeh}(h]h ]h"]h$]h&]jjuh1jhjZZhhhjlZhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjVZhhhjlZhM ubah}(h]jQZah ](jjeh"]h$]h&]jj)jhuh1jhjlZhM hjSZhhubj)}(hhh]h)}(hCheck if a prctl op is allowedh]hCheck if a prctl op is allowed}(hj%\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj"\hhubah}(h]h ]h"]h$]h&]uh1jhjSZhhhjlZhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj=\jj=\jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``int option`` operation ``unsigned long arg2`` argument ``unsigned long arg3`` argument ``unsigned long arg4`` argument ``unsigned long arg5`` argument **Description** Check permission before performing a process control operation on the current process. **Return** Return -ENOSYS if no-one wanted to handle this op, any other value to cause prctl() to return immediately with that value.h](h)}(h**Parameters**h]j)}(hjG\h]h Parameters}(hjI\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE\ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjA\ubj )}(hhh](j)}(h``int option`` operation h](j)}(h``int option``h]j)}(hjf\h]h int option}(hjh\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjd\ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj`\ubj2)}(hhh]h)}(h operationh]h operation}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{\hM hj|\ubah}(h]h ]h"]h$]h&]uh1j1hj`\ubeh}(h]h ]h"]h$]h&]uh1jhj{\hM hj]\ubj)}(h ``unsigned long arg2`` argument h](j)}(h``unsigned long arg2``h]j)}(hj\h]hunsigned long arg2}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj\ubj2)}(hhh]h)}(hargumenth]hargument}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM hj\ubah}(h]h ]h"]h$]h&]uh1j1hj\ubeh}(h]h ]h"]h$]h&]uh1jhj\hM hj]\ubj)}(h ``unsigned long arg3`` argument h](j)}(h``unsigned long arg3``h]j)}(hj\h]hunsigned long arg3}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj\ubj2)}(hhh]h)}(hargumenth]hargument}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM hj\ubah}(h]h ]h"]h$]h&]uh1j1hj\ubeh}(h]h ]h"]h$]h&]uh1jhj\hM hj]\ubj)}(h ``unsigned long arg4`` argument h](j)}(h``unsigned long arg4``h]j)}(hj]h]hunsigned long arg4}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj ]ubj2)}(hhh]h)}(hargumenth]hargument}(hj*]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&]hM hj']ubah}(h]h ]h"]h$]h&]uh1j1hj ]ubeh}(h]h ]h"]h$]h&]uh1jhj&]hM hj]\ubj)}(h ``unsigned long arg5`` argument h](j)}(h``unsigned long arg5``h]j)}(hjJ]h]hunsigned long arg5}(hjL]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH]ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjD]ubj2)}(hhh]h)}(hargumenth]hargument}(hjc]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_]hM hj`]ubah}(h]h ]h"]h$]h&]uh1j1hjD]ubeh}(h]h ]h"]h$]h&]uh1jhj_]hM hj]\ubeh}(h]h ]h"]h$]h&]uh1j hjA\ubh)}(h**Description**h]j)}(hj]h]h Description}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjA\ubh)}(hVCheck permission before performing a process control operation on the current process.h]hVCheck permission before performing a process control operation on the current process.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjA\ubh)}(h **Return**h]j)}(hj]h]hReturn}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjA\ubh)}(hzReturn -ENOSYS if no-one wanted to handle this op, any other value to cause prctl() to return immediately with that value.h]hzReturn -ENOSYS if no-one wanted to handle this op, any other value to cause prctl() to return immediately with that value.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjA\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_task_to_inode (C function)c.security_task_to_inodehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hHvoid security_task_to_inode (struct task_struct *p, struct inode *inode)h]j)}(hGvoid security_task_to_inode(struct task_struct *p, struct inode *inode)h](j )}(hvoidh]hvoid}(hj]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]hhhj]hM ubj{)}(hsecurity_task_to_inodeh]j)}(hsecurity_task_to_inodeh]hsecurity_task_to_inode}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj]hhhj]hM ubj)}(h,(struct task_struct *p, struct inode *inode)h](j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hj.^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*^ubj2)}(h h]h }(hj;^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*^ubh)}(hhh]j)}(h task_structh]h task_struct}(hjL^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI^ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjN^modnameN classnameNj] j` )}jc ]jf )}jY j^sbc.security_task_to_inodeasbuh1hhj*^ubj2)}(h h]h }(hjl^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*^ubj)}(hjh]h*}(hjz^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*^ubj)}(hjh]hp}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj&^ubj)}(hstruct inode *inodeh](j)}(hjAh]hstruct}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubh)}(hhh]j)}(hinodeh]hinode}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj^modnameN classnameNj] j` )}jc ]jh^c.security_task_to_inodeasbuh1hhj^ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hinodeh]hinode}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj&^ubeh}(h]h ]h"]h$]h&]jjuh1jhj]hhhj]hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]hhhj]hM ubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1jhj]hM hj]hhubj)}(hhh]h)}(h-Set the security attributes of a task's inodeh]h/Set the security attributes of a task’s inode}(hj _hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj_hhubah}(h]h ]h"]h$]h&]uh1jhj]hhhj]hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj8_jj8_jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct task_struct *p`` task ``struct inode *inode`` inode **Description** Set the security attributes for an inode based on an associated task's security attributes, e.g. for /proc/pid inodes.h](h)}(h**Parameters**h]j)}(hjB_h]h Parameters}(hjD_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@_ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj<_ubj )}(hhh](j)}(h``struct task_struct *p`` task h](j)}(h``struct task_struct *p``h]j)}(hja_h]hstruct task_struct *p}(hjc_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj__ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj[_ubj2)}(hhh]h)}(htaskh]htask}(hjz_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjv_hM hjw_ubah}(h]h ]h"]h$]h&]uh1j1hj[_ubeh}(h]h ]h"]h$]h&]uh1jhjv_hM hjX_ubj)}(h``struct inode *inode`` inode h](j)}(h``struct inode *inode``h]j)}(hj_h]hstruct inode *inode}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj_ubj2)}(hhh]h)}(hinodeh]hinode}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hM hj_ubah}(h]h ]h"]h$]h&]uh1j1hj_ubeh}(h]h ]h"]h$]h&]uh1jhj_hM hjX_ubeh}(h]h ]h"]h$]h&]uh1j hj<_ubh)}(h**Description**h]j)}(hj_h]h Description}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj<_ubh)}(hvSet the security attributes for an inode based on an associated task's security attributes, e.g. for /proc/pid inodes.h]hxSet the security attributes for an inode based on an associated task’s security attributes, e.g. for /proc/pid inodes.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj<_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_create_user_ns (C function)c.security_create_user_nshNtauh1hhj%hhhNhNubj)}(hhh](j)}(h5int security_create_user_ns (const struct cred *cred)h]j)}(h4int security_create_user_ns(const struct cred *cred)h](j )}(hinth]hint}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj`hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj)`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`hhhj(`hM ubj{)}(hsecurity_create_user_nsh]j)}(hsecurity_create_user_nsh]hsecurity_create_user_ns}(hj;`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7`ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj`hhhj(`hM ubj)}(h(const struct cred *cred)h]j)}(hconst struct cred *credh](j)}(hjh]hconst}(hjW`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjS`ubj2)}(h h]h }(hjd`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjS`ubj)}(hjAh]hstruct}(hjr`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjS`ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjS`ubh)}(hhh]j)}(hcredh]hcred}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj`modnameN classnameNj] j` )}jc ]jf )}jY j=`sbc.security_create_user_nsasbuh1hhjS`ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjS`ubj)}(hjh]h*}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjS`ubj)}(hcredh]hcred}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjS`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjO`ubah}(h]h ]h"]h$]h&]jjuh1jhj`hhhj(`hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj`hhhj(`hM ubah}(h]j `ah ](jjeh"]h$]h&]jj)jhuh1jhj(`hM hj`hhubj)}(hhh]h)}(h)Check if creating a new userns is allowedh]h)Check if creating a new userns is allowed}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj`hhubah}(h]h ]h"]h$]h&]uh1jhj`hhhj(`hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj ajj ajjjuh1jhhhj%hNhNubj)}(h**Parameters** ``const struct cred *cred`` prepared creds **Description** Check permission prior to creating a new user namespace. **Return** Returns 0 if successful, otherwise < 0 error code.h](h)}(h**Parameters**h]j)}(hjah]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjaubj )}(hhh]j)}(h+``const struct cred *cred`` prepared creds h](j)}(h``const struct cred *cred``h]j)}(hj6ah]hconst struct cred *cred}(hj8ahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4aubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj0aubj2)}(hhh]h)}(hprepared credsh]hprepared creds}(hjOahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKahM hjLaubah}(h]h ]h"]h$]h&]uh1j1hj0aubeh}(h]h ]h"]h$]h&]uh1jhjKahM hj-aubah}(h]h ]h"]h$]h&]uh1j hjaubh)}(h**Description**h]j)}(hjqah]h Description}(hjsahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoaubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjaubh)}(h8Check permission prior to creating a new user namespace.h]h8Check permission prior to creating a new user namespace.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjaubh)}(h **Return**h]j)}(hjah]hReturn}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjaubh)}(h2Returns 0 if successful, otherwise < 0 error code.h]h2Returns 0 if successful, otherwise < 0 error code.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_ipc_permission (C function)c.security_ipc_permissionhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hDint security_ipc_permission (struct kern_ipc_perm *ipcp, short flag)h]j)}(hCint security_ipc_permission(struct kern_ipc_perm *ipcp, short flag)h](j )}(hinth]hint}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjahhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM" ubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjahhhjahM" ubj{)}(hsecurity_ipc_permissionh]j)}(hsecurity_ipc_permissionh]hsecurity_ipc_permission}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjahhhjahM" ubj)}(h((struct kern_ipc_perm *ipcp, short flag)h](j)}(hstruct kern_ipc_perm *ipcph](j)}(hjAh]hstruct}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj2)}(h h]h }(hj'bhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hj8bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5bubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj:bmodnameN classnameNj] j` )}jc ]jf )}jY jbsbc.security_ipc_permissionasbuh1hhjbubj2)}(h h]h }(hjXbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbubj)}(hjh]h*}(hjfbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj)}(hipcph]hipcp}(hjsbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbubj)}(h short flagh](j )}(hshorth]hshort}(hjbhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjbubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbubj)}(hflagh]hflag}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbubeh}(h]h ]h"]h$]h&]jjuh1jhjahhhjahM" ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjahhhjahM" ubah}(h]jaah ](jjeh"]h$]h&]jj)jhuh1jhjahM" hjahhubj)}(hhh]h)}(h#Check if sysv ipc access is allowedh]h#Check if sysv ipc access is allowed}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM" hjbhhubah}(h]h ]h"]h$]h&]uh1jhjahhhjahM" ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbjjbjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct kern_ipc_perm *ipcp`` ipc permission structure ``short flag`` requested permissions **Description** Check permissions for access to IPC. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjbh]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM& hjbubj )}(hhh](j)}(h8``struct kern_ipc_perm *ipcp`` ipc permission structure h](j)}(h``struct kern_ipc_perm *ipcp``h]j)}(hjch]hstruct kern_ipc_perm *ipcp}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM# hj cubj2)}(hhh]h)}(hipc permission structureh]hipc permission structure}(hj,chhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(chM# hj)cubah}(h]h ]h"]h$]h&]uh1j1hj cubeh}(h]h ]h"]h$]h&]uh1jhj(chM# hj cubj)}(h%``short flag`` requested permissions h](j)}(h``short flag``h]j)}(hjLch]h short flag}(hjNchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJcubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM$ hjFcubj2)}(hhh]h)}(hrequested permissionsh]hrequested permissions}(hjechhhNhNubah}(h]h ]h"]h$]h&]uh1hhjachM$ hjbcubah}(h]h ]h"]h$]h&]uh1j1hjFcubeh}(h]h ]h"]h$]h&]uh1jhjachM$ hj cubeh}(h]h ]h"]h$]h&]uh1j hjbubh)}(h**Description**h]j)}(hjch]h Description}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM& hjbubh)}(h$Check permissions for access to IPC.h]h$Check permissions for access to IPC.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM% hjbubh)}(h **Return**h]j)}(hjch]hReturn}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM' hjbubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM( hjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_ipc_getlsmprop (C function)c.security_ipc_getlsmprophNtauh1hhj%hhhNhNubj)}(hhh](j)}(hPvoid security_ipc_getlsmprop (struct kern_ipc_perm *ipcp, struct lsm_prop *prop)h]j)}(hOvoid security_ipc_getlsmprop(struct kern_ipc_perm *ipcp, struct lsm_prop *prop)h](j )}(hvoidh]hvoid}(hjchhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjchhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM0 ubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjchhhjdhM0 ubj{)}(hsecurity_ipc_getlsmproph]j)}(hsecurity_ipc_getlsmproph]hsecurity_ipc_getlsmprop}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjchhhjdhM0 ubj)}(h3(struct kern_ipc_perm *ipcp, struct lsm_prop *prop)h](j)}(hstruct kern_ipc_perm *ipcph](j)}(hjAh]hstruct}(hj0dhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,dubj2)}(h h]h }(hj=dhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,dubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjNdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKdubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjPdmodnameN classnameNj] j` )}jc ]jf )}jY jdsbc.security_ipc_getlsmpropasbuh1hhj,dubj2)}(h h]h }(hjndhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,dubj)}(hjh]h*}(hj|dhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,dubj)}(hipcph]hipcp}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,dubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(dubj)}(hstruct lsm_prop *proph](j)}(hjAh]hstruct}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubh)}(hhh]j)}(hlsm_proph]hlsm_prop}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjdmodnameN classnameNj] j` )}jc ]jjdc.security_ipc_getlsmpropasbuh1hhjdubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj)}(hjh]h*}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hproph]hprop}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(dubeh}(h]h ]h"]h$]h&]jjuh1jhjchhhjdhM0 ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjchhhjdhM0 ubah}(h]jcah ](jjeh"]h$]h&]jj)jhuh1jhjdhM0 hjchhubj)}(hhh]h)}(h Get the sysv ipc object LSM datah]h Get the sysv ipc object LSM data}(hj#ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM0 hj ehhubah}(h]h ]h"]h$]h&]uh1jhjchhhjdhM0 ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj;ejj;ejjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct kern_ipc_perm *ipcp`` ipc permission structure ``struct lsm_prop *prop`` pointer to lsm information **Description** Get the lsm information associated with the ipc object.h](h)}(h**Parameters**h]j)}(hjEeh]h Parameters}(hjGehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCeubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM4 hj?eubj )}(hhh](j)}(h8``struct kern_ipc_perm *ipcp`` ipc permission structure h](j)}(h``struct kern_ipc_perm *ipcp``h]j)}(hjdeh]hstruct kern_ipc_perm *ipcp}(hjfehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbeubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM1 hj^eubj2)}(hhh]h)}(hipc permission structureh]hipc permission structure}(hj}ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyehM1 hjzeubah}(h]h ]h"]h$]h&]uh1j1hj^eubeh}(h]h ]h"]h$]h&]uh1jhjyehM1 hj[eubj)}(h5``struct lsm_prop *prop`` pointer to lsm information h](j)}(h``struct lsm_prop *prop``h]j)}(hjeh]hstruct lsm_prop *prop}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM2 hjeubj2)}(hhh]h)}(hpointer to lsm informationh]hpointer to lsm information}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehM2 hjeubah}(h]h ]h"]h$]h&]uh1j1hjeubeh}(h]h ]h"]h$]h&]uh1jhjehM2 hj[eubeh}(h]h ]h"]h$]h&]uh1j hj?eubh)}(h**Description**h]j)}(hjeh]h Description}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM4 hj?eubh)}(h7Get the lsm information associated with the ipc object.h]h7Get the lsm information associated with the ipc object.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM3 hj?eubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_msg_msg_alloc (C function)c.security_msg_msg_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h0int security_msg_msg_alloc (struct msg_msg *msg)h]j)}(h/int security_msg_msg_alloc(struct msg_msg *msg)h](j )}(hinth]hint}(hjfhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM> ubj2)}(h h]h }(hj,fhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfhhhj+fhM> ubj{)}(hsecurity_msg_msg_alloch]j)}(hsecurity_msg_msg_alloch]hsecurity_msg_msg_alloc}(hj>fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:fubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjfhhhj+fhM> ubj)}(h(struct msg_msg *msg)h]j)}(hstruct msg_msg *msgh](j)}(hjAh]hstruct}(hjZfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVfubj2)}(h h]h }(hjgfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVfubh)}(hhh]j)}(hmsg_msgh]hmsg_msg}(hjxfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjufubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjzfmodnameN classnameNj] j` )}jc ]jf )}jY j@fsbc.security_msg_msg_allocasbuh1hhjVfubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVfubj)}(hjh]h*}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVfubj)}(hmsgh]hmsg}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVfubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjRfubah}(h]h ]h"]h$]h&]jjuh1jhjfhhhj+fhM> ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjfhhhj+fhM> ubah}(h]jfah ](jjeh"]h$]h&]jj)jhuh1jhj+fhM> hjfhhubj)}(hhh]h)}(h$Allocate a sysv ipc message LSM blobh]h$Allocate a sysv ipc message LSM blob}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM> hjfhhubah}(h]h ]h"]h$]h&]uh1jhjfhhhj+fhM> ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjfjjfjjjuh1jhhhj%hNhNubj)}(hX/**Parameters** ``struct msg_msg *msg`` message structure **Description** Allocate and attach a security structure to the msg->security field. The security field is initialized to NULL when the structure is first created. **Return** Return 0 if operation was successful and permission is granted.h](h)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMB hjfubj )}(hhh]j)}(h*``struct msg_msg *msg`` message structure h](j)}(h``struct msg_msg *msg``h]j)}(hjgh]hstruct msg_msg *msg}(hj ghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM? hjgubj2)}(hhh]h)}(hmessage structureh]hmessage structure}(hj7ghhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3ghM? hj4gubah}(h]h ]h"]h$]h&]uh1j1hjgubeh}(h]h ]h"]h$]h&]uh1jhj3ghM? hjgubah}(h]h ]h"]h$]h&]uh1j hjfubh)}(h**Description**h]j)}(hjYgh]h Description}(hj[ghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWgubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMA hjfubh)}(hAllocate and attach a security structure to the msg->security field. The security field is initialized to NULL when the structure is first created.h]hAllocate and attach a security structure to the msg->security field. The security field is initialized to NULL when the structure is first created.}(hjoghhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM@ hjfubh)}(h **Return**h]j)}(hjgh]hReturn}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~gubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMC hjfubh)}(h?Return 0 if operation was successful and permission is granted.h]h?Return 0 if operation was successful and permission is granted.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMD hjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_msg_msg_free (C function)c.security_msg_msg_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h0void security_msg_msg_free (struct msg_msg *msg)h]j)}(h/void security_msg_msg_free(struct msg_msg *msg)h](j )}(hvoidh]hvoid}(hjghhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjghhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMS ubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjghhhjghMS ubj{)}(hsecurity_msg_msg_freeh]j)}(hsecurity_msg_msg_freeh]hsecurity_msg_msg_free}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjghhhjghMS ubj)}(h(struct msg_msg *msg)h]j)}(hstruct msg_msg *msgh](j)}(hjAh]hstruct}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgubh)}(hhh]j)}(hmsg_msgh]hmsg_msg}(hj hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj"hmodnameN classnameNj] j` )}jc ]jf )}jY jgsbc.security_msg_msg_freeasbuh1hhjgubj2)}(h h]h }(hj@hhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgubj)}(hjh]h*}(hjNhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(hmsgh]hmsg}(hj[hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubah}(h]h ]h"]h$]h&]jjuh1jhjghhhjghMS ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjghhhjghMS ubah}(h]jgah ](jjeh"]h$]h&]jj)jhuh1jhjghMS hjghhubj)}(hhh]h)}(h Free a sysv ipc message LSM blobh]h Free a sysv ipc message LSM blob}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMS hjhhhubah}(h]h ]h"]h$]h&]uh1jhjghhhjghMS ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjhjjhjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct msg_msg *msg`` message structure **Description** Deallocate the security structure for this message.h](h)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMW hjhubj )}(hhh]j)}(h*``struct msg_msg *msg`` message structure h](j)}(h``struct msg_msg *msg``h]j)}(hjhh]hstruct msg_msg *msg}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMT hjhubj2)}(hhh]h)}(hmessage structureh]hmessage structure}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMT hjhubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhjhhMT hjhubah}(h]h ]h"]h$]h&]uh1j hjhubh)}(h**Description**h]j)}(hjih]h Description}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMV hjhubh)}(h3Deallocate the security structure for this message.h]h3Deallocate the security structure for this message.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMU hjhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_msg_queue_alloc (C function)c.security_msg_queue_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h8int security_msg_queue_alloc (struct kern_ipc_perm *msq)h]j)}(h7int security_msg_queue_alloc(struct kern_ipc_perm *msq)h](j )}(hinth]hint}(hjFihhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBihhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM` ubj2)}(h h]h }(hjUihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBihhhjTihM` ubj{)}(hsecurity_msg_queue_alloch]j)}(hsecurity_msg_queue_alloch]hsecurity_msg_queue_alloc}(hjgihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjciubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjBihhhjTihM` ubj)}(h(struct kern_ipc_perm *msq)h]j)}(hstruct kern_ipc_perm *msqh](j)}(hjAh]hstruct}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjimodnameN classnameNj] j` )}jc ]jf )}jY jiisbc.security_msg_queue_allocasbuh1hhjiubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiubj)}(hjh]h*}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj)}(hmsqh]hmsq}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{iubah}(h]h ]h"]h$]h&]jjuh1jhjBihhhjTihM` ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj>ihhhjTihM` ubah}(h]j9iah ](jjeh"]h$]h&]jj)jhuh1jhjTihM` hj;ihhubj)}(hhh]h)}(h&Allocate a sysv ipc msg queue LSM blobh]h&Allocate a sysv ipc msg queue LSM blob}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM` hjjhhubah}(h]h ]h"]h$]h&]uh1jhj;ihhhjTihM` ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjjjuh1jhhhj%hNhNubj)}(hX1**Parameters** ``struct kern_ipc_perm *msq`` sysv ipc permission structure **Description** Allocate and attach a security structure to **msg**. The security field is initialized to NULL when the structure is first created. **Return** Returns 0 if operation was successful and permission is granted.h](h)}(h**Parameters**h]j)}(hj(jh]h Parameters}(hj*jhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&jubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMd hj"jubj )}(hhh]j)}(h<``struct kern_ipc_perm *msq`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *msq``h]j)}(hjGjh]hstruct kern_ipc_perm *msq}(hjIjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMa hjAjubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hj`jhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\jhMa hj]jubah}(h]h ]h"]h$]h&]uh1j1hjAjubeh}(h]h ]h"]h$]h&]uh1jhj\jhMa hj>jubah}(h]h ]h"]h$]h&]uh1j hj"jubh)}(h**Description**h]j)}(hjjh]h Description}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMc hj"jubh)}(hAllocate and attach a security structure to **msg**. The security field is initialized to NULL when the structure is first created.h](h,Allocate and attach a security structure to }(hjjhhhNhNubj)}(h**msg**h]hmsg}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubhP. The security field is initialized to NULL when the structure is first created.}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMb hj"jubh)}(h **Return**h]j)}(hjjh]hReturn}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMe hj"jubh)}(h@Returns 0 if operation was successful and permission is granted.h]h@Returns 0 if operation was successful and permission is granted.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMf hj"jubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_msg_queue_free (C function)c.security_msg_queue_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h8void security_msg_queue_free (struct kern_ipc_perm *msq)h]j)}(h7void security_msg_queue_free(struct kern_ipc_perm *msq)h](j )}(hvoidh]hvoid}(hjkhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMu ubj2)}(h h]h }(hjkhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjhhhjkhMu ubj{)}(hsecurity_msg_queue_freeh]j)}(hsecurity_msg_queue_freeh]hsecurity_msg_queue_free}(hj!khhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjjhhhjkhMu ubj)}(h(struct kern_ipc_perm *msq)h]j)}(hstruct kern_ipc_perm *msqh](j)}(hjAh]hstruct}(hj=khhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9kubj2)}(h h]h }(hjJkhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9kubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hj[khhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXkubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj]kmodnameN classnameNj] j` )}jc ]jf )}jY j#ksbc.security_msg_queue_freeasbuh1hhj9kubj2)}(h h]h }(hj{khhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9kubj)}(hjh]h*}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9kubj)}(hmsqh]hmsq}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9kubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5kubah}(h]h ]h"]h$]h&]jjuh1jhjjhhhjkhMu ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjjhhhjkhMu ubah}(h]jjah ](jjeh"]h$]h&]jj)jhuh1jhjkhMu hjjhhubj)}(hhh]h)}(h"Free a sysv ipc msg queue LSM blobh]h"Free a sysv ipc msg queue LSM blob}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMu hjkhhubah}(h]h ]h"]h$]h&]uh1jhjjhhhjkhMu ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjkjjkjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct kern_ipc_perm *msq`` sysv ipc permission structure **Description** Deallocate security field **perm->security** for the message queue.h](h)}(h**Parameters**h]j)}(hjkh]h Parameters}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMy hjkubj )}(hhh]j)}(h<``struct kern_ipc_perm *msq`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *msq``h]j)}(hjlh]hstruct kern_ipc_perm *msq}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMv hjkubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhMv hjlubah}(h]h ]h"]h$]h&]uh1j1hjkubeh}(h]h ]h"]h$]h&]uh1jhjlhMv hjkubah}(h]h ]h"]h$]h&]uh1j hjkubh)}(h**Description**h]j)}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:lubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMx hjkubh)}(hCDeallocate security field **perm->security** for the message queue.h](hDeallocate security field }(hjRlhhhNhNubj)}(h**perm->security**h]hperm->security}(hjZlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRlubh for the message queue.}(hjRlhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMw hjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )security_msg_queue_associate (C function)c.security_msg_queue_associatehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hHint security_msg_queue_associate (struct kern_ipc_perm *msq, int msqflg)h]j)}(hGint security_msg_queue_associate(struct kern_ipc_perm *msq, int msqflg)h](j )}(hinth]hint}(hjlhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjlhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlhhhjlhM ubj{)}(hsecurity_msg_queue_associateh]j)}(hsecurity_msg_queue_associateh]hsecurity_msg_queue_associate}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjlhhhjlhM ubj)}(h'(struct kern_ipc_perm *msq, int msqflg)h](j)}(hstruct kern_ipc_perm *msqh](j)}(hjAh]hstruct}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlmodnameN classnameNj] j` )}jc ]jf )}jY jlsbc.security_msg_queue_associateasbuh1hhjlubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjh]h*}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hmsqh]hmsq}(hj)mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjlubj)}(h int msqflgh](j )}(hinth]hint}(hjBmhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>mubj2)}(h h]h }(hjPmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>mubj)}(hmsqflgh]hmsqflg}(hj^mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>mubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjlubeh}(h]h ]h"]h$]h&]jjuh1jhjlhhhjlhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjlhhhjlhM ubah}(h]jlah ](jjeh"]h$]h&]jj)jhuh1jhjlhM hjlhhubj)}(hhh]h)}(h)Check if a msg queue operation is allowedh]h)Check if a msg queue operation is allowed}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjmhhubah}(h]h ]h"]h$]h&]uh1jhjlhhhjlhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjmjjmjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct kern_ipc_perm *msq`` sysv ipc permission structure ``int msqflg`` operation flags **Description** Check permission when a message queue is requested through the msgget system call. This hook is only called when returning the message queue identifier for an existing message queue, not when a new message queue is created. **Return** Return 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjmh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjmubj )}(hhh](j)}(h<``struct kern_ipc_perm *msq`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *msq``h]j)}(hjmh]hstruct kern_ipc_perm *msq}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjmubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhM hjmubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjmhM hjmubj)}(h``int msqflg`` operation flags h](j)}(h``int msqflg``h]j)}(hjnh]h int msqflg}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjmubj2)}(hhh]h)}(hoperation flagsh]hoperation flags}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhM hjnubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjnhM hjmubeh}(h]h ]h"]h$]h&]uh1j hjmubh)}(h**Description**h]j)}(hj=nh]h Description}(hj?nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;nubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjmubh)}(hCheck permission when a message queue is requested through the msgget system call. This hook is only called when returning the message queue identifier for an existing message queue, not when a new message queue is created.h]hCheck permission when a message queue is requested through the msgget system call. This hook is only called when returning the message queue identifier for an existing message queue, not when a new message queue is created.}(hjSnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjmubh)}(h **Return**h]j)}(hjdnh]hReturn}(hjfnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbnubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjmubh)}(h"Return 0 if permission is granted.h]h"Return 0 if permission is granted.}(hjznhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_msg_queue_msgctl (C function)c.security_msg_queue_msgctlhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hBint security_msg_queue_msgctl (struct kern_ipc_perm *msq, int cmd)h]j)}(hAint security_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd)h](j )}(hinth]hint}(hjnhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnhhhjnhM ubj{)}(hsecurity_msg_queue_msgctlh]j)}(hsecurity_msg_queue_msgctlh]hsecurity_msg_queue_msgctl}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnhhhjnhM ubj)}(h$(struct kern_ipc_perm *msq, int cmd)h](j)}(hstruct kern_ipc_perm *msqh](j)}(hjAh]hstruct}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjomodnameN classnameNj] j` )}jc ]jf )}jY jnsbc.security_msg_queue_msgctlasbuh1hhjnubj2)}(h h]h }(hj$ohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubj)}(hjh]h*}(hj2ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(hmsqh]hmsq}(hj?ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnubj)}(hint cmdh](j )}(hinth]hint}(hjXohhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjToubj2)}(h h]h }(hjfohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjToubj)}(hcmdh]hcmd}(hjtohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjToubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnubeh}(h]h ]h"]h$]h&]jjuh1jhjnhhhjnhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjnhhhjnhM ubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1jhjnhM hjnhhubj)}(hhh]h)}(h)Check if a msg queue operation is allowedh]h)Check if a msg queue operation is allowed}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjohhubah}(h]h ]h"]h$]h&]uh1jhjnhhhjnhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjojjojjjuh1jhhhj%hNhNubj)}(hX***Parameters** ``struct kern_ipc_perm *msq`` sysv ipc permission structure ``int cmd`` operation **Description** Check permission when a message control operation specified by **cmd** is to be performed on the message queue with permissions. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjoh]h Parameters}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjoubj )}(hhh](j)}(h<``struct kern_ipc_perm *msq`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *msq``h]j)}(hjoh]hstruct kern_ipc_perm *msq}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjoubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohM hjoubah}(h]h ]h"]h$]h&]uh1j1hjoubeh}(h]h ]h"]h$]h&]uh1jhjohM hjoubj)}(h``int cmd`` operation h](j)}(h ``int cmd``h]j)}(hjph]hint cmd}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjpubj2)}(hhh]h)}(h operationh]h operation}(hj1phhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-phM hj.pubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhj-phM hjoubeh}(h]h ]h"]h$]h&]uh1j hjoubh)}(h**Description**h]j)}(hjSph]h Description}(hjUphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQpubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjoubh)}(hCheck permission when a message control operation specified by **cmd** is to be performed on the message queue with permissions.h](h?Check permission when a message control operation specified by }(hjiphhhNhNubj)}(h**cmd**h]hcmd}(hjqphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjipubh: is to be performed on the message queue with permissions.}(hjiphhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjoubh)}(h **Return**h]j)}(hjph]hReturn}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjoubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjoubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_msg_queue_msgsnd (C function)c.security_msg_queue_msgsndhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hZint security_msg_queue_msgsnd (struct kern_ipc_perm *msq, struct msg_msg *msg, int msqflg)h]j)}(hYint security_msg_queue_msgsnd(struct kern_ipc_perm *msq, struct msg_msg *msg, int msqflg)h](j )}(hinth]hint}(hjphhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjphhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjphhhjphM ubj{)}(hsecurity_msg_queue_msgsndh]j)}(hsecurity_msg_queue_msgsndh]hsecurity_msg_queue_msgsnd}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjphhhjphM ubj)}(h<(struct kern_ipc_perm *msq, struct msg_msg *msg, int msqflg)h](j)}(hstruct kern_ipc_perm *msqh](j)}(hjAh]hstruct}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj qubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj qubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hj,qhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)qubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj.qmodnameN classnameNj] j` )}jc ]jf )}jY jpsbc.security_msg_queue_msgsndasbuh1hhj qubj2)}(h h]h }(hjLqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj qubj)}(hjh]h*}(hjZqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj qubj)}(hmsqh]hmsq}(hjgqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj qubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjqubj)}(hstruct msg_msg *msgh](j)}(hjAh]hstruct}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|qubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|qubh)}(hhh]j)}(hmsg_msgh]hmsg_msg}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjqmodnameN classnameNj] j` )}jc ]jHqc.security_msg_queue_msgsndasbuh1hhj|qubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|qubj)}(hjh]h*}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|qubj)}(hmsgh]hmsg}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|qubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjqubj)}(h int msqflgh](j )}(hinth]hint}(hjqhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjqubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqubj)}(hmsqflgh]hmsqflg}(hj rhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjqubeh}(h]h ]h"]h$]h&]jjuh1jhjphhhjphM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjphhhjphM ubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1jhjphM hjphhubj)}(hhh]h)}(h.Check if sending a sysv ipc message is allowedh]h.Check if sending a sysv ipc message is allowed}(hj6rhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj3rhhubah}(h]h ]h"]h$]h&]uh1jhjphhhjphM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjNrjjNrjjjuh1jhhhj%hNhNubj)}(hXI**Parameters** ``struct kern_ipc_perm *msq`` sysv ipc permission structure ``struct msg_msg *msg`` message ``int msqflg`` operation flags **Description** Check permission before a message, **msg**, is enqueued on the message queue with permissions specified in **msq**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjXrh]h Parameters}(hjZrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVrubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjRrubj )}(hhh](j)}(h<``struct kern_ipc_perm *msq`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *msq``h]j)}(hjwrh]hstruct kern_ipc_perm *msq}(hjyrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjurubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjqrubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhM hjrubah}(h]h ]h"]h$]h&]uh1j1hjqrubeh}(h]h ]h"]h$]h&]uh1jhjrhM hjnrubj)}(h ``struct msg_msg *msg`` message h](j)}(h``struct msg_msg *msg``h]j)}(hjrh]hstruct msg_msg *msg}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjrubj2)}(hhh]h)}(hmessageh]hmessage}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhM hjrubah}(h]h ]h"]h$]h&]uh1j1hjrubeh}(h]h ]h"]h$]h&]uh1jhjrhM hjnrubj)}(h``int msqflg`` operation flags h](j)}(h``int msqflg``h]j)}(hjrh]h int msqflg}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjrubj2)}(hhh]h)}(hoperation flagsh]hoperation flags}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhM hjrubah}(h]h ]h"]h$]h&]uh1j1hjrubeh}(h]h ]h"]h$]h&]uh1jhjrhM hjnrubeh}(h]h ]h"]h$]h&]uh1j hjRrubh)}(h**Description**h]j)}(hj$sh]h Description}(hj&shhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"subah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjRrubh)}(hsCheck permission before a message, **msg**, is enqueued on the message queue with permissions specified in **msq**.h](h#Check permission before a message, }(hj:shhhNhNubj)}(h**msg**h]hmsg}(hjBshhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:subhA, is enqueued on the message queue with permissions specified in }(hj:shhhNhNubj)}(h**msq**h]hmsq}(hjTshhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:subh.}(hj:shhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjRrubh)}(h **Return**h]j)}(hjosh]hReturn}(hjqshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmsubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjRrubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjRrubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_msg_queue_msgrcv (C function)c.security_msg_queue_msgrcvhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hint security_msg_queue_msgrcv (struct kern_ipc_perm *msq, struct msg_msg *msg, struct task_struct *target, long type, int mode)h]j)}(h~int security_msg_queue_msgrcv(struct kern_ipc_perm *msq, struct msg_msg *msg, struct task_struct *target, long type, int mode)h](j )}(hinth]hint}(hjshhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjshhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjshhhjshM ubj{)}(hsecurity_msg_queue_msgrcvh]j)}(hsecurity_msg_queue_msgrcvh]hsecurity_msg_queue_msgrcv}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjshhhjshM ubj)}(ha(struct kern_ipc_perm *msq, struct msg_msg *msg, struct task_struct *target, long type, int mode)h](j)}(hstruct kern_ipc_perm *msqh](j)}(hjAh]hstruct}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjsubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj tubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]jf )}jY jssbc.security_msg_queue_msgrcvasbuh1hhjsubj2)}(h h]h }(hj/thhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjsubj)}(hjh]h*}(hj=thhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj)}(hmsqh]hmsq}(hjJthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjsubj)}(hstruct msg_msg *msgh](j)}(hjAh]hstruct}(hjcthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_tubj2)}(h h]h }(hjpthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_tubh)}(hhh]j)}(hmsg_msgh]hmsg_msg}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~tubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]j+tc.security_msg_queue_msgrcvasbuh1hhj_tubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_tubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_tubj)}(hmsgh]hmsg}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_tubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjsubj)}(hstruct task_struct *targeth](j)}(hjAh]hstruct}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubh)}(hhh]j)}(h task_structh]h task_struct}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]j+tc.security_msg_queue_msgrcvasbuh1hhjtubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubj)}(hjh]h*}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(htargeth]htarget}(hj*uhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjsubj)}(h long typeh](j )}(hlongh]hlong}(hjCuhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj?uubj2)}(h h]h }(hjQuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?uubj)}(htypeh]htype}(hj_uhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?uubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjsubj)}(hint modeh](j )}(hinth]hint}(hjxuhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjtuubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtuubj)}(hmodeh]hmode}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtuubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjsubeh}(h]h ]h"]h$]h&]jjuh1jhjshhhjshM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjshhhjshM ubah}(h]jsah ](jjeh"]h$]h&]jj)jhuh1jhjshM hjshhubj)}(hhh]h)}(h,Check if receiving a sysv ipc msg is allowedh]h,Check if receiving a sysv ipc msg is allowed}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjuhhubah}(h]h ]h"]h$]h&]uh1jhjshhhjshM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjujjujjjuh1jhhhj%hNhNubj)}(hX+**Parameters** ``struct kern_ipc_perm *msq`` sysv ipc permission structure ``struct msg_msg *msg`` message ``struct task_struct *target`` target task ``long type`` type of message requested ``int mode`` operation flags **Description** Check permission before a message, **msg**, is removed from the message queue. The **target** task structure contains a pointer to the process that will be receiving the message (not equal to the current process when inline receives are being performed). **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjuh]h Parameters}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjuubj )}(hhh](j)}(h<``struct kern_ipc_perm *msq`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *msq``h]j)}(hjuh]hstruct kern_ipc_perm *msq}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjuubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhM hjvubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjvhM hjuubj)}(h ``struct msg_msg *msg`` message h](j)}(h``struct msg_msg *msg``h]j)}(hj8vh]hstruct msg_msg *msg}(hj:vhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6vubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj2vubj2)}(hhh]h)}(hmessageh]hmessage}(hjQvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMvhM hjNvubah}(h]h ]h"]h$]h&]uh1j1hj2vubeh}(h]h ]h"]h$]h&]uh1jhjMvhM hjuubj)}(h+``struct task_struct *target`` target task h](j)}(h``struct task_struct *target``h]j)}(hjqvh]hstruct task_struct *target}(hjsvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjovubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjkvubj2)}(hhh]h)}(h target taskh]h target task}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhM hjvubah}(h]h ]h"]h$]h&]uh1j1hjkvubeh}(h]h ]h"]h$]h&]uh1jhjvhM hjuubj)}(h(``long type`` type of message requested h](j)}(h ``long type``h]j)}(hjvh]h long type}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjvubj2)}(hhh]h)}(htype of message requestedh]htype of message requested}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhM hjvubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjvhM hjuubj)}(h``int mode`` operation flags h](j)}(h ``int mode``h]j)}(hjvh]hint mode}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjvubj2)}(hhh]h)}(hoperation flagsh]hoperation flags}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhM hjvubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjvhM hjuubeh}(h]h ]h"]h$]h&]uh1j hjuubh)}(h**Description**h]j)}(hjwh]h Description}(hj whhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjuubh)}(hCheck permission before a message, **msg**, is removed from the message queue. The **target** task structure contains a pointer to the process that will be receiving the message (not equal to the current process when inline receives are being performed).h](h#Check permission before a message, }(hj4whhhNhNubj)}(h**msg**h]hmsg}(hjah"]h$]h&]uh1j1hjwhhhjwhM ubj{)}(hsecurity_shm_alloch]j)}(hsecurity_shm_alloch]hsecurity_shm_alloc}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjwhhhjwhM ubj)}(h(struct kern_ipc_perm *shp)h]j)}(hstruct kern_ipc_perm *shph](j)}(hjAh]hstruct}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hj xhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj xmodnameN classnameNj] j` )}jc ]jf )}jY jwsbc.security_shm_allocasbuh1hhjwubj2)}(h h]h }(hj)xhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubj)}(hjh]h*}(hj7xhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hshph]hshp}(hjDxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwubah}(h]h ]h"]h$]h&]jjuh1jhjwhhhjwhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjwhhhjwhM ubah}(h]jwah ](jjeh"]h$]h&]jj)jhuh1jhjwhM hjwhhubj)}(hhh]h)}(hAllocate a sysv shm LSM blobh]hAllocate a sysv shm LSM blob}(hjnxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjkxhhubah}(h]h ]h"]h$]h&]uh1jhjwhhhjwhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjxjjxjjjuh1jhhhj%hNhNubj)}(hXE**Parameters** ``struct kern_ipc_perm *shp`` sysv ipc permission structure **Description** Allocate and attach a security structure to the **shp** security field. The security field is initialized to NULL when the structure is first created. **Return** Returns 0 if operation was successful and permission is granted.h](h)}(h**Parameters**h]j)}(hjxh]h Parameters}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjxubj )}(hhh]j)}(h<``struct kern_ipc_perm *shp`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *shp``h]j)}(hjxh]hstruct kern_ipc_perm *shp}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjxubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhM hjxubah}(h]h ]h"]h$]h&]uh1j1hjxubeh}(h]h ]h"]h$]h&]uh1jhjxhM hjxubah}(h]h ]h"]h$]h&]uh1j hjxubh)}(h**Description**h]j)}(hjxh]h Description}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjxubh)}(hAllocate and attach a security structure to the **shp** security field. The security field is initialized to NULL when the structure is first created.h](h0Allocate and attach a security structure to the }(hjyhhhNhNubj)}(h**shp**h]hshp}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubh` security field. The security field is initialized to NULL when the structure is first created.}(hjyhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjxubh)}(h **Return**h]j)}(hj#yh]hReturn}(hj%yhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!yubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjxubh)}(h@Returns 0 if operation was successful and permission is granted.h]h@Returns 0 if operation was successful and permission is granted.}(hj9yhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_shm_free (C function)c.security_shm_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h2void security_shm_free (struct kern_ipc_perm *shp)h]j)}(h1void security_shm_free(struct kern_ipc_perm *shp)h](j )}(hvoidh]hvoid}(hjhyhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdyhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjwyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdyhhhjvyhM ubj{)}(hsecurity_shm_freeh]j)}(hsecurity_shm_freeh]hsecurity_shm_free}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjdyhhhjvyhM ubj)}(h(struct kern_ipc_perm *shp)h]j)}(hstruct kern_ipc_perm *shph](j)}(hjAh]hstruct}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjymodnameN classnameNj] j` )}jc ]jf )}jY jysbc.security_shm_freeasbuh1hhjyubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(hshph]hshp}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubah}(h]h ]h"]h$]h&]jjuh1jhjdyhhhjvyhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj`yhhhjvyhM ubah}(h]j[yah ](jjeh"]h$]h&]jj)jhuh1jhjvyhM hj]yhhubj)}(hhh]h)}(hFree a sysv shm LSM blobh]hFree a sysv shm LSM blob}(hj(zhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj%zhhubah}(h]h ]h"]h$]h&]uh1jhj]yhhhjvyhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj@zjj@zjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct kern_ipc_perm *shp`` sysv ipc permission structure **Description** Deallocate the security structure **perm->security** for the memory segment.h](h)}(h**Parameters**h]j)}(hjJzh]h Parameters}(hjLzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHzubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjDzubj )}(hhh]j)}(h<``struct kern_ipc_perm *shp`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *shp``h]j)}(hjizh]hstruct kern_ipc_perm *shp}(hjkzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgzubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjczubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~zhM hjzubah}(h]h ]h"]h$]h&]uh1j1hjczubeh}(h]h ]h"]h$]h&]uh1jhj~zhM hj`zubah}(h]h ]h"]h$]h&]uh1j hjDzubh)}(h**Description**h]j)}(hjzh]h Description}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjDzubh)}(hLDeallocate the security structure **perm->security** for the memory segment.h](h"Deallocate the security structure }(hjzhhhNhNubj)}(h**perm->security**h]hperm->security}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubh for the memory segment.}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjDzubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_shm_associate (C function)c.security_shm_associatehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hBint security_shm_associate (struct kern_ipc_perm *shp, int shmflg)h]j)}(hAint security_shm_associate(struct kern_ipc_perm *shp, int shmflg)h](j )}(hinth]hint}(hjzhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjzhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj {hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjzhhhj {hM ubj{)}(hsecurity_shm_associateh]j)}(hsecurity_shm_associateh]hsecurity_shm_associate}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjzhhhj {hM ubj)}(h'(struct kern_ipc_perm *shp, int shmflg)h](j)}(hstruct kern_ipc_perm *shph](j)}(hjAh]hstruct}(hj8{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4{ubj2)}(h h]h }(hjE{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4{ubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjV{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjS{ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjX{modnameN classnameNj] j` )}jc ]jf )}jY j{sbc.security_shm_associateasbuh1hhj4{ubj2)}(h h]h }(hjv{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4{ubj)}(hjh]h*}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4{ubj)}(hshph]hshp}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj0{ubj)}(h int shmflgh](j )}(hinth]hint}(hj{hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj{ubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubj)}(hshmflgh]hshmflg}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj0{ubeh}(h]h ]h"]h$]h&]jjuh1jhjzhhhj {hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjzhhhj {hM ubah}(h]jzah ](jjeh"]h$]h&]jj)jhuh1jhj {hM hjzhhubj)}(hhh]h)}(h(Check if a sysv shm operation is allowedh]h(Check if a sysv shm operation is allowed}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj{hhubah}(h]h ]h"]h$]h&]uh1jhjzhhhj {hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj|jj|jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct kern_ipc_perm *shp`` sysv ipc permission structure ``int shmflg`` operation flags **Description** Check permission when a shared memory region is requested through the shmget system call. This hook is only called when returning the shared memory region identifier for an existing region, not when a new shared memory region is created. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj|h]h Parameters}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj |ubj )}(hhh](j)}(h<``struct kern_ipc_perm *shp`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *shp``h]j)}(hj1|h]hstruct kern_ipc_perm *shp}(hj3|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/|ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj+|ubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjJ|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjF|hM hjG|ubah}(h]h ]h"]h$]h&]uh1j1hj+|ubeh}(h]h ]h"]h$]h&]uh1jhjF|hM hj(|ubj)}(h``int shmflg`` operation flags h](j)}(h``int shmflg``h]j)}(hjj|h]h int shmflg}(hjl|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh|ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjd|ubj2)}(hhh]h)}(hoperation flagsh]hoperation flags}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hM hj|ubah}(h]h ]h"]h$]h&]uh1j1hjd|ubeh}(h]h ]h"]h$]h&]uh1jhj|hM hj(|ubeh}(h]h ]h"]h$]h&]uh1j hj |ubh)}(h**Description**h]j)}(hj|h]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj |ubh)}(hCheck permission when a shared memory region is requested through the shmget system call. This hook is only called when returning the shared memory region identifier for an existing region, not when a new shared memory region is created.h]hCheck permission when a shared memory region is requested through the shmget system call. This hook is only called when returning the shared memory region identifier for an existing region, not when a new shared memory region is created.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj |ubh)}(h **Return**h]j)}(hj|h]hReturn}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj |ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj |ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_shm_shmctl (C function)c.security_shm_shmctlhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hj }hhhj}hM ubj{)}(hsecurity_shm_shmctlh]j)}(hsecurity_shm_shmctlh]hsecurity_shm_shmctl}(hj2}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.}ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj }hhhj}hM ubj)}(h$(struct kern_ipc_perm *shp, int cmd)h](j)}(hstruct kern_ipc_perm *shph](j)}(hjAh]hstruct}(hjN}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ}ubj2)}(h h]h }(hj[}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJ}ubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjl}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji}ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjn}modnameN classnameNj] j` )}jc ]jf )}jY j4}sbc.security_shm_shmctlasbuh1hhjJ}ubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJ}ubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ}ubj)}(hshph]hshp}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjF}ubj)}(hint cmdh](j )}(hinth]hint}(hj}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj)}(hcmdh]hcmd}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjF}ubeh}(h]h ]h"]h$]h&]jjuh1jhj }hhhj}hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj }hhhj}hM ubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1jhj}hM hj}hhubj)}(hhh]h)}(h(Check if a sysv shm operation is allowedh]h(Check if a sysv shm operation is allowed}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj~hhubah}(h]h ]h"]h$]h&]uh1jhj}hhhj}hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj~jj~jjjuh1jhhhj%hNhNubj)}(hXA**Parameters** ``struct kern_ipc_perm *shp`` sysv ipc permission structure ``int cmd`` operation **Description** Check permission when a shared memory control operation specified by **cmd** is to be performed on the shared memory region with permissions in **shp**. **Return** Return 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj(~h]h Parameters}(hj*~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&~ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj"~ubj )}(hhh](j)}(h<``struct kern_ipc_perm *shp`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *shp``h]j)}(hjG~h]hstruct kern_ipc_perm *shp}(hjI~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE~ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjA~ubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hj`~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\~hM hj]~ubah}(h]h ]h"]h$]h&]uh1j1hjA~ubeh}(h]h ]h"]h$]h&]uh1jhj\~hM hj>~ubj)}(h``int cmd`` operation h](j)}(h ``int cmd``h]j)}(hj~h]hint cmd}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~~ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjz~ubj2)}(hhh]h)}(h operationh]h operation}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hM hj~ubah}(h]h ]h"]h$]h&]uh1j1hjz~ubeh}(h]h ]h"]h$]h&]uh1jhj~hM hj>~ubeh}(h]h ]h"]h$]h&]uh1j hj"~ubh)}(h**Description**h]j)}(hj~h]h Description}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj"~ubh)}(hCheck permission when a shared memory control operation specified by **cmd** is to be performed on the shared memory region with permissions in **shp**.h](hECheck permission when a shared memory control operation specified by }(hj~hhhNhNubj)}(h**cmd**h]hcmd}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubhD is to be performed on the shared memory region with permissions in }(hj~hhhNhNubj)}(h**shp**h]hshp}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubh.}(hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj"~ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj"~ubh)}(h"Return 0 if permission is granted.h]h"Return 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj"~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_shm_shmat (C function)c.security_shm_shmathNtauh1hhj%hhhNhNubj)}(hhh](j)}(hTint security_shm_shmat (struct kern_ipc_perm *shp, char __user *shmaddr, int shmflg)h]j)}(hSint security_shm_shmat(struct kern_ipc_perm *shp, char __user *shmaddr, int shmflg)h](j )}(hinth]hint}(hjKhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjGhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGhhhjYhM ubj{)}(hsecurity_shm_shmath]j)}(hsecurity_shm_shmath]hsecurity_shm_shmat}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjGhhhjYhM ubj)}(h=(struct kern_ipc_perm *shp, char __user *shmaddr, int shmflg)h](j)}(hstruct kern_ipc_perm *shph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jnsbc.security_shm_shmatasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hshph]hshp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hchar __user *shmaddrh](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh__user}(hjhhhNhNubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hshmaddrh]hshmaddr}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int shmflgh](j )}(hinth]hint}(hjNhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubj)}(hshmflgh]hshmflg}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjGhhhjYhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjChhhjYhM ubah}(h]j>ah ](jjeh"]h$]h&]jj)jhuh1jhjYhM hj@hhubj)}(hhh]h)}(h/Check if a sysv shm attach operation is allowedh]h/Check if a sysv shm attach operation is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhj@hhhjYhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct kern_ipc_perm *shp`` sysv ipc permission structure ``char __user *shmaddr`` address of memory region to attach ``int shmflg`` operation flags **Description** Check permissions prior to allowing the shmat system call to attach the shared memory segment with permissions **shp** to the data segment of the calling process. The attaching address is specified by **shmaddr**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj )}(hhh](j)}(h<``struct kern_ipc_perm *shp`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *shp``h]j)}(hjՀh]hstruct kern_ipc_perm *shp}(hj׀hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӀubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjπubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjπubeh}(h]h ]h"]h$]h&]uh1jhjhM hj̀ubj)}(h<``char __user *shmaddr`` address of memory region to attach h](j)}(h``char __user *shmaddr``h]j)}(hjh]hchar __user *shmaddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(h"address of memory region to attachh]h"address of memory region to attach}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hM hj$ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj#hM hj̀ubj)}(h``int shmflg`` operation flags h](j)}(h``int shmflg``h]j)}(hjGh]h int shmflg}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjAubj2)}(hhh]h)}(hoperation flagsh]hoperation flags}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM hj]ubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj\hM hj̀ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hCheck permissions prior to allowing the shmat system call to attach the shared memory segment with permissions **shp** to the data segment of the calling process. The attaching address is specified by **shmaddr**.h](hoCheck permissions prior to allowing the shmat system call to attach the shared memory segment with permissions }(hjhhhNhNubj)}(h**shp**h]hshp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhS to the data segment of the calling process. The attaching address is specified by }(hjhhhNhNubj)}(h **shmaddr**h]hshmaddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubh)}(h **Return**h]j)}(hj́h]hReturn}(hjρhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjˁubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_sem_alloc (C function)c.security_sem_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h2int security_sem_alloc (struct kern_ipc_perm *sma)h]j)}(h1int security_sem_alloc(struct kern_ipc_perm *sma)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj hMubj{)}(hsecurity_sem_alloch]j)}(hsecurity_sem_alloch]hsecurity_sem_alloc}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj hMubj)}(h(struct kern_ipc_perm *sma)h]j)}(hstruct kern_ipc_perm *smah](j)}(hjAh]hstruct}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjomodnameN classnameNj] j` )}jc ]jf )}jY j5sbc.security_sem_allocasbuh1hhjKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hsmah]hsma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjGubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hMhjhhubj)}(hhh]h)}(h"Allocate a sysv semaphore LSM blobh]h"Allocate a sysv semaphore LSM blob}(hj҂hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjςhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hXD**Parameters** ``struct kern_ipc_perm *sma`` sysv ipc permission structure **Description** Allocate and attach a security structure to the **sma** security field. The security field is initialized to NULL when the structure is first created. **Return** Returns 0 if operation was successful and permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh]j)}(h<``struct kern_ipc_perm *sma`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *sma``h]j)}(hjh]hstruct kern_ipc_perm *sma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj)ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj(hMhj ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjNh]h Description}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hAllocate and attach a security structure to the **sma** security field. The security field is initialized to NULL when the structure is first created.h](h0Allocate and attach a security structure to the }(hjdhhhNhNubj)}(h**sma**h]hsma}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubh_ security field. The security field is initialized to NULL when the structure is first created.}(hjdhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubh)}(h@Returns 0 if operation was successful and permission is granted.h]h@Returns 0 if operation was successful and permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM!hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_sem_free (C function)c.security_sem_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h2void security_sem_free (struct kern_ipc_perm *sma)h]j)}(h1void security_sem_free(struct kern_ipc_perm *sma)h](j )}(hvoidh]hvoid}(hj̃hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjȃhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM0ubj2)}(h h]h }(hjۃhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjȃhhhjڃhM0ubj{)}(hsecurity_sem_freeh]j)}(hsecurity_sem_freeh]hsecurity_sem_free}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjȃhhhjڃhM0ubj)}(h(struct kern_ipc_perm *sma)h]j)}(hstruct kern_ipc_perm *smah](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj)modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_sem_freeasbuh1hhjubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsmah]hsma}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjȃhhhjڃhM0ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjăhhhjڃhM0ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjڃhM0hjhhubj)}(hhh]h)}(hFree a sysv semaphore LSM blobh]hFree a sysv semaphore LSM blob}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM0hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjڃhM0ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct kern_ipc_perm *sma`` sysv ipc permission structure **Description** Deallocate security structure **sma->security** for the semaphore.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM4hjubj )}(hhh]j)}(h<``struct kern_ipc_perm *sma`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *sma``h]j)}(hj̈́h]hstruct kern_ipc_perm *sma}(hjτhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj˄ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM1hjDŽubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM1hjubah}(h]h ]h"]h$]h&]uh1j1hjDŽubeh}(h]h ]h"]h$]h&]uh1jhjhM1hjĄubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM3hjubh)}(hBDeallocate security structure **sma->security** for the semaphore.h](hDeallocate security structure }(hjhhhNhNubj)}(h**sma->security**h]h sma->security}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh for the semaphore.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM2hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_sem_associate (C function)c.security_sem_associatehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hBint security_sem_associate (struct kern_ipc_perm *sma, int semflg)h]j)}(hAint security_sem_associate(struct kern_ipc_perm *sma, int semflg)h](j )}(hinth]hint}(hj_hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM=ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[hhhjmhM=ubj{)}(hsecurity_sem_associateh]j)}(hsecurity_sem_associateh]hsecurity_sem_associate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj[hhhjmhM=ubj)}(h'(struct kern_ipc_perm *sma, int semflg)h](j)}(hstruct kern_ipc_perm *smah](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_sem_associateasbuh1hhjubj2)}(h h]h }(hjڅhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsmah]hsma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int semflgh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hsemflgh]hsemflg}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj[hhhjmhM=ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjWhhhjmhM=ubah}(h]jRah ](jjeh"]h$]h&]jj)jhuh1jhjmhM=hjThhubj)}(hhh]h)}(h.Check if a sysv semaphore operation is allowedh]h.Check if a sysv semaphore operation is allowed}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM=hjQhhubah}(h]h ]h"]h$]h&]uh1jhjThhhjmhM=ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjljjljjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct kern_ipc_perm *sma`` sysv ipc permission structure ``int semflg`` operation flags **Description** Check permission when a semaphore is requested through the semget system call. This hook is only called when returning the semaphore identifier for an existing semaphore, not when a new one must be created. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjvh]h Parameters}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMAhjpubj )}(hhh](j)}(h<``struct kern_ipc_perm *sma`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *sma``h]j)}(hjh]hstruct kern_ipc_perm *sma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM>hjubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM>hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM>hjubj)}(h``int semflg`` operation flags h](j)}(h``int semflg``h]j)}(hjΆh]h int semflg}(hjІhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̆ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM?hjȆubj2)}(hhh]h)}(hoperation flagsh]hoperation flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM?hjubah}(h]h ]h"]h$]h&]uh1j1hjȆubeh}(h]h ]h"]h$]h&]uh1jhjhM?hjubeh}(h]h ]h"]h$]h&]uh1j hjpubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMAhjpubh)}(hCheck permission when a semaphore is requested through the semget system call. This hook is only called when returning the semaphore identifier for an existing semaphore, not when a new one must be created.h]hCheck permission when a semaphore is requested through the semget system call. This hook is only called when returning the semaphore identifier for an existing semaphore, not when a new one must be created.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM@hjpubh)}(h **Return**h]j)}(hj0h]hReturn}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMDhjpubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMEhjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  security_sem_semctl (C function)c.security_sem_semctlhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjqhhhjhMMubj{)}(hsecurity_sem_semctlh]j)}(hsecurity_sem_semctlh]hsecurity_sem_semctl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjqhhhjhMMubj)}(h$(struct kern_ipc_perm *sma, int cmd)h](j)}(hstruct kern_ipc_perm *smah](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjЇhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj͇ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj҇modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_sem_semctlasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsmah]hsma}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint cmdh](j )}(hinth]hint}(hj$hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hcmdh]hcmd}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjqhhhjhMMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjmhhhjhMMubah}(h]jhah ](jjeh"]h$]h&]jj)jhuh1jhjhMMhjjhhubj)}(hhh]h)}(h.Check if a sysv semaphore operation is allowedh]h.Check if a sysv semaphore operation is allowed}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMMhjghhubah}(h]h ]h"]h$]h&]uh1jhjjhhhjhMMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct kern_ipc_perm *sma`` sysv ipc permission structure ``int cmd`` operation **Description** Check permission when a semaphore operation specified by **cmd** is to be performed on the semaphore. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMQhjubj )}(hhh](j)}(h<``struct kern_ipc_perm *sma`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *sma``h]j)}(hjh]hstruct kern_ipc_perm *sma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMNhjubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjĈhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMNhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMNhjubj)}(h``int cmd`` operation h](j)}(h ``int cmd``h]j)}(hjh]hint cmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMOhjވubj2)}(hhh]h)}(h operationh]h operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMOhjubah}(h]h ]h"]h$]h&]uh1j1hjވubeh}(h]h ]h"]h$]h&]uh1jhjhMOhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMQhjubh)}(heCheck permission when a semaphore operation specified by **cmd** is to be performed on the semaphore.h](h9Check permission when a semaphore operation specified by }(hj5hhhNhNubj)}(h**cmd**h]hcmd}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh% is to be performed on the semaphore.}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMPhjubh)}(h **Return**h]j)}(hjXh]hReturn}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMShjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMThjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_sem_semop (C function)c.security_sem_semophNtauh1hhj%hhhNhNubj)}(hhh](j)}(hbint security_sem_semop (struct kern_ipc_perm *sma, struct sembuf *sops, unsigned nsops, int alter)h]j)}(haint security_sem_semop(struct kern_ipc_perm *sma, struct sembuf *sops, unsigned nsops, int alter)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM\ubj{)}(hsecurity_sem_semoph]j)}(hsecurity_sem_semoph]hsecurity_sem_semop}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM\ubj)}(hK(struct kern_ipc_perm *sma, struct sembuf *sops, unsigned nsops, int alter)h](j)}(hstruct kern_ipc_perm *smah](j)}(hjAh]hstruct}(hjډhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj։ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj։ubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_sem_semopasbuh1hhj։ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj։ubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj։ubj)}(hsmah]hsma}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj։ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj҉ubj)}(hstruct sembuf *sopsh](j)}(hjAh]hstruct}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubh)}(hhh]j)}(hsembufh]hsembuf}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlmodnameN classnameNj] j` )}jc ]jc.security_sem_semopasbuh1hhjHubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hsopsh]hsops}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj҉ubj)}(hunsigned nsopsh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjʊhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnsopsh]hnsops}(hj؊hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj҉ubj)}(h int alterh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(halterh]halter}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj҉ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM\ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM\ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM\hjhhubj)}(hhh]h)}(h.Check if a sysv semaphore operation is allowedh]h.Check if a sysv semaphore operation is allowed}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\hj4hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM\ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjOjjOjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct kern_ipc_perm *sma`` sysv ipc permission structure ``struct sembuf *sops`` operations to perform ``unsigned nsops`` number of operations ``int alter`` flag indicating changes will be made **Description** Check permissions before performing operations on members of the semaphore set. If the **alter** flag is nonzero, the semaphore set may be modified. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjYh]h Parameters}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM`hjSubj )}(hhh](j)}(h<``struct kern_ipc_perm *sma`` sysv ipc permission structure h](j)}(h``struct kern_ipc_perm *sma``h]j)}(hjxh]hstruct kern_ipc_perm *sma}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM]hjrubj2)}(hhh]h)}(hsysv ipc permission structureh]hsysv ipc permission structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM]hjubah}(h]h ]h"]h$]h&]uh1j1hjrubeh}(h]h ]h"]h$]h&]uh1jhjhM]hjoubj)}(h.``struct sembuf *sops`` operations to perform h](j)}(h``struct sembuf *sops``h]j)}(hjh]hstruct sembuf *sops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM^hjubj2)}(hhh]h)}(hoperations to performh]hoperations to perform}(hjʋhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjƋhM^hjNjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjƋhM^hjoubj)}(h(``unsigned nsops`` number of operations h](j)}(h``unsigned nsops``h]j)}(hjh]hunsigned nsops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM_hjubj2)}(hhh]h)}(hnumber of operationsh]hnumber of operations}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM_hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM_hjoubj)}(h3``int alter`` flag indicating changes will be made h](j)}(h ``int alter``h]j)}(hj#h]h int alter}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM`hjubj2)}(hhh]h)}(h$flag indicating changes will be madeh]h$flag indicating changes will be made}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hM`hj9ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj8hM`hjoubeh}(h]h ]h"]h$]h&]uh1j hjSubh)}(h**Description**h]j)}(hj^h]h Description}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMbhjSubh)}(hCheck permissions before performing operations on members of the semaphore set. If the **alter** flag is nonzero, the semaphore set may be modified.h](hWCheck permissions before performing operations on members of the semaphore set. If the }(hjthhhNhNubj)}(h **alter**h]halter}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubh4 flag is nonzero, the semaphore set may be modified.}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMahjSubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMdhjSubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMehjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !security_getselfattr (C function)c.security_getselfattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hfint security_getselfattr (unsigned int attr, struct lsm_ctx __user *uctx, u32 __user *size, u32 flags)h]j)}(heint security_getselfattr(unsigned int attr, struct lsm_ctx __user *uctx, u32 __user *size, u32 flags)h](j )}(hinth]hint}(hj܌hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj،hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj،hhhjhMubj{)}(hsecurity_getselfattrh]j)}(hsecurity_getselfattrh]hsecurity_getselfattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj،hhhjhMubj)}(hM(unsigned int attr, struct lsm_ctx __user *uctx, u32 __user *size, u32 flags)h](j)}(hunsigned int attrh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hj5hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hattrh]hattr}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct lsm_ctx __user *uctxh](j)}(hjAh]hstruct}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfubh)}(hhh]j)}(hlsm_ctxh]hlsm_ctx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_getselfattrasbuh1hhjfubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfubh__user}(hjfhhhNhNubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfubj)}(hjh]h*}(hjȍhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(huctxh]huctx}(hjՍhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hu32 __user *sizeh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_getselfattrasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh__user}(hjhhhNhNubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h u32 flagsh](h)}(hhh]j)}(hu32h]hu32}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjZmodnameN classnameNj] j` )}jc ]jc.security_getselfattrasbuh1hhjQubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj،hhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjԌhhhjhMubah}(h]jόah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjьhhubj)}(hhh]h)}(h-Read an LSM attribute of the current process.h]h-Read an LSM attribute of the current process.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjьhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjƎjjƎjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``unsigned int attr`` which attribute to return ``struct lsm_ctx __user *uctx`` the user-space destination for the information, or NULL ``u32 __user *size`` pointer to the size of space available to receive the data ``u32 flags`` special handling options. LSM_FLAG_SINGLE indicates that only attributes associated with the LSM identified in the passed **ctx** be reported. **Description** A NULL value for **uctx** can be used to get both the number of attributes and the size of the data. Returns the number of attributes found on success, negative value on error. **size** is reset to the total size of the data. If **size** is insufficient to contain the data -E2BIG is returned.h](h)}(h**Parameters**h]j)}(hjЎh]h Parameters}(hjҎhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjΎubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjʎubj )}(hhh](j)}(h0``unsigned int attr`` which attribute to return h](j)}(h``unsigned int attr``h]j)}(hjh]hunsigned int attr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hwhich attribute to returnh]hwhich attribute to return}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hX``struct lsm_ctx __user *uctx`` the user-space destination for the information, or NULL h](j)}(h``struct lsm_ctx __user *uctx``h]j)}(hj(h]hstruct lsm_ctx __user *uctx}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj"ubj2)}(hhh]h)}(h7the user-space destination for the information, or NULLh]h7the user-space destination for the information, or NULL}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj>ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hMhjubj)}(hP``u32 __user *size`` pointer to the size of space available to receive the data h](j)}(h``u32 __user *size``h]j)}(hjah]hu32 __user *size}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj[ubj2)}(hhh]h)}(h:pointer to the size of space available to receive the datah]h:pointer to the size of space available to receive the data}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhMhjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjubj)}(h``u32 flags`` special handling options. LSM_FLAG_SINGLE indicates that only attributes associated with the LSM identified in the passed **ctx** be reported. h](j)}(h ``u32 flags``h]j)}(hjh]h u32 flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hspecial handling options. LSM_FLAG_SINGLE indicates that only attributes associated with the LSM identified in the passed **ctx** be reported.h](hzspecial handling options. LSM_FLAG_SINGLE indicates that only attributes associated with the LSM identified in the passed }(hjhhhNhNubj)}(h**ctx**h]hctx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh be reported.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjʎubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjʎubh)}(hdA NULL value for **uctx** can be used to get both the number of attributes and the size of the data.h](hA NULL value for }(hjhhhNhNubj)}(h**uctx**h]huctx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhK can be used to get both the number of attributes and the size of the data.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjʎubh)}(hReturns the number of attributes found on success, negative value on error. **size** is reset to the total size of the data. If **size** is insufficient to contain the data -E2BIG is returned.h](hLReturns the number of attributes found on success, negative value on error. }(hjhhhNhNubj)}(h**size**h]hsize}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, is reset to the total size of the data. If }(hjhhhNhNubj)}(h**size**h]hsize}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh8 is insufficient to contain the data -E2BIG is returned.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjʎubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !security_setselfattr (C function)c.security_setselfattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h^int security_setselfattr (unsigned int attr, struct lsm_ctx __user *uctx, u32 size, u32 flags)h]j)}(h]int security_setselfattr(unsigned int attr, struct lsm_ctx __user *uctx, u32 size, u32 flags)h](j )}(hinth]hint}(hjrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnhhhjhMubj{)}(hsecurity_setselfattrh]j)}(hsecurity_setselfattrh]hsecurity_setselfattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnhhhjhMubj)}(hE(unsigned int attr, struct lsm_ctx __user *uctx, u32 size, u32 flags)h](j)}(hunsigned int attrh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hjːhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjِhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hattrh]hattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct lsm_ctx __user *uctxh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hlsm_ctxh]hlsm_ctx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_setselfattrasbuh1hhjubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh__user}(hjhhhNhNubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(huctxh]huctx}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hu32 sizeh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j:c.security_setselfattrasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h u32 flagsh](h)}(hhh]j)}(hu32h]hu32}(hjϑhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj̑ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjёmodnameN classnameNj] j` )}jc ]j:c.security_setselfattrasbuh1hhjȑubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjȑubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjȑubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjnhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjjhhhjhMubah}(h]jeah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjghhubj)}(hhh]h)}(h,Set an LSM attribute on the current process.h]h,Set an LSM attribute on the current process.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj"hhubah}(h]h ]h"]h$]h&]uh1jhjghhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj=jj=jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``unsigned int attr`` which attribute to set ``struct lsm_ctx __user *uctx`` the user-space source for the information ``u32 size`` the size of the data ``u32 flags`` reserved for future use, must be 0 **Description** Set an LSM attribute for the current process. The LSM, attribute and new value are included in **uctx**. Returns 0 on success, -EINVAL if the input is inconsistent, -EFAULT if the user buffer is inaccessible, E2BIG if size is too big, or an LSM specific failure.h](h)}(h**Parameters**h]j)}(hjGh]h Parameters}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjAubj )}(hhh](j)}(h-``unsigned int attr`` which attribute to set h](j)}(h``unsigned int attr``h]j)}(hjfh]hunsigned int attr}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj`ubj2)}(hhh]h)}(hwhich attribute to seth]hwhich attribute to set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMhj|ubah}(h]h ]h"]h$]h&]uh1j1hj`ubeh}(h]h ]h"]h$]h&]uh1jhj{hMhj]ubj)}(hJ``struct lsm_ctx __user *uctx`` the user-space source for the information h](j)}(h``struct lsm_ctx __user *uctx``h]j)}(hjh]hstruct lsm_ctx __user *uctx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h)the user-space source for the informationh]h)the user-space source for the information}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj]ubj)}(h"``u32 size`` the size of the data h](j)}(h ``u32 size``h]j)}(hjؒh]hu32 size}(hjڒhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj֒ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjҒubj2)}(hhh]h)}(hthe size of the datah]hthe size of the data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjҒubeh}(h]h ]h"]h$]h&]uh1jhjhMhj]ubj)}(h1``u32 flags`` reserved for future use, must be 0 h](j)}(h ``u32 flags``h]j)}(hjh]h u32 flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubj2)}(hhh]h)}(h"reserved for future use, must be 0h]h"reserved for future use, must be 0}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMhj'ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhj]ubeh}(h]h ]h"]h$]h&]uh1j hjAubh)}(h**Description**h]j)}(hjLh]h Description}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjAubh)}(hhSet an LSM attribute for the current process. The LSM, attribute and new value are included in **uctx**.h](h_Set an LSM attribute for the current process. The LSM, attribute and new value are included in }(hjbhhhNhNubj)}(h**uctx**h]huctx}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh.}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjAubh)}(hReturns 0 on success, -EINVAL if the input is inconsistent, -EFAULT if the user buffer is inaccessible, E2BIG if size is too big, or an LSM specific failure.h]hReturns 0 on success, -EINVAL if the input is inconsistent, -EFAULT if the user buffer is inaccessible, E2BIG if size is too big, or an LSM specific failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !security_getprocattr (C function)c.security_getprocattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h[int security_getprocattr (struct task_struct *p, int lsmid, const char *name, char **value)h]j)}(hZint security_getprocattr(struct task_struct *p, int lsmid, const char *name, char **value)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_getprocattrh]j)}(hsecurity_getprocattrh]hsecurity_getprocattr}(hjӓhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjϓubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hB(struct task_struct *p, int lsmid, const char *name, char **value)h](j)}(hstruct task_struct *ph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h task_structh]h task_struct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jՓsbc.security_getprocattrasbuh1hhjubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int lsmidh](j )}(hinth]hint}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj)}(hlsmidh]hlsmid}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj̔hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnameh]hname}(hjٔhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h char **valueh](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hvalueh]hvalue}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hRead an attribute for a taskh]hRead an attribute for a task}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjOhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjjjuh1jhhhj%hNhNubj)}(hXY**Parameters** ``struct task_struct *p`` the task ``int lsmid`` LSM identification ``const char *name`` attribute name ``char **value`` attribute value **Description** Read attribute **name** for task **p** and store it into **value** if allowed. **Return** Returns the length of **value** on success, a negative value otherwise.h](h)}(h**Parameters**h]j)}(hjth]h Parameters}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjnubj )}(hhh](j)}(h#``struct task_struct *p`` the task h](j)}(h``struct task_struct *p``h]j)}(hjh]hstruct task_struct *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hthe taskh]hthe task}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h!``int lsmid`` LSM identification h](j)}(h ``int lsmid``h]j)}(hj̕h]h int lsmid}(hjΕhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjʕubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjƕubj2)}(hhh]h)}(hLSM identificationh]hLSM identification}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjƕubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h$``const char *name`` attribute name h](j)}(h``const char *name``h]j)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hattribute nameh]hattribute name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h!``char **value`` attribute value h](j)}(h``char **value``h]j)}(hj>h]h char **value}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj8ubj2)}(hhh]h)}(hattribute valueh]hattribute value}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjTubah}(h]h ]h"]h$]h&]uh1j1hj8ubeh}(h]h ]h"]h$]h&]uh1jhjShMhjubeh}(h]h ]h"]h$]h&]uh1j hjnubh)}(h**Description**h]j)}(hjyh]h Description}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjnubh)}(hNRead attribute **name** for task **p** and store it into **value** if allowed.h](hRead attribute }(hjhhhNhNubj)}(h**name**h]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh for task }(hjhhhNhNubj)}(h**p**h]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and store it into }(hjhhhNhNubj)}(h **value**h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if allowed.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjnubh)}(h **Return**h]j)}(hj֖h]hReturn}(hjؖhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԖubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjnubh)}(hGReturns the length of **value** on success, a negative value otherwise.h](hReturns the length of }(hjhhhNhNubj)}(h **value**h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh( on success, a negative value otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjnubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !security_setprocattr (C function)c.security_setprocattrhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hPint security_setprocattr (int lsmid, const char *name, void *value, size_t size)h]j)}(hOint security_setprocattr(int lsmid, const char *name, void *value, size_t size)h](j )}(hinth]hint}(hj-hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM)ubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)hhhj;hM)ubj{)}(hsecurity_setprocattrh]j)}(hsecurity_setprocattrh]hsecurity_setprocattr}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj)hhhj;hM)ubj)}(h7(int lsmid, const char *name, void *value, size_t size)h](j)}(h int lsmidh](j )}(hinth]hint}(hjjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfubj2)}(h h]h }(hjxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfubj)}(hlsmidh]hlsmid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbubj)}(hconst char *nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjȗhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj֗hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbubj)}(h void *valueh](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hvalueh]hvalue}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjCmodnameN classnameNj] j` )}jc ]jf )}jY jPsbc.security_setprocattrasbuh1hhj:ubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(hsizeh]hsize}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjbubeh}(h]h ]h"]h$]h&]jjuh1jhj)hhhj;hM)ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj%hhhj;hM)ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj;hM)hj"hhubj)}(hhh]h)}(hSet an attribute for a taskh]hSet an attribute for a task}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM)hjhhubah}(h]h ]h"]h$]h&]uh1jhj"hhhj;hM)ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX[**Parameters** ``int lsmid`` LSM identification ``const char *name`` attribute name ``void *value`` attribute value ``size_t size`` attribute value size **Description** Write (set) the current task's attribute **name** to **value**, size **size** if allowed. **Return** Returns bytes written on success, a negative value otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM-hjubj )}(hhh](j)}(h!``int lsmid`` LSM identification h](j)}(h ``int lsmid``h]j)}(hjژh]h int lsmid}(hjܘhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjؘubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM*hjԘubj2)}(hhh]h)}(hLSM identificationh]hLSM identification}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM*hjubah}(h]h ]h"]h$]h&]uh1j1hjԘubeh}(h]h ]h"]h$]h&]uh1jhjhM*hjјubj)}(h$``const char *name`` attribute name h](j)}(h``const char *name``h]j)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM+hj ubj2)}(hhh]h)}(hattribute nameh]hattribute name}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hM+hj)ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj(hM+hjјubj)}(h ``void *value`` attribute value h](j)}(h``void *value``h]j)}(hjLh]h void *value}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM,hjFubj2)}(hhh]h)}(hattribute valueh]hattribute value}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahM,hjbubah}(h]h ]h"]h$]h&]uh1j1hjFubeh}(h]h ]h"]h$]h&]uh1jhjahM,hjјubj)}(h%``size_t size`` attribute value size h](j)}(h``size_t size``h]j)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM-hjubj2)}(hhh]h)}(hattribute value sizeh]hattribute value size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM-hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM-hjјubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj™hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM/hjubh)}(hYWrite (set) the current task's attribute **name** to **value**, size **size** if allowed.h](h+Write (set) the current task’s attribute }(hj֙hhhNhNubj)}(h**name**h]hname}(hjޙhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj֙ubh to }(hj֙hhhNhNubj)}(h **value**h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj֙ubh, size }(hj֙hhhNhNubj)}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj֙ubh if allowed.}(hj֙hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM.hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM1hjubh)}(h=Returns bytes written on success, a negative value otherwise.h]h=Returns bytes written on success, a negative value otherwise.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM2hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_post_notification (C function)c.security_post_notificationhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hqint security_post_notification (const struct cred *w_cred, const struct cred *cred, struct watch_notification *n)h]j)}(hpint security_post_notification(const struct cred *w_cred, const struct cred *cred, struct watch_notification *n)h](j )}(hinth]hint}(hjbhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj^hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^hhhjphMubj{)}(hsecurity_post_notificationh]j)}(hsecurity_post_notificationh]hsecurity_post_notification}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj^hhhjphMubj)}(hR(const struct cred *w_cred, const struct cred *cred, struct watch_notification *n)h](j)}(hconst struct cred *w_credh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjǚhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hcredh]hcred}(hjؚhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj՚ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjښmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_post_notificationasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hw_credh]hw_cred}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst struct cred *credh](j)}(hjh]hconst}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(ubj)}(hjAh]hstruct}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(ubh)}(hhh]j)}(hcredh]hcred}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjgmodnameN classnameNj] j` )}jc ]jc.security_post_notificationasbuh1hhj(ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hcredh]hcred}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct watch_notification *nh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjěhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hwatch_notificationh]hwatch_notification}(hj՛hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjқubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjכmodnameN classnameNj] j` )}jc ]jc.security_post_notificationasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj^hhhjphMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjZhhhjphMubah}(h]jUah ](jjeh"]h$]h&]jj)jhuh1jhjphMhjWhhubj)}(hhh]h)}(h+Check if a watch notification can be postedh]h+Check if a watch notification can be posted}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj4hhubah}(h]h ]h"]h$]h&]uh1jhjWhhhjphMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjOjjOjjjuh1jhhhj%hNhNubj)}(hXm**Parameters** ``const struct cred *w_cred`` credentials of the task that set the watch ``const struct cred *cred`` credentials of the task which triggered the watch ``struct watch_notification *n`` the notification **Description** Check to see if a watch notification can be posted to a particular queue. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjYh]h Parameters}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjSubj )}(hhh](j)}(hI``const struct cred *w_cred`` credentials of the task that set the watch h](j)}(h``const struct cred *w_cred``h]j)}(hjxh]hconst struct cred *w_cred}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjrubj2)}(hhh]h)}(h*credentials of the task that set the watchh]h*credentials of the task that set the watch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjrubeh}(h]h ]h"]h$]h&]uh1jhjhMhjoubj)}(hN``const struct cred *cred`` credentials of the task which triggered the watch h](j)}(h``const struct cred *cred``h]j)}(hjh]hconst struct cred *cred}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h1credentials of the task which triggered the watchh]h1credentials of the task which triggered the watch}(hjʜhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjƜhMhjǜubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjƜhMhjoubj)}(h2``struct watch_notification *n`` the notification h](j)}(h ``struct watch_notification *n``h]j)}(hjh]hstruct watch_notification *n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hthe notificationh]hthe notification}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjoubeh}(h]h ]h"]h$]h&]uh1j hjSubh)}(h**Description**h]j)}(hj%h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjSubh)}(hICheck to see if a watch notification can be posted to a particular queue.h]hICheck to see if a watch notification can be posted to a particular queue.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjSubh)}(h **Return**h]j)}(hjLh]hReturn}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjSubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_watch_key (C function)c.security_watch_keyhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h(int security_watch_key (struct key *key)h]j)}(h'int security_watch_key(struct key *key)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_watch_keyh]j)}(hsecurity_watch_keyh]hsecurity_watch_key}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct key *key)h]j)}(hstruct key *keyh](j)}(hjAh]hstruct}(hjΝhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjʝubj2)}(h h]h }(hj۝hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjʝubh)}(hhh]j)}(hkeyh]hkey}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_watch_keyasbuh1hhjʝubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjʝubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjʝubj)}(hkeyh]hkey}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjʝubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjƝubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h2Check if a task is allowed to watch for key eventsh]h2Check if a task is allowed to watch for key events}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjNhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjijjijjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct key *key`` the key to watch **Description** Check to see if a process is allowed to watch for event notifications from a key or keyring. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjsh]h Parameters}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjmubj )}(hhh]j)}(h%``struct key *key`` the key to watch h](j)}(h``struct key *key``h]j)}(hjh]hstruct key *key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hthe key to watchh]hthe key to watch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjmubh)}(h**Description**h]j)}(hj͞h]h Description}(hjϞhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj˞ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjmubh)}(h\Check to see if a process is allowed to watch for event notifications from a key or keyring.h]h\Check to see if a process is allowed to watch for event notifications from a key or keyring.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjmubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjmubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_netlink_send (C function)c.security_netlink_sendhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h@int security_netlink_send (struct sock *sk, struct sk_buff *skb)h]j)}(h?int security_netlink_send(struct sock *sk, struct sk_buff *skb)h](j )}(hinth]hint}(hj9hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjHhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5hhhjGhM ubj{)}(hsecurity_netlink_sendh]j)}(hsecurity_netlink_sendh]hsecurity_netlink_send}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj5hhhjGhM ubj)}(h&(struct sock *sk, struct sk_buff *skb)h](j)}(hstruct sock *skh](j)}(hjAh]hstruct}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubh)}(hhh]j)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j\sbc.security_netlink_sendasbuh1hhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hjh]h*}(hjŸhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hskh]hsk}(hjϟhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnubj)}(hstruct sk_buff *skbh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsk_buffh]hsk_buff}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_netlink_sendasbuh1hhjubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hskbh]hskb}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnubeh}(h]h ]h"]h$]h&]jjuh1jhj5hhhjGhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj1hhhjGhM ubah}(h]j,ah ](jjeh"]h$]h&]jj)jhuh1jhjGhM hj.hhubj)}(hhh]h)}(h1Save info and check if netlink sending is allowedh]h1Save info and check if netlink sending is allowed}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjfhhubah}(h]h ]h"]h$]h&]uh1jhj.hhhjGhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct sock *sk`` sending socket ``struct sk_buff *skb`` netlink message **Description** Save security information for a netlink message so that permission checking can be performed when the message is processed. The security information can be saved using the eff_cap field of the netlink_skb_parms structure. Also may be used to provide fine grained control over message transmission. **Return** Returns 0 if the information was successfully saved and message is allowed to be transmitted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h#``struct sock *sk`` sending socket h](j)}(h``struct sock *sk``h]j)}(hjh]hstruct sock *sk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(hsending socketh]hsending socket}(hjàhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h(``struct sk_buff *skb`` netlink message h](j)}(h``struct sk_buff *skb``h]j)}(hjh]hstruct sk_buff *skb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjݠubj2)}(hhh]h)}(hnetlink messageh]hnetlink message}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjݠubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hX*Save security information for a netlink message so that permission checking can be performed when the message is processed. The security information can be saved using the eff_cap field of the netlink_skb_parms structure. Also may be used to provide fine grained control over message transmission.h]hX*Save security information for a netlink message so that permission checking can be performed when the message is processed. The security information can be saved using the eff_cap field of the netlink_skb_parms structure. Also may be used to provide fine grained control over message transmission.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjEh]hReturn}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h]Returns 0 if the information was successfully saved and message is allowed to be transmitted.h]h]Returns 0 if the information was successfully saved and message is allowed to be transmitted.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_socket_create (C function)c.security_socket_createhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hIint security_socket_create (int family, int type, int protocol, int kern)h]j)}(hHint security_socket_create(int family, int type, int protocol, int kern)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMTubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMTubj{)}(hsecurity_socket_createh]j)}(hsecurity_socket_createh]hsecurity_socket_create}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMTubj)}(h.(int family, int type, int protocol, int kern)h](j)}(h int familyh](j )}(hinth]hint}(hjǡhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjáubj2)}(h h]h }(hjաhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjáubj)}(hfamilyh]hfamily}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjáubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint typeh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(htypeh]htype}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int protocolh](j )}(hinth]hint}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj-ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(hprotocolh]hprotocol}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint kernh](j )}(hinth]hint}(hjfhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjbubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbubj)}(hkernh]hkern}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMTubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMTubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1jhjhMThjhhubj)}(hhh]h)}(h)Check if creating a new socket is allowedh]h)Check if creating a new socket is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMThjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMTubeh}(h]h ](jfunctioneh"]h$]h&]jjjjĢjjĢjjjuh1jhhhj%hNhNubj)}(hX)**Parameters** ``int family`` protocol family ``int type`` communications type ``int protocol`` requested protocol ``int kern`` set to 1 if a kernel socket is requested **Description** Check permissions prior to creating a new socket. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj΢h]h Parameters}(hjТhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̢ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMXhjȢubj )}(hhh](j)}(h``int family`` protocol family h](j)}(h``int family``h]j)}(hjh]h int family}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMUhjubj2)}(hhh]h)}(hprotocol familyh]hprotocol family}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMUhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMUhjubj)}(h!``int type`` communications type h](j)}(h ``int type``h]j)}(hj&h]hint type}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMVhj ubj2)}(hhh]h)}(hcommunications typeh]hcommunications type}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMVhj<ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj;hMVhjubj)}(h$``int protocol`` requested protocol h](j)}(h``int protocol``h]j)}(hj_h]h int protocol}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMWhjYubj2)}(hhh]h)}(hrequested protocolh]hrequested protocol}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthMWhjuubah}(h]h ]h"]h$]h&]uh1j1hjYubeh}(h]h ]h"]h$]h&]uh1jhjthMWhjubj)}(h6``int kern`` set to 1 if a kernel socket is requested h](j)}(h ``int kern``h]j)}(hjh]hint kern}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMXhjubj2)}(hhh]h)}(h(set to 1 if a kernel socket is requestedh]h(set to 1 if a kernel socket is requested}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMXhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMXhjubeh}(h]h ]h"]h$]h&]uh1j hjȢubh)}(h**Description**h]j)}(hjӣh]h Description}(hjգhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjѣubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMZhjȢubh)}(h1Check permissions prior to creating a new socket.h]h1Check permissions prior to creating a new socket.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMYhjȢubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM[hjȢubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\hjȢubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_socket_post_create (C function)c.security_socket_post_createhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hcint security_socket_post_create (struct socket *sock, int family, int type, int protocol, int kern)h]j)}(hbint security_socket_post_create(struct socket *sock, int family, int type, int protocol, int kern)h](j )}(hinth]hint}(hj?hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj;hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMdubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;hhhjMhMdubj{)}(hsecurity_socket_post_createh]j)}(hsecurity_socket_post_createh]hsecurity_socket_post_create}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj;hhhjMhMdubj)}(hC(struct socket *sock, int family, int type, int protocol, int kern)h](j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubh)}(hhh]j)}(hsocketh]hsocket}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jbsbc.security_socket_post_createasbuh1hhjxubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubj)}(hjh]h*}(hjȤhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(hsockh]hsock}(hjդhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubj)}(h int familyh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hfamilyh]hfamily}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubj)}(hint typeh](j )}(hinth]hint}(hj#hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(htypeh]htype}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubj)}(h int protocolh](j )}(hinth]hint}(hjXhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjTubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hprotocolh]hprotocol}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubj)}(hint kernh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hkernh]hkern}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubeh}(h]h ]h"]h$]h&]jjuh1jhj;hhhjMhMdubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj7hhhjMhMdubah}(h]j2ah ](jjeh"]h$]h&]jj)jhuh1jhjMhMdhj4hhubj)}(hhh]h)}(h!Initialize a newly created socketh]h!Initialize a newly created socket}(hjӥhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMdhjХhhubah}(h]h ]h"]h$]h&]uh1jhj4hhhjMhMdubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct socket *sock`` socket ``int family`` protocol family ``int type`` communications type ``int protocol`` requested protocol ``int kern`` set to 1 if a kernel socket is requested **Description** This hook allows a module to update or allocate a per-socket security structure. Note that the security field was not added directly to the socket structure, but rather, the socket security information is stored in the associated inode. Typically, the inode alloc_security hook will allocate and attach security information to SOCK_INODE(sock)->i_security. This hook may be used to update the SOCK_INODE(sock)->i_security field with additional information that wasn't available when the inode was allocated. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhhjubj )}(hhh](j)}(h``struct socket *sock`` socket h](j)}(h``struct socket *sock``h]j)}(hjh]hstruct socket *sock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMehjubj2)}(hhh]h)}(hsocketh]hsocket}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMehj*ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj)hMehj ubj)}(h``int family`` protocol family h](j)}(h``int family``h]j)}(hjMh]h int family}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMfhjGubj2)}(hhh]h)}(hprotocol familyh]hprotocol family}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMfhjcubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhjbhMfhj ubj)}(h!``int type`` communications type h](j)}(h ``int type``h]j)}(hjh]hint type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMghjubj2)}(hhh]h)}(hcommunications typeh]hcommunications type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMghjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMghj ubj)}(h$``int protocol`` requested protocol h](j)}(h``int protocol``h]j)}(hjh]h int protocol}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhhjubj2)}(hhh]h)}(hrequested protocolh]hrequested protocol}(hjئhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjԦhMhhjզubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjԦhMhhj ubj)}(h6``int kern`` set to 1 if a kernel socket is requested h](j)}(h ``int kern``h]j)}(hjh]hint kern}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMihjubj2)}(hhh]h)}(h(set to 1 if a kernel socket is requestedh]h(set to 1 if a kernel socket is requested}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMihjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMihj ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj3h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMkhjubh)}(hXThis hook allows a module to update or allocate a per-socket security structure. Note that the security field was not added directly to the socket structure, but rather, the socket security information is stored in the associated inode. Typically, the inode alloc_security hook will allocate and attach security information to SOCK_INODE(sock)->i_security. This hook may be used to update the SOCK_INODE(sock)->i_security field with additional information that wasn't available when the inode was allocated.h]hXThis hook allows a module to update or allocate a per-socket security structure. Note that the security field was not added directly to the socket structure, but rather, the socket security information is stored in the associated inode. Typically, the inode alloc_security hook will allocate and attach security information to SOCK_INODE(sock)->i_security. This hook may be used to update the SOCK_INODE(sock)->i_security field with additional information that wasn’t available when the inode was allocated.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMjhjubh)}(h **Return**h]j)}(hjZh]hReturn}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMrhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMshjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !security_socket_bind (C function)c.security_socket_bindhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hUint security_socket_bind (struct socket *sock, struct sockaddr *address, int addrlen)h]j)}(hTint security_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_socket_bindh]j)}(hsecurity_socket_bindh]hsecurity_socket_bind}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h<(struct socket *sock, struct sockaddr *address, int addrlen)h](j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjܧhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjاubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjاubh)}(hhh]j)}(hsocketh]hsocket}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j§sbc.security_socket_bindasbuh1hhjاubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjاubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjاubj)}(hsockh]hsock}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjاubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjԧubj)}(hstruct sockaddr *addressh](j)}(hjAh]hstruct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubh)}(hhh]j)}(hsockaddrh]hsockaddr}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjnmodnameN classnameNj] j` )}jc ]jc.security_socket_bindasbuh1hhjJubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj)}(haddressh]haddress}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjԧubj)}(h int addrlenh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj̨hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(haddrlenh]haddrlen}(hjڨhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjԧubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h+Check if a socket bind operation is allowedh]h+Check if a socket bind operation is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hXq**Parameters** ``struct socket *sock`` socket ``struct sockaddr *address`` requested bind address ``int addrlen`` length of address **Description** Check permission before socket protocol layer bind operation is performed and the socket **sock** is bound to the address specified in the **address** parameter. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubj )}(hhh](j)}(h``struct socket *sock`` socket h](j)}(h``struct socket *sock``h]j)}(hjEh]hstruct socket *sock}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj?ubj2)}(hhh]h)}(hsocketh]hsocket}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhMhj[ubah}(h]h ]h"]h$]h&]uh1j1hj?ubeh}(h]h ]h"]h$]h&]uh1jhjZhMhj<ubj)}(h4``struct sockaddr *address`` requested bind address h](j)}(h``struct sockaddr *address``h]j)}(hj~h]hstruct sockaddr *address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjxubj2)}(hhh]h)}(hrequested bind addressh]hrequested bind address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjxubeh}(h]h ]h"]h$]h&]uh1jhjhMhj<ubj)}(h"``int addrlen`` length of address h](j)}(h``int addrlen``h]j)}(hjh]h int addrlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hlength of addressh]hlength of address}(hjЩhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj̩hMhjͩubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj̩hMhj<ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubh)}(hCheck permission before socket protocol layer bind operation is performed and the socket **sock** is bound to the address specified in the **address** parameter.h](hYCheck permission before socket protocol layer bind operation is performed and the socket }(hjhhhNhNubj)}(h**sock**h]hsock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh* is bound to the address specified in the }(hjhhhNhNubj)}(h **address**h]haddress}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh parameter.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubh)}(h **Return**h]j)}(hj=h]hReturn}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_socket_connect (C function)c.security_socket_connecthNtauh1hhj%hhhNhNubj)}(hhh](j)}(hXint security_socket_connect (struct socket *sock, struct sockaddr *address, int addrlen)h]j)}(hWint security_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~hhhjhMubj{)}(hsecurity_socket_connecth]j)}(hsecurity_socket_connecth]hsecurity_socket_connect}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj~hhhjhMubj)}(h<(struct socket *sock, struct sockaddr *address, int addrlen)h](j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj̪hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsocketh]hsocket}(hjݪhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڪubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjߪmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_socket_connectasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct sockaddr *addressh](j)}(hjAh]hstruct}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubh)}(hhh]j)}(hsockaddrh]hsockaddr}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjQmodnameN classnameNj] j` )}jc ]jc.security_socket_connectasbuh1hhj-ubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(hjh]h*}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(haddressh]haddress}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int addrlenh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(haddrlenh]haddrlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj~hhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjzhhhjhMubah}(h]juah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjwhhubj)}(hhh]h)}(h.Check if a socket connect operation is allowedh]h.Check if a socket connect operation is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjwhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hXa**Parameters** ``struct socket *sock`` socket ``struct sockaddr *address`` address of remote connection point ``int addrlen`` length of address **Description** Check permission before socket protocol layer connect operation attempts to connect socket **sock** to a remote address, **address**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h``struct socket *sock`` socket h](j)}(h``struct socket *sock``h]j)}(hj(h]hstruct socket *sock}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj"ubj2)}(hhh]h)}(hsocketh]hsocket}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj>ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hMhjubj)}(h@``struct sockaddr *address`` address of remote connection point h](j)}(h``struct sockaddr *address``h]j)}(hjah]hstruct sockaddr *address}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj[ubj2)}(hhh]h)}(h"address of remote connection pointh]h"address of remote connection point}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhMhjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjubj)}(h"``int addrlen`` length of address h](j)}(h``int addrlen``h]j)}(hjh]h int addrlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hlength of addressh]hlength of address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjլh]h Description}(hj׬hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӬubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hCheck permission before socket protocol layer connect operation attempts to connect socket **sock** to a remote address, **address**.h](h[Check permission before socket protocol layer connect operation attempts to connect socket }(hjhhhNhNubj)}(h**sock**h]hsock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to a remote address, }(hjhhhNhNubj)}(h **address**h]haddress}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hj h]hReturn}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_socket_listen (C function)c.security_socket_listenhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h=int security_socket_listen (struct socket *sock, int backlog)h]j)}(hah"]h$]h&]uh1j1hjahhhjshMubj{)}(hsecurity_socket_listenh]j)}(hsecurity_socket_listenh]hsecurity_socket_listen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjahhhjshMubj)}(h"(struct socket *sock, int backlog)h](j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsocketh]hsocket}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj­modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_socket_listenasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int backlogh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hbacklogh]hbacklog}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjahhhjshMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]hhhjshMubah}(h]jXah ](jjeh"]h$]h&]jj)jhuh1jhjshMhjZhhubj)}(hhh]h)}(h&Check if a socket is allowed to listenh]h&Check if a socket is allowed to listen}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjWhhubah}(h]h ]h"]h$]h&]uh1jhjZhhhjshMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjrjjrjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct socket *sock`` socket ``int backlog`` connection queue size **Description** Check permission before socket protocol layer listen operation. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj|h]h Parameters}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjvubj )}(hhh](j)}(h``struct socket *sock`` socket h](j)}(h``struct socket *sock``h]j)}(hjh]hstruct socket *sock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hsocketh]hsocket}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h&``int backlog`` connection queue size h](j)}(h``int backlog``h]j)}(hjԮh]h int backlog}(hj֮hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjҮubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjήubj2)}(hhh]h)}(hconnection queue sizeh]hconnection queue size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjήubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjvubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjvubh)}(h?Check permission before socket protocol layer listen operation.h]h?Check permission before socket protocol layer listen operation.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjvubh)}(h **Return**h]j)}(hj6h]hReturn}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjvubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_socket_accept (C function)c.security_socket_accepthNtauh1hhj%hhhNhNubj)}(hhh](j)}(hHint security_socket_accept (struct socket *sock, struct socket *newsock)h]j)}(hGint security_socket_accept(struct socket *sock, struct socket *newsock)h](j )}(hinth]hint}(hj{hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjwhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwhhhjhMubj{)}(hsecurity_socket_accepth]j)}(hsecurity_socket_accepth]hsecurity_socket_accept}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjwhhhjhMubj)}(h-(struct socket *sock, struct socket *newsock)h](j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjůhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsocketh]hsocket}(hj֯hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjӯubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjدmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_socket_acceptasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct socket *newsockh](j)}(hjAh]hstruct}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubh)}(hhh]j)}(hsocketh]hsocket}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjJmodnameN classnameNj] j` )}jc ]jc.security_socket_acceptasbuh1hhj&ubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hnewsockh]hnewsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjwhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjshhhjhMubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjphhubj)}(hhh]h)}(h2Check if a socket is allowed to accept connectionsh]h2Check if a socket is allowed to accept connections}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjphhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjðjjðjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct socket *sock`` listening socket ``struct socket *newsock`` newly creation connection socket **Description** Check permission before accepting a new connection. Note that the new socket, **newsock**, has been created and some information copied to it, but the accept operation has not actually been performed. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjͰh]h Parameters}(hjϰhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj˰ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjǰubj )}(hhh](j)}(h)``struct socket *sock`` listening socket h](j)}(h``struct socket *sock``h]j)}(hjh]hstruct socket *sock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hlistening socketh]hlistening socket}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h<``struct socket *newsock`` newly creation connection socket h](j)}(h``struct socket *newsock``h]j)}(hj%h]hstruct socket *newsock}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h newly creation connection socketh]h newly creation connection socket}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hMhj;ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj:hMhjubeh}(h]h ]h"]h$]h&]uh1j hjǰubh)}(h**Description**h]j)}(hj`h]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjǰubh)}(hCheck permission before accepting a new connection. Note that the new socket, **newsock**, has been created and some information copied to it, but the accept operation has not actually been performed.h](hOCheck permission before accepting a new connection. Note that the new socket, }(hjvhhhNhNubj)}(h **newsock**h]hnewsock}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubho, has been created and some information copied to it, but the accept operation has not actually been performed.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjǰubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjǰubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjǰubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_socket_sendmsg (C function)c.security_socket_sendmsghNtauh1hhj%hhhNhNubj)}(hhh](j)}(hOint security_socket_sendmsg (struct socket *sock, struct msghdr *msg, int size)h]j)}(hNint security_socket_sendmsg(struct socket *sock, struct msghdr *msg, int size)h](j )}(hinth]hint}(hjޱhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjڱhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjڱhhhjhMubj{)}(hsecurity_socket_sendmsgh]j)}(hsecurity_socket_sendmsgh]hsecurity_socket_sendmsg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjڱhhhjhMubj)}(h3(struct socket *sock, struct msghdr *msg, int size)h](j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsocketh]hsocket}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj;modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_socket_sendmsgasbuh1hhjubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsockh]hsock}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct msghdr *msgh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hmsghdrh]hmsghdr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jUc.security_socket_sendmsgasbuh1hhjubj2)}(h h]h }(hjɲhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjײhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmsgh]hmsg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint sizeh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjڱhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjֱhhhjhMubah}(h]jѱah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjӱhhubj)}(hhh]h)}(h%Check if sending a message is allowedh]h%Check if sending a message is allowed}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj@hhubah}(h]h ]h"]h$]h&]uh1jhjӱhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[jj[jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct socket *sock`` sending socket ``struct msghdr *msg`` message to send ``int size`` size of message **Description** Check permission before transmitting a message to another socket. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjeh]h Parameters}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj_ubj )}(hhh](j)}(h'``struct socket *sock`` sending socket h](j)}(h``struct socket *sock``h]j)}(hjh]hstruct socket *sock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj~ubj2)}(hhh]h)}(hsending socketh]hsending socket}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj~ubeh}(h]h ]h"]h$]h&]uh1jhjhMhj{ubj)}(h'``struct msghdr *msg`` message to send h](j)}(h``struct msghdr *msg``h]j)}(hjh]hstruct msghdr *msg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hmessage to sendh]hmessage to send}(hjֳhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjҳhMhjӳubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjҳhMhj{ubj)}(h``int size`` size of message h](j)}(h ``int size``h]j)}(hjh]hint size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hsize of messageh]hsize of message}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMhj{ubeh}(h]h ]h"]h$]h&]uh1j hj_ubh)}(h**Description**h]j)}(hj1h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj_ubh)}(hACheck permission before transmitting a message to another socket.h]hACheck permission before transmitting a message to another socket.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj_ubh)}(h **Return**h]j)}(hjXh]hReturn}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj_ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_socket_recvmsg (C function)c.security_socket_recvmsghNtauh1hhj%hhhNhNubj)}(hhh](j)}(hZint security_socket_recvmsg (struct socket *sock, struct msghdr *msg, int size, int flags)h]j)}(hYint security_socket_recvmsg(struct socket *sock, struct msghdr *msg, int size, int flags)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_socket_recvmsgh]j)}(hsecurity_socket_recvmsgh]hsecurity_socket_recvmsg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h>(struct socket *sock, struct msghdr *msg, int size, int flags)h](j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjڴhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjִubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjִubh)}(hhh]j)}(hsocketh]hsocket}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_socket_recvmsgasbuh1hhjִubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjִubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjִubj)}(hsockh]hsock}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjִubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjҴubj)}(hstruct msghdr *msgh](j)}(hjAh]hstruct}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubh)}(hhh]j)}(hmsghdrh]hmsghdr}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlmodnameN classnameNj] j` )}jc ]jc.security_socket_recvmsgasbuh1hhjHubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hmsgh]hmsg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjҴubj)}(hint sizeh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjʵhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsizeh]hsize}(hjصhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjҴubj)}(h int flagsh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hflagsh]hflags}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjҴubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h'Check if receiving a message is allowedh]h'Check if receiving a message is allowed}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj4hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjOjjOjjjuh1jhhhj%hNhNubj)}(hX(**Parameters** ``struct socket *sock`` receiving socket ``struct msghdr *msg`` message to receive ``int size`` size of message ``int flags`` operational flags **Description** Check permission before receiving a message from a socket. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjYh]h Parameters}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjSubj )}(hhh](j)}(h)``struct socket *sock`` receiving socket h](j)}(h``struct socket *sock``h]j)}(hjxh]hstruct socket *sock}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjrubj2)}(hhh]h)}(hreceiving socketh]hreceiving socket}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjrubeh}(h]h ]h"]h$]h&]uh1jhjhMhjoubj)}(h*``struct msghdr *msg`` message to receive h](j)}(h``struct msghdr *msg``h]j)}(hjh]hstruct msghdr *msg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hmessage to receiveh]hmessage to receive}(hjʶhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjƶhMhjǶubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjƶhMhjoubj)}(h``int size`` size of message h](j)}(h ``int size``h]j)}(hjh]hint size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hsize of messageh]hsize of message}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjoubj)}(h ``int flags`` operational flags h](j)}(h ``int flags``h]j)}(hj#h]h int flags}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hoperational flagsh]hoperational flags}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj9ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj8hMhjoubeh}(h]h ]h"]h$]h&]uh1j hjSubh)}(h**Description**h]j)}(hj^h]h Description}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjSubh)}(h:Check permission before receiving a message from a socket.h]h:Check permission before receiving a message from a socket.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjSubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjSubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_socket_getsockname (C function)c.security_socket_getsocknamehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h5int security_socket_getsockname (struct socket *sock)h]j)}(h4int security_socket_getsockname(struct socket *sock)h](j )}(hinth]hint}(hjʷhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjƷhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjٷhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjƷhhhjطhMubj{)}(hsecurity_socket_getsocknameh]j)}(hsecurity_socket_getsocknameh]hsecurity_socket_getsockname}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjƷhhhjطhMubj)}(h(struct socket *sock)h]j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsocketh]hsocket}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj'modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_socket_getsocknameasbuh1hhjubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsockh]hsock}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjƷhhhjطhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj·hhhjطhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjطhMhjhhubj)}(hhh]h)}(h+Check if reading the socket addr is allowedh]h+Check if reading the socket addr is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjطhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct socket *sock`` socket **Description** Check permission before reading the local address (name) of the socket object. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh]j)}(h``struct socket *sock`` socket h](j)}(h``struct socket *sock``h]j)}(hj˸h]hstruct socket *sock}(hj͸hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɸubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjŸubj2)}(hhh]h)}(hsocketh]hsocket}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjŸubeh}(h]h ]h"]h$]h&]uh1jhjhMhj¸ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hNCheck permission before reading the local address (name) of the socket object.h]hNCheck permission before reading the local address (name) of the socket object.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hj-h]hReturn}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_socket_getpeername (C function)c.security_socket_getpeernamehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h5int security_socket_getpeername (struct socket *sock)h]j)}(h4int security_socket_getpeername(struct socket *sock)h](j )}(hinth]hint}(hjrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnhhhjhMubj{)}(hsecurity_socket_getpeernameh]j)}(hsecurity_socket_getpeernameh]hsecurity_socket_getpeername}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnhhhjhMubj)}(h(struct socket *sock)h]j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsocketh]hsocket}(hj͹hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjʹubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjϹmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_socket_getpeernameasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjnhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjjhhhjhMubah}(h]jeah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjghhubj)}(hhh]h)}(h+Check if reading the peer's addr is allowedh]h-Check if reading the peer’s addr is allowed}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj/hhubah}(h]h ]h"]h$]h&]uh1jhjghhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjJjjJjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct socket *sock`` socket **Description** Check permission before the remote address (name) of a socket object. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjTh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjNubj )}(hhh]j)}(h``struct socket *sock`` socket h](j)}(h``struct socket *sock``h]j)}(hjsh]hstruct socket *sock}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjmubj2)}(hhh]h)}(hsocketh]hsocket}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjhMhjjubah}(h]h ]h"]h$]h&]uh1j hjNubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjNubh)}(hECheck permission before the remote address (name) of a socket object.h]hECheck permission before the remote address (name) of a socket object.}(hjĺhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjNubh)}(h **Return**h]j)}(hjպh]hReturn}(hj׺hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӺubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjNubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_socket_getsockopt (C function)c.security_socket_getsockopthNtauh1hhj%hhhNhNubj)}(hhh](j)}(hLint security_socket_getsockopt (struct socket *sock, int level, int optname)h]j)}(hKint security_socket_getsockopt(struct socket *sock, int level, int optname)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj(hM ubj{)}(hsecurity_socket_getsockopth]j)}(hsecurity_socket_getsockopth]hsecurity_socket_getsockopt}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj(hM ubj)}(h-(struct socket *sock, int level, int optname)h](j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubh)}(hhh]j)}(hsocketh]hsocket}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjwmodnameN classnameNj] j` )}jc ]jf )}jY j=sbc.security_socket_getsockoptasbuh1hhjSubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubj)}(h int levelh](j )}(hinth]hint}(hjɻhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjŻubj2)}(h h]h }(hj׻hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjŻubj)}(hlevelh]hlevel}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjŻubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubj)}(h int optnameh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hoptnameh]hoptname}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj(hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj(hM ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj(hM hjhhubj)}(hhh]h)}(h+Check if reading a socket option is allowedh]h+Check if reading a socket option is allowed}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjAhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj(hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj\jj\jjjuh1jhhhj%hNhNubj)}(hX **Parameters** ``struct socket *sock`` socket ``int level`` option's protocol level ``int optname`` option name **Description** Check permissions before retrieving the options associated with socket **sock**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj`ubj )}(hhh](j)}(h``struct socket *sock`` socket h](j)}(h``struct socket *sock``h]j)}(hjh]hstruct socket *sock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(hsocketh]hsocket}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hj|ubj)}(h&``int level`` option's protocol level h](j)}(h ``int level``h]j)}(hjh]h int level}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(hoption's protocol levelh]hoption’s protocol level}(hj׼hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjӼhM hjԼubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjӼhM hj|ubj)}(h``int optname`` option name h](j)}(h``int optname``h]j)}(hjh]h int optname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(h option nameh]h option name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM hj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hM hj|ubeh}(h]h ]h"]h$]h&]uh1j hj`ubh)}(h**Description**h]j)}(hj2h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj`ubh)}(hPCheck permissions before retrieving the options associated with socket **sock**.h](hGCheck permissions before retrieving the options associated with socket }(hjHhhhNhNubj)}(h**sock**h]hsock}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj`ubh)}(h **Return**h]j)}(hjkh]hReturn}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj`ubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_socket_setsockopt (C function)c.security_socket_setsockopthNtauh1hhj%hhhNhNubj)}(hhh](j)}(hLint security_socket_setsockopt (struct socket *sock, int level, int optname)h]j)}(hKint security_socket_setsockopt(struct socket *sock, int level, int optname)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_socket_setsockopth]j)}(hsecurity_socket_setsockopth]hsecurity_socket_setsockopt}(hjѽhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjͽubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h-(struct socket *sock, int level, int optname)h](j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsocketh]hsocket}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY jӽsbc.security_socket_setsockoptasbuh1hhjubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsockh]hsock}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int levelh](j )}(hinth]hint}(hj_hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[ubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[ubj)}(hlevelh]hlevel}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int optnameh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hoptnameh]hoptname}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h+Check if setting a socket option is allowedh]h+Check if setting a socket option is allowed}(hjھhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj׾hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX **Parameters** ``struct socket *sock`` socket ``int level`` option's protocol level ``int optname`` option name **Description** Check permissions before setting the options associated with socket **sock**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h``struct socket *sock`` socket h](j)}(h``struct socket *sock``h]j)}(hjh]hstruct socket *sock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hsocketh]hsocket}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj1ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj0hMhjubj)}(h&``int level`` option's protocol level h](j)}(h ``int level``h]j)}(hjTh]h int level}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjNubj2)}(hhh]h)}(hoption's protocol levelh]hoption’s protocol level}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihMhjjubah}(h]h ]h"]h$]h&]uh1j1hjNubeh}(h]h ]h"]h$]h&]uh1jhjihMhjubj)}(h``int optname`` option name h](j)}(h``int optname``h]j)}(hjh]h int optname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h option nameh]h option name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjȿh]h Description}(hjʿhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƿubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hMCheck permissions before setting the options associated with socket **sock**.h](hDCheck permissions before setting the options associated with socket }(hj޿hhhNhNubj)}(h**sock**h]hsock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj޿ubh.}(hj޿hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_socket_shutdown (C function)c.security_socket_shutdownhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h;int security_socket_shutdown (struct socket *sock, int how)h]j)}(h:int security_socket_shutdown(struct socket *sock, int how)h](j )}(hinth]hint}(hjFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM(ubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBhhhjThM(ubj{)}(hsecurity_socket_shutdownh]j)}(hsecurity_socket_shutdownh]hsecurity_socket_shutdown}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjBhhhjThM(ubj)}(h(struct socket *sock, int how)h](j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsocketh]hsocket}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jisbc.security_socket_shutdownasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubj)}(hint howh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hhowh]hhow}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj{ubeh}(h]h ]h"]h$]h&]jjuh1jhjBhhhjThM(ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj>hhhjThM(ubah}(h]j9ah ](jjeh"]h$]h&]jj)jhuh1jhjThM(hj;hhubj)}(hhh]h)}(h-Checks if shutting down the socket is allowedh]h-Checks if shutting down the socket is allowed}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM(hj8hhubah}(h]h ]h"]h$]h&]uh1jhj;hhhjThM(ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjSjjSjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct socket *sock`` socket ``int how`` flag indicating how sends and receives are handled **Description** Checks permission before all or part of a connection on the socket **sock** is shut down. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj]h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM,hjWubj )}(hhh](j)}(h``struct socket *sock`` socket h](j)}(h``struct socket *sock``h]j)}(hj|h]hstruct socket *sock}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM)hjvubj2)}(hhh]h)}(hsocketh]hsocket}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM)hjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhM)hjsubj)}(h?``int how`` flag indicating how sends and receives are handled h](j)}(h ``int how``h]j)}(hjh]hint how}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM*hjubj2)}(hhh]h)}(h2flag indicating how sends and receives are handledh]h2flag indicating how sends and receives are handled}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM*hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM*hjsubeh}(h]h ]h"]h$]h&]uh1j hjWubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM,hjWubh)}(hYChecks permission before all or part of a connection on the socket **sock** is shut down.h](hCChecks permission before all or part of a connection on the socket }(hjhhhNhNubj)}(h**sock**h]hsock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is shut down.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM+hjWubh)}(h **Return**h]j)}(hj)h]hReturn}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM.hjWubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM/hjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j .security_socket_getpeersec_stream (C function)#c.security_socket_getpeersec_streamhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hqint security_socket_getpeersec_stream (struct socket *sock, sockptr_t optval, sockptr_t optlen, unsigned int len)h]j)}(hpint security_socket_getpeersec_stream(struct socket *sock, sockptr_t optval, sockptr_t optlen, unsigned int len)h](j )}(hinth]hint}(hjnhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMIubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjhhhj|hMIubj{)}(h!security_socket_getpeersec_streamh]j)}(h!security_socket_getpeersec_streamh]h!security_socket_getpeersec_stream}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjjhhhj|hMIubj)}(hK(struct socket *sock, sockptr_t optval, sockptr_t optlen, unsigned int len)h](j)}(hstruct socket *sockh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsocketh]hsocket}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb#c.security_socket_getpeersec_streamasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsockptr_t optvalh](h)}(hhh]j)}(h sockptr_th]h sockptr_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj"modnameN classnameNj] j` )}jc ]j#c.security_socket_getpeersec_streamasbuh1hhjubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hoptvalh]hoptval}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsockptr_t optlenh](h)}(hhh]j)}(h sockptr_th]h sockptr_t}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjjmodnameN classnameNj] j` )}jc ]j#c.security_socket_getpeersec_streamasbuh1hhjaubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(hoptlenh]hoptlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int lenh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjjhhhj|hMIubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjfhhhj|hMIubah}(h]jaah ](jjeh"]h$]h&]jj)jhuh1jhj|hMIhjchhubj)}(hhh]h)}(hGet the remote peer labelh]hGet the remote peer label}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMIhj hhubah}(h]h ]h"]h$]h&]uh1jhjchhhj|hMIubeh}(h]h ](jfunctioneh"]h$]h&]jjjj'jj'jjjuh1jhhhj%hNhNubj)}(hX/**Parameters** ``struct socket *sock`` socket ``sockptr_t optval`` destination buffer ``sockptr_t optlen`` size of peer label copied into the buffer ``unsigned int len`` maximum size of the destination buffer **Description** This hook allows the security module to provide peer socket security state for unix or connected tcp sockets to userspace via getsockopt SO_GETPEERSEC. For tcp sockets this can be meaningful if the socket is associated with an ipsec SA. **Return** Returns 0 if all is well, otherwise, typical getsockopt return values.h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMMhj+ubj )}(hhh](j)}(h``struct socket *sock`` socket h](j)}(h``struct socket *sock``h]j)}(hjPh]hstruct socket *sock}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMJhjJubj2)}(hhh]h)}(hsocketh]hsocket}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMJhjfubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjehMJhjGubj)}(h(``sockptr_t optval`` destination buffer h](j)}(h``sockptr_t optval``h]j)}(hjh]hsockptr_t optval}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMKhjubj2)}(hhh]h)}(hdestination bufferh]hdestination buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMKhjGubj)}(h?``sockptr_t optlen`` size of peer label copied into the buffer h](j)}(h``sockptr_t optlen``h]j)}(hjh]hsockptr_t optlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMLhjubj2)}(hhh]h)}(h)size of peer label copied into the bufferh]h)size of peer label copied into the buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMLhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMLhjGubj)}(h<``unsigned int len`` maximum size of the destination buffer h](j)}(h``unsigned int len``h]j)}(hjh]hunsigned int len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMMhjubj2)}(hhh]h)}(h&maximum size of the destination bufferh]h&maximum size of the destination buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMMhjGubeh}(h]h ]h"]h$]h&]uh1j hj+ubh)}(h**Description**h]j)}(hj6h]h Description}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMOhj+ubh)}(hThis hook allows the security module to provide peer socket security state for unix or connected tcp sockets to userspace via getsockopt SO_GETPEERSEC. For tcp sockets this can be meaningful if the socket is associated with an ipsec SA.h]hThis hook allows the security module to provide peer socket security state for unix or connected tcp sockets to userspace via getsockopt SO_GETPEERSEC. For tcp sockets this can be meaningful if the socket is associated with an ipsec SA.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMNhj+ubh)}(h **Return**h]j)}(hj]h]hReturn}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMShj+ubh)}(hFReturns 0 if all is well, otherwise, typical getsockopt return values.h]hFReturns 0 if all is well, otherwise, typical getsockopt return values.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMThj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lsm_sock_alloc (C function)c.lsm_sock_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h1int lsm_sock_alloc (struct sock *sock, gfp_t gfp)h]j)}(h0int lsm_sock_alloc(struct sock *sock, gfp_t gfp)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMtubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMtubj{)}(hlsm_sock_alloch]j)}(hlsm_sock_alloch]hlsm_sock_alloc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMtubj)}(h(struct sock *sock, gfp_t gfp)h](j)}(hstruct sock *sockh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.lsm_sock_allocasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsockh]hsock}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjVmodnameN classnameNj] j` )}jc ]jc.lsm_sock_allocasbuh1hhjMubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMtubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMtubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMthjhhubj)}(hhh]h)}(hallocate a composite sock blobh]hallocate a composite sock blob}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMthjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMtubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct sock *sock`` the sock that needs a blob ``gfp_t gfp`` allocation mode **Description** Allocate the sock blob for all the modules Returns 0, or -ENOMEM if memory can't be allocated.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMxhjubj )}(hhh](j)}(h1``struct sock *sock`` the sock that needs a blob h](j)}(h``struct sock *sock``h]j)}(hjh]hstruct sock *sock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMuhjubj2)}(hhh]h)}(hthe sock that needs a blobh]hthe sock that needs a blob}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMuhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMuhjubj)}(h``gfp_t gfp`` allocation mode h](j)}(h ``gfp_t gfp``h]j)}(hj$h]h gfp_t gfp}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMvhjubj2)}(hhh]h)}(hallocation modeh]hallocation mode}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hMvhj:ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj9hMvhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj_h]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMxhjubh)}(h*Allocate the sock blob for all the modulesh]h*Allocate the sock blob for all the modules}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMwhjubh)}(h3Returns 0, or -ENOMEM if memory can't be allocated.h]h5Returns 0, or -ENOMEM if memory can’t be allocated.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMyhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_sk_alloc (C function)c.security_sk_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(hCint security_sk_alloc (struct sock *sk, int family, gfp_t priority)h]j)}(hBint security_sk_alloc(struct sock *sk, int family, gfp_t priority)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_sk_alloch]j)}(hsecurity_sk_alloch]hsecurity_sk_alloc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h-(struct sock *sk, int family, gfp_t priority)h](j)}(hstruct sock *skh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_sk_allocasbuh1hhjubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hskh]hsk}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int familyh](j )}(hinth]hint}(hjbhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj^ubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubj)}(hfamilyh]hfamily}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hgfp_t priorityh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j*c.security_sk_allocasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hpriorityh]hpriority}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h)Allocate and initialize a sock's LSM blobh]h+Allocate and initialize a sock’s LSM blob}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hXB**Parameters** ``struct sock *sk`` sock ``int family`` protocol family ``gfp_t priority`` gfp flags **Description** Allocate and attach a security structure to the sk->sk_security field, which is used to copy security attributes between local stream sockets. **Return** Returns 0 on success, error on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubj )}(hhh](j)}(h``struct sock *sk`` sock h](j)}(h``struct sock *sk``h]j)}(hj1h]hstruct sock *sk}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj+ubj2)}(hhh]h)}(hsockh]hsock}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMhjGubah}(h]h ]h"]h$]h&]uh1j1hj+ubeh}(h]h ]h"]h$]h&]uh1jhjFhMhj(ubj)}(h``int family`` protocol family h](j)}(h``int family``h]j)}(hjjh]h int family}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjdubj2)}(hhh]h)}(hprotocol familyh]hprotocol family}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjdubeh}(h]h ]h"]h$]h&]uh1jhjhMhj(ubj)}(h``gfp_t priority`` gfp flags h](j)}(h``gfp_t priority``h]j)}(hjh]hgfp_t priority}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h gfp flagsh]h gfp flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj(ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubh)}(hAllocate and attach a security structure to the sk->sk_security field, which is used to copy security attributes between local stream sockets.h]hAllocate and attach a security structure to the sk->sk_security field, which is used to copy security attributes between local stream sockets.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubh)}(h'Returns 0 on success, error on failure.h]h'Returns 0 on success, error on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_sk_free (C function)c.security_sk_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h'void security_sk_free (struct sock *sk)h]j)}(h&void security_sk_free(struct sock *sk)h](j )}(hvoidh]hvoid}(hjJhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjFhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFhhhjXhMubj{)}(hsecurity_sk_freeh]j)}(hsecurity_sk_freeh]hsecurity_sk_free}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjFhhhjXhMubj)}(h(struct sock *sk)h]j)}(hstruct sock *skh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jmsbc.security_sk_freeasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hskh]hsk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjFhhhjXhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjBhhhjXhMubah}(h]j=ah ](jjeh"]h$]h&]jj)jhuh1jhjXhMhj?hhubj)}(hhh]h)}(hFree the sock's LSM blobh]hFree the sock’s LSM blob}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj?hhhjXhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj"jj"jjjuh1jhhhj%hNhNubj)}(h[**Parameters** ``struct sock *sk`` sock **Description** Deallocate security structure.h](h)}(h**Parameters**h]j)}(hj,h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj&ubj )}(hhh]j)}(h``struct sock *sk`` sock h](j)}(h``struct sock *sk``h]j)}(hjKh]hstruct sock *sk}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjEubj2)}(hhh]h)}(hsockh]hsock}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hMhjaubah}(h]h ]h"]h$]h&]uh1j1hjEubeh}(h]h ]h"]h$]h&]uh1jhj`hMhjBubah}(h]h ]h"]h$]h&]uh1j hj&ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj&ubh)}(hDeallocate security structure.h]hDeallocate security structure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_inet_csk_clone (C function)c.security_inet_csk_clonehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hQvoid security_inet_csk_clone (struct sock *newsk, const struct request_sock *req)h]j)}(hPvoid security_inet_csk_clone(struct sock *newsk, const struct request_sock *req)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_inet_csk_cloneh]j)}(hsecurity_inet_csk_cloneh]hsecurity_inet_csk_clone}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h4(struct sock *newsk, const struct request_sock *req)h](j)}(hstruct sock *newskh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsockh]hsock}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj(modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_inet_csk_cloneasbuh1hhjubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnewskh]hnewsk}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst struct request_sock *reqh](j)}(hjh]hconst}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubh)}(hhh]j)}(h request_sockh]h request_sock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jBc.security_inet_csk_cloneasbuh1hhjvubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj)}(hreqh]hreq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h,Set new sock LSM state based on request_sockh]h,Set new sock LSM state based on request_sock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj.jj.jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct sock *newsk`` new sock ``const struct request_sock *req`` connection request_sock **Description** Set that LSM state of **sock** using the LSM state from **req**.h](h)}(h**Parameters**h]j)}(hj8h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj2ubj )}(hhh](j)}(h ``struct sock *newsk`` new sock h](j)}(h``struct sock *newsk``h]j)}(hjWh]hstruct sock *newsk}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjQubj2)}(hhh]h)}(hnew sockh]hnew sock}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhMhjmubah}(h]h ]h"]h$]h&]uh1j1hjQubeh}(h]h ]h"]h$]h&]uh1jhjlhMhjNubj)}(h;``const struct request_sock *req`` connection request_sock h](j)}(h"``const struct request_sock *req``h]j)}(hjh]hconst struct request_sock *req}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hconnection request_sockh]hconnection request_sock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjNubeh}(h]h ]h"]h$]h&]uh1j hj2ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj2ubh)}(h@Set that LSM state of **sock** using the LSM state from **req**.h](hSet that LSM state of }(hjhhhNhNubj)}(h**sock**h]hsock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh using the LSM state from }(hjhhhNhNubj)}(h**req**h]hreq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_mptcp_add_subflow (C function)c.security_mptcp_add_subflowhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hBint security_mptcp_add_subflow (struct sock *sk, struct sock *ssk)h]j)}(hAint security_mptcp_add_subflow(struct sock *sk, struct sock *ssk)h](j )}(hinth]hint}(hj4hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj0hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0hhhjBhMubj{)}(hsecurity_mptcp_add_subflowh]j)}(hsecurity_mptcp_add_subflowh]hsecurity_mptcp_add_subflow}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj0hhhjBhMubj)}(h#(struct sock *sk, struct sock *ssk)h](j)}(hstruct sock *skh](j)}(hjAh]hstruct}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjmubh)}(hhh]j)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jWsbc.security_mptcp_add_subflowasbuh1hhjmubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjmubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubj)}(hskh]hsk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjiubj)}(hstruct sock *sskh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsockh]hsock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_mptcp_add_subflowasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsskh]hssk}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjiubeh}(h]h ]h"]h$]h&]jjuh1jhj0hhhjBhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj,hhhjBhMubah}(h]j'ah ](jjeh"]h$]h&]jj)jhuh1jhjBhMhj)hhubj)}(hhh]h)}(h+Inherit the LSM label from the MPTCP socketh]h+Inherit the LSM label from the MPTCP socket}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjahhubah}(h]h ]h"]h$]h&]uh1jhj)hhhjBhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj|jj|jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct sock *sk`` the owning MPTCP socket ``struct sock *ssk`` the new subflow **Description** Update the labeling for the given MPTCP subflow, to match the one of the owning MPTCP socket. This hook has to be called after the socket creation and initialization via the security_socket_create() and security_socket_post_create() LSM hooks. **Return** Returns 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h,``struct sock *sk`` the owning MPTCP socket h](j)}(h``struct sock *sk``h]j)}(hjh]hstruct sock *sk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hthe owning MPTCP socketh]hthe owning MPTCP socket}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h%``struct sock *ssk`` the new subflow h](j)}(h``struct sock *ssk``h]j)}(hjh]hstruct sock *ssk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hthe new subflowh]hthe new subflow}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hUpdate the labeling for the given MPTCP subflow, to match the one of the owning MPTCP socket. This hook has to be called after the socket creation and initialization via the security_socket_create() and security_socket_post_create() LSM hooks.h]hUpdate the labeling for the given MPTCP subflow, to match the one of the owning MPTCP socket. This hook has to be called after the socket creation and initialization via the security_socket_create() and security_socket_post_create() LSM hooks.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hj@h]hReturn}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h9Returns 0 on success or a negative error code on failure.h]h9Returns 0 on success or a negative error code on failure.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_xfrm_policy_clone (C function)c.security_xfrm_policy_clonehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h]int security_xfrm_policy_clone (struct xfrm_sec_ctx *old_ctx, struct xfrm_sec_ctx **new_ctxp)h]j)}(h\int security_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx, struct xfrm_sec_ctx **new_ctxp)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMVubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMVubj{)}(hsecurity_xfrm_policy_cloneh]j)}(hsecurity_xfrm_policy_cloneh]hsecurity_xfrm_policy_clone}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMVubj)}(h>(struct xfrm_sec_ctx *old_ctx, struct xfrm_sec_ctx **new_ctxp)h](j)}(hstruct xfrm_sec_ctx *old_ctxh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h xfrm_sec_ctxh]h xfrm_sec_ctx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_xfrm_policy_cloneasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hold_ctxh]hold_ctx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct xfrm_sec_ctx **new_ctxph](j)}(hjAh]hstruct}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0ubh)}(hhh]j)}(h xfrm_sec_ctxh]h xfrm_sec_ctx}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjTmodnameN classnameNj] j` )}jc ]jc.security_xfrm_policy_cloneasbuh1hhj0ubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0ubj)}(hjh]h*}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hnew_ctxph]hnew_ctxp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMVubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj}hhhjhMVubah}(h]jxah ](jjeh"]h$]h&]jj)jhuh1jhjhMVhjzhhubj)}(hhh]h)}(hClone xfrm policy LSM stateh]hClone xfrm policy LSM state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMVhjhhubah}(h]h ]h"]h$]h&]uh1jhjzhhhjhMVubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX4**Parameters** ``struct xfrm_sec_ctx *old_ctx`` xfrm security context ``struct xfrm_sec_ctx **new_ctxp`` target xfrm security context **Description** Allocate a security structure in new_ctxp that contains the information from the old_ctx structure. **Return** Return 0 if operation was successful.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMZhjubj )}(hhh](j)}(h7``struct xfrm_sec_ctx *old_ctx`` xfrm security context h](j)}(h ``struct xfrm_sec_ctx *old_ctx``h]j)}(hjh]hstruct xfrm_sec_ctx *old_ctx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMWhjubj2)}(hhh]h)}(hxfrm security contexth]hxfrm security context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMWhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMWhjubj)}(h@``struct xfrm_sec_ctx **new_ctxp`` target xfrm security context h](j)}(h"``struct xfrm_sec_ctx **new_ctxp``h]j)}(hj<h]hstruct xfrm_sec_ctx **new_ctxp}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMXhj6ubj2)}(hhh]h)}(htarget xfrm security contexth]htarget xfrm security context}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMXhjRubah}(h]h ]h"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhMXhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjwh]h Description}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMZhjubh)}(hcAllocate a security structure in new_ctxp that contains the information from the old_ctx structure.h]hcAllocate a security structure in new_ctxp that contains the information from the old_ctx structure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMYhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM\hjubh)}(h%Return 0 if operation was successful.h]h%Return 0 if operation was successful.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM]hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_xfrm_policy_delete (C function)c.security_xfrm_policy_deletehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h:int security_xfrm_policy_delete (struct xfrm_sec_ctx *ctx)h]j)}(h9int security_xfrm_policy_delete(struct xfrm_sec_ctx *ctx)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMrubj{)}(hsecurity_xfrm_policy_deleteh]j)}(hsecurity_xfrm_policy_deleteh]hsecurity_xfrm_policy_delete}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMrubj)}(h(struct xfrm_sec_ctx *ctx)h]j)}(hstruct xfrm_sec_ctx *ctxh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h xfrm_sec_ctxh]h xfrm_sec_ctx}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj@modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_xfrm_policy_deleteasbuh1hhjubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hctxh]hctx}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMrubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMrubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMrhjhhubj)}(hhh]h)}(h*Check if deleting a xfrm policy is allowedh]h*Check if deleting a xfrm policy is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMrhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMrubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct xfrm_sec_ctx *ctx`` xfrm security context **Description** Authorize deletion of a SPD entry. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMvhjubj )}(hhh]j)}(h3``struct xfrm_sec_ctx *ctx`` xfrm security context h](j)}(h``struct xfrm_sec_ctx *ctx``h]j)}(hjh]hstruct xfrm_sec_ctx *ctx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMshjubj2)}(hhh]h)}(hxfrm security contexth]hxfrm security context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMshjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMshjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMuhjubh)}(h"Authorize deletion of a SPD entry.h]h"Authorize deletion of a SPD entry.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMthjubh)}(h **Return**h]j)}(hjFh]hReturn}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMvhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMwhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j .security_xfrm_state_alloc_acquire (C function)#c.security_xfrm_state_alloc_acquirehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hdint security_xfrm_state_alloc_acquire (struct xfrm_state *x, struct xfrm_sec_ctx *polsec, u32 secid)h]j)}(hcint security_xfrm_state_alloc_acquire(struct xfrm_state *x, struct xfrm_sec_ctx *polsec, u32 secid)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(h!security_xfrm_state_alloc_acquireh]j)}(h!security_xfrm_state_alloc_acquireh]h!security_xfrm_state_alloc_acquire}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h>(struct xfrm_state *x, struct xfrm_sec_ctx *polsec, u32 secid)h](j)}(hstruct xfrm_state *xh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h xfrm_stateh]h xfrm_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb#c.security_xfrm_state_alloc_acquireasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj9h]hx}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct xfrm_sec_ctx *polsech](j)}(hjAh]hstruct}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubh)}(hhh]j)}(h xfrm_sec_ctxh]h xfrm_sec_ctx}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjYmodnameN classnameNj] j` )}jc ]j#c.security_xfrm_state_alloc_acquireasbuh1hhj5ubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hpolsech]hpolsec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h u32 secidh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j#c.security_xfrm_state_alloc_acquireasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsecidh]hsecid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hAllocate a xfrm state LSM blobh]hAllocate a xfrm state LSM blob}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct xfrm_state *x`` xfrm state being added to the SAD ``struct xfrm_sec_ctx *polsec`` associated policy's security context ``u32 secid`` secid from the flow **Description** Allocate a security structure to the x->security field; the security field is initialized to NULL when the xfrm_state is allocated. Set the context to correspond to secid. **Return** Returns 0 if operation was successful.h](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h;``struct xfrm_state *x`` xfrm state being added to the SAD h](j)}(h``struct xfrm_state *x``h]j)}(hjCh]hstruct xfrm_state *x}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj=ubj2)}(hhh]h)}(h!xfrm state being added to the SADh]h!xfrm state being added to the SAD}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMhjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhMhj:ubj)}(hE``struct xfrm_sec_ctx *polsec`` associated policy's security context h](j)}(h``struct xfrm_sec_ctx *polsec``h]j)}(hj|h]hstruct xfrm_sec_ctx *polsec}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjvubj2)}(hhh]h)}(h$associated policy's security contexth]h&associated policy’s security context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhMhj:ubj)}(h"``u32 secid`` secid from the flow h](j)}(h ``u32 secid``h]j)}(hjh]h u32 secid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hsecid from the flowh]hsecid from the flow}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj:ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hAllocate a security structure to the x->security field; the security field is initialized to NULL when the xfrm_state is allocated. Set the context to correspond to secid.h]hAllocate a security structure to the x->security field; the security field is initialized to NULL when the xfrm_state is allocated. Set the context to correspond to secid.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h&Returns 0 if operation was successful.h]h&Returns 0 if operation was successful.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_xfrm_state_free (C function)c.security_xfrm_state_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h4void security_xfrm_state_free (struct xfrm_state *x)h]j)}(h3void security_xfrm_state_free(struct xfrm_state *x)h](j )}(hvoidh]hvoid}(hj\hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjXhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjkhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXhhhjjhMubj{)}(hsecurity_xfrm_state_freeh]j)}(hsecurity_xfrm_state_freeh]hsecurity_xfrm_state_free}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjXhhhjjhMubj)}(h(struct xfrm_state *x)h]j)}(hstruct xfrm_state *xh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h xfrm_stateh]h xfrm_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_xfrm_state_freeasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj9h]hx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjXhhhjjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjThhhjjhMubah}(h]jOah ](jjeh"]h$]h&]jj)jhuh1jhjjhMhjQhhubj)}(hhh]h)}(hFree a xfrm stateh]hFree a xfrm state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjQhhhjjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj3jj3jjjuh1jhhhj%hNhNubj)}(h_**Parameters** ``struct xfrm_state *x`` xfrm state **Description** Deallocate x->security.h](h)}(h**Parameters**h]j)}(hj=h]h Parameters}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj7ubj )}(hhh]j)}(h$``struct xfrm_state *x`` xfrm state h](j)}(h``struct xfrm_state *x``h]j)}(hj\h]hstruct xfrm_state *x}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjVubj2)}(hhh]h)}(h xfrm stateh]h xfrm state}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhMhjrubah}(h]h ]h"]h$]h&]uh1j1hjVubeh}(h]h ]h"]h$]h&]uh1jhjqhMhjSubah}(h]h ]h"]h$]h&]uh1j hj7ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj7ubh)}(hDeallocate x->security.h]hDeallocate x->security.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (security_xfrm_policy_lookup (C function)c.security_xfrm_policy_lookuphNtauh1hhj%hhhNhNubj)}(hhh](j)}(hHint security_xfrm_policy_lookup (struct xfrm_sec_ctx *ctx, u32 fl_secid)h]j)}(hGint security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_xfrm_policy_lookuph]j)}(hsecurity_xfrm_policy_lookuph]hsecurity_xfrm_policy_lookup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h((struct xfrm_sec_ctx *ctx, u32 fl_secid)h](j)}(hstruct xfrm_sec_ctx *ctxh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h xfrm_sec_ctxh]h xfrm_sec_ctx}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj9modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_xfrm_policy_lookupasbuh1hhjubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hctxh]hctx}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h u32 fl_secidh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jSc.security_xfrm_policy_lookupasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hfl_secidh]hfl_secid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h'Check if using a xfrm policy is allowedh]h'Check if using a xfrm policy is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct xfrm_sec_ctx *ctx`` target xfrm security context ``u32 fl_secid`` flow secid used to authorize access **Description** Check permission when a flow selects a xfrm_policy for processing XFRMs on a packet. The hook is called when selecting either a per-socket policy or a generic xfrm policy. **Return** Return 0 if permission is granted, -ESRCH otherwise, or -errno on other errors.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h:``struct xfrm_sec_ctx *ctx`` target xfrm security context h](j)}(h``struct xfrm_sec_ctx *ctx``h]j)}(hj%h]hstruct xfrm_sec_ctx *ctx}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(htarget xfrm security contexth]htarget xfrm security context}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hMhj;ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj:hMhjubj)}(h5``u32 fl_secid`` flow secid used to authorize access h](j)}(h``u32 fl_secid``h]j)}(hj^h]h u32 fl_secid}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjXubj2)}(hhh]h)}(h#flow secid used to authorize accessh]h#flow secid used to authorize access}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshMhjtubah}(h]h ]h"]h$]h&]uh1j1hjXubeh}(h]h ]h"]h$]h&]uh1jhjshMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hCheck permission when a flow selects a xfrm_policy for processing XFRMs on a packet. The hook is called when selecting either a per-socket policy or a generic xfrm policy.h]hCheck permission when a flow selects a xfrm_policy for processing XFRMs on a packet. The hook is called when selecting either a per-socket policy or a generic xfrm policy.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hOReturn 0 if permission is granted, -ESRCH otherwise, or -errno on other errors.h]hOReturn 0 if permission is granted, -ESRCH otherwise, or -errno on other errors.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j /security_xfrm_state_pol_flow_match (C function)$c.security_xfrm_state_pol_flow_matchhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hvint security_xfrm_state_pol_flow_match (struct xfrm_state *x, struct xfrm_policy *xp, const struct flowi_common *flic)h]j)}(huint security_xfrm_state_pol_flow_match(struct xfrm_state *x, struct xfrm_policy *xp, const struct flowi_common *flic)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(h"security_xfrm_state_pol_flow_matchh]j)}(h"security_xfrm_state_pol_flow_matchh]h"security_xfrm_state_pol_flow_match}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hO(struct xfrm_state *x, struct xfrm_policy *xp, const struct flowi_common *flic)h](j)}(hstruct xfrm_state *xh](j)}(hjAh]hstruct}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hjOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubh)}(hhh]j)}(h xfrm_stateh]h xfrm_state}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjbmodnameN classnameNj] j` )}jc ]jf )}jY j(sb$c.security_xfrm_state_pol_flow_matchasbuh1hhj>ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hj9h]hx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hstruct xfrm_policy *xph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h xfrm_policyh]h xfrm_policy}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j|$c.security_xfrm_state_pol_flow_matchasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hxph]hxp}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hconst struct flowi_common *flich](j)}(hjh]hconst}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h flowi_commonh]h flowi_common}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj^modnameN classnameNj] j` )}jc ]j|$c.security_xfrm_state_pol_flow_matchasbuh1hhjubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hflich]hflic}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hCheck for a xfrm matchh]hCheck for a xfrm match}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX/**Parameters** ``struct xfrm_state *x`` xfrm state to match ``struct xfrm_policy *xp`` xfrm policy to check for a match ``const struct flowi_common *flic`` flow to check for a match. **Description** Check **xp** and **flic** for a match with **x**. **Return** Returns 1 if there is a match.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h-``struct xfrm_state *x`` xfrm state to match h](j)}(h``struct xfrm_state *x``h]j)}(hjh]hstruct xfrm_state *x}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hxfrm state to matchh]hxfrm state to match}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h<``struct xfrm_policy *xp`` xfrm policy to check for a match h](j)}(h``struct xfrm_policy *xp``h]j)}(hj9h]hstruct xfrm_policy *xp}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj3ubj2)}(hhh]h)}(h xfrm policy to check for a matchh]h xfrm policy to check for a match}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMhjOubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhjNhMhjubj)}(h?``const struct flowi_common *flic`` flow to check for a match. h](j)}(h#``const struct flowi_common *flic``h]j)}(hjrh]hconst struct flowi_common *flic}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjlubj2)}(hhh]h)}(hflow to check for a match.h]hflow to check for a match.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjlubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h1Check **xp** and **flic** for a match with **x**.h](hCheck }(hjhhhNhNubj)}(h**xp**h]hxp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**flic**h]hflic}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh for a match with }(hjhhhNhNubj)}(h**x**h]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hReturns 1 if there is a match.h]hReturns 1 if there is a match.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )security_xfrm_decode_session (C function)c.security_xfrm_decode_sessionhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hBint security_xfrm_decode_session (struct sk_buff *skb, u32 *secid)h]j)}(hAint security_xfrm_decode_session(struct sk_buff *skb, u32 *secid)h](j )}(hinth]hint}(hjOhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjKhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKhhhj]hMubj{)}(hsecurity_xfrm_decode_sessionh]j)}(hsecurity_xfrm_decode_sessionh]hsecurity_xfrm_decode_session}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjKhhhj]hMubj)}(h!(struct sk_buff *skb, u32 *secid)h](j)}(hstruct sk_buff *skbh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hsk_buffh]hsk_buff}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jrsbc.security_xfrm_decode_sessionasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hskbh]hskb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h u32 *secidh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_xfrm_decode_sessionasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsecidh]hsecid}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjKhhhj]hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjGhhhj]hMubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jhj]hMhjDhhubj)}(hhh]h)}(h%Determine the xfrm secid for a packeth]h%Determine the xfrm secid for a packet}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjahhubah}(h]h ]h"]h$]h&]uh1jhjDhhhj]hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj|jj|jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct sk_buff *skb`` xfrm packet ``u32 *secid`` secid **Description** Decode the packet in **skb** and return the security label in **secid**. **Return** Return 0 if all xfrms used have the same secid.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h$``struct sk_buff *skb`` xfrm packet h](j)}(h``struct sk_buff *skb``h]j)}(hjh]hstruct sk_buff *skb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h xfrm packeth]h xfrm packet}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``u32 *secid`` secid h](j)}(h``u32 *secid``h]j)}(hjh]h u32 *secid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hsecidh]hsecid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hHDecode the packet in **skb** and return the security label in **secid**.h](hDecode the packet in }(hj/hhhNhNubj)}(h**skb**h]hskb}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh" and return the security label in }(hj/hhhNhNubj)}(h **secid**h]hsecid}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh.}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjdh]hReturn}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h/Return 0 if all xfrms used have the same secid.h]h/Return 0 if all xfrms used have the same secid.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_key_alloc (C function)c.security_key_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(hVint security_key_alloc (struct key *key, const struct cred *cred, unsigned long flags)h]j)}(hUint security_key_alloc(struct key *key, const struct cred *cred, unsigned long flags)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_key_alloch]j)}(hsecurity_key_alloch]hsecurity_key_alloc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h?(struct key *key, const struct cred *cred, unsigned long flags)h](j)}(hstruct key *keyh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hkeyh]hkey}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_key_allocasbuh1hhjubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hkeyh]hkey}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst struct cred *credh](j)}(hjh]hconst}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hjAh]hstruct}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubh)}(hhh]j)}(hcredh]hcred}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.security_key_allocasbuh1hhjTubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hcredh]hcred}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long flagsh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h-Allocate and initialize a kernel key LSM blobh]h-Allocate and initialize a kernel key LSM blob}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjBhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj]jj]jjjuh1jhhhj%hNhNubj)}(hXP**Parameters** ``struct key *key`` key ``const struct cred *cred`` credentials ``unsigned long flags`` allocation flags **Description** Permit allocation of a key and assign security data. Note that key does not have a serial number assigned at this point. **Return** Return 0 if permission is granted, -ve error otherwise.h](h)}(h**Parameters**h]j)}(hjgh]h Parameters}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjaubj )}(hhh](j)}(h``struct key *key`` key h](j)}(h``struct key *key``h]j)}(hjh]hstruct key *key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hkeyh]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj}ubj)}(h(``const struct cred *cred`` credentials h](j)}(h``const struct cred *cred``h]j)}(hjh]hconst struct cred *cred}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(h credentialsh]h credentials}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hj}ubj)}(h)``unsigned long flags`` allocation flags h](j)}(h``unsigned long flags``h]j)}(hjh]hunsigned long flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(hallocation flagsh]hallocation flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hM hj}ubeh}(h]h ]h"]h$]h&]uh1j hjaubh)}(h**Description**h]j)}(hj3h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjaubh)}(hxPermit allocation of a key and assign security data. Note that key does not have a serial number assigned at this point.h]hxPermit allocation of a key and assign security data. Note that key does not have a serial number assigned at this point.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjaubh)}(h **Return**h]j)}(hjZh]hReturn}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjaubh)}(h7Return 0 if permission is granted, -ve error otherwise.h]h7Return 0 if permission is granted, -ve error otherwise.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_key_free (C function)c.security_key_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h(void security_key_free (struct key *key)h]j)}(h'void security_key_free(struct key *key)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_key_freeh]j)}(hsecurity_key_freeh]hsecurity_key_free}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct key *key)h]j)}(hstruct key *keyh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hkeyh]hkey}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_key_freeasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hkeyh]hkey}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hFree a kernel key LSM blobh]hFree a kernel key LSM blob}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj\hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjwjjwjjjuh1jhhhj%hNhNubj)}(hl**Parameters** ``struct key *key`` key **Description** Notification of destruction; free security data.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM#hj{ubj )}(hhh]j)}(h``struct key *key`` key h](j)}(h``struct key *key``h]j)}(hjh]hstruct key *key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(hkeyh]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1j hj{ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM"hj{ubh)}(h0Notification of destruction; free security data.h]h0Notification of destruction; free security data.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM!hj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_key_permission (C function)c.security_key_permissionhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hfint security_key_permission (key_ref_t key_ref, const struct cred *cred, enum key_need_perm need_perm)h]j)}(heint security_key_permission(key_ref_t key_ref, const struct cred *cred, enum key_need_perm need_perm)h](j )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM+ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj.hM+ubj{)}(hsecurity_key_permissionh]j)}(hsecurity_key_permissionh]hsecurity_key_permission}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj.hM+ubj)}(hJ(key_ref_t key_ref, const struct cred *cred, enum key_need_perm need_perm)h](j)}(hkey_ref_t key_refh](h)}(hhh]j)}(h key_ref_th]h key_ref_t}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjbmodnameN classnameNj] j` )}jc ]jf )}jY jCsbc.security_key_permissionasbuh1hhjYubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj)}(hkey_refh]hkey_ref}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubj)}(hconst struct cred *credh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hcredh]hcred}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j|c.security_key_permissionasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcredh]hcred}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubj)}(henum key_need_perm need_permh](j)}(hj:h]henum}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubh)}(hhh]j)}(h key_need_permh]h key_need_perm}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjRmodnameN classnameNj] j` )}jc ]j|c.security_key_permissionasbuh1hhj.ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(h need_permh]h need_perm}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj.hM+ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj.hM+ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj.hM+hjhhubj)}(hhh]h)}(h*Check if a kernel key operation is allowedh]h*Check if a kernel key operation is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM+hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj.hM+ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hXW**Parameters** ``key_ref_t key_ref`` key reference ``const struct cred *cred`` credentials of actor requesting access ``enum key_need_perm need_perm`` requested permissions **Description** See whether a specific operational right is granted to a process on a key. **Return** Return 0 if permission is granted, -ve error otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM/hjubj )}(hhh](j)}(h$``key_ref_t key_ref`` key reference h](j)}(h``key_ref_t key_ref``h]j)}(hjh]hkey_ref_t key_ref}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM,hjubj2)}(hhh]h)}(h key referenceh]h key reference}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM,hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM,hjubj)}(hC``const struct cred *cred`` credentials of actor requesting access h](j)}(h``const struct cred *cred``h]j)}(hj h]hconst struct cred *cred}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM-hjubj2)}(hhh]h)}(h&credentials of actor requesting accessh]h&credentials of actor requesting access}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hM-hj6ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj5hM-hjubj)}(h7``enum key_need_perm need_perm`` requested permissions h](j)}(h ``enum key_need_perm need_perm``h]j)}(hjYh]henum key_need_perm need_perm}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM.hjSubj2)}(hhh]h)}(hrequested permissionsh]hrequested permissions}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhM.hjoubah}(h]h ]h"]h$]h&]uh1j1hjSubeh}(h]h ]h"]h$]h&]uh1jhjnhM.hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM0hjubh)}(hJSee whether a specific operational right is granted to a process on a key.h]hJSee whether a specific operational right is granted to a process on a key.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM/hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM1hjubh)}(h7Return 0 if permission is granted, -ve error otherwise.h]h7Return 0 if permission is granted, -ve error otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM2hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_key_getsecurity (C function)c.security_key_getsecurityhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h=int security_key_getsecurity (struct key *key, char **buffer)h]j)}(hah"]h$]h&]uh1j1hjhhhjhM;ubj{)}(hsecurity_key_getsecurityh]j)}(hsecurity_key_getsecurityh]hsecurity_key_getsecurity}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM;ubj)}(h (struct key *key, char **buffer)h](j)}(hstruct key *keyh](j)}(hjAh]hstruct}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubh)}(hhh]j)}(hkeyh]hkey}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj]modnameN classnameNj] j` )}jc ]jf )}jY j#sbc.security_key_getsecurityasbuh1hhj9ubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hkeyh]hkey}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubj)}(h char **bufferh](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufferh]hbuffer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM;ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM;ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM;hjhhubj)}(hhh]h)}(hGet the key's security labelh]hGet the key’s security label}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM;hj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM;ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj'jj'jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct key *key`` key ``char **buffer`` security label buffer **Description** Get a textual representation of the security context attached to a key for the purposes of honouring KEYCTL_GETSECURITY. This function allocates the storage for the NUL-terminated string and the caller should free it. **Return** Returns the length of **buffer** (including terminating NUL) or -ve if an error occurs. May also return 0 (and a NULL buffer pointer) if there is no security label assigned to the key.h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM?hj+ubj )}(hhh](j)}(h``struct key *key`` key h](j)}(h``struct key *key``h]j)}(hjPh]hstruct key *key}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM<hjJubj2)}(hhh]h)}(hkeyh]hkey}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehM<hjfubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjehM<hjGubj)}(h(``char **buffer`` security label buffer h](j)}(h``char **buffer``h]j)}(hjh]h char **buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM=hjubj2)}(hhh]h)}(hsecurity label bufferh]hsecurity label buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM=hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM=hjGubeh}(h]h ]h"]h$]h&]uh1j hj+ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM?hj+ubh)}(hGet a textual representation of the security context attached to a key for the purposes of honouring KEYCTL_GETSECURITY. This function allocates the storage for the NUL-terminated string and the caller should free it.h]hGet a textual representation of the security context attached to a key for the purposes of honouring KEYCTL_GETSECURITY. This function allocates the storage for the NUL-terminated string and the caller should free it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM>hj+ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMBhj+ubh)}(hReturns the length of **buffer** (including terminating NUL) or -ve if an error occurs. May also return 0 (and a NULL buffer pointer) if there is no security label assigned to the key.h](hReturns the length of }(hjhhhNhNubj)}(h **buffer**h]hbuffer}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh (including terminating NUL) or -ve if an error occurs. May also return 0 (and a NULL buffer pointer) if there is no security label assigned to the key.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMChj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j /security_key_post_create_or_update (C function)$c.security_key_post_create_or_updatehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hvoid security_key_post_create_or_update (struct key *keyring, struct key *key, const void *payload, size_t payload_len, unsigned long flags, bool create)h]j)}(hvoid security_key_post_create_or_update(struct key *keyring, struct key *key, const void *payload, size_t payload_len, unsigned long flags, bool create)h](j )}(hvoidh]hvoid}(hjBhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMNubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>hhhjPhMNubj{)}(h"security_key_post_create_or_updateh]j)}(h"security_key_post_create_or_updateh]h"security_key_post_create_or_update}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj>hhhjPhMNubj)}(hq(struct key *keyring, struct key *key, const void *payload, size_t payload_len, unsigned long flags, bool create)h](j)}(hstruct key *keyringh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubh)}(hhh]j)}(hkeyh]hkey}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jesb$c.security_key_post_create_or_updateasbuh1hhj{ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(hkeyringh]hkeyring}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwubj)}(hstruct key *keyh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hkeyh]hkey}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j$c.security_key_post_create_or_updateasbuh1hhjubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hkeyh]hkey}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwubj)}(hconst void *payloadh](j)}(hjh]hconst}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj )}(hvoidh]hvoid}(hj|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hpayloadh]hpayload}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwubj)}(hsize_t payload_lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j$c.security_key_post_create_or_updateasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h payload_lenh]h payload_len}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwubj)}(hunsigned long flagsh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hj"hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hflagsh]hflags}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwubj)}(h bool createh](j )}(hj8h]hbool}(hjWhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjSubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hcreateh]hcreate}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwubeh}(h]h ]h"]h$]h&]jjuh1jhj>hhhjPhMNubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj:hhhjPhMNubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1jhjPhMNhj7hhubj)}(hhh]h)}(h$Notification of key create or updateh]h$Notification of key create or update}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMNhjhhubah}(h]h ]h"]h$]h&]uh1jhj7hhhjPhMNubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct key *keyring`` keyring to which the key is linked to ``struct key *key`` created or updated key ``const void *payload`` data used to instantiate or update the key ``size_t payload_len`` length of payload ``unsigned long flags`` key flags ``bool create`` flag indicating whether the key was created or updated **Description** Notify the caller of a key creation or update.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMRhjubj )}(hhh](j)}(h>``struct key *keyring`` keyring to which the key is linked to h](j)}(h``struct key *keyring``h]j)}(hjh]hstruct key *keyring}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMOhjubj2)}(hhh]h)}(h%keyring to which the key is linked toh]h%keyring to which the key is linked to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMOhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMOhjubj)}(h+``struct key *key`` created or updated key h](j)}(h``struct key *key``h]j)}(hjh]hstruct key *key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMPhjubj2)}(hhh]h)}(hcreated or updated keyh]hcreated or updated key}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMPhj,ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj+hMPhjubj)}(hC``const void *payload`` data used to instantiate or update the key h](j)}(h``const void *payload``h]j)}(hjOh]hconst void *payload}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMQhjIubj2)}(hhh]h)}(h*data used to instantiate or update the keyh]h*data used to instantiate or update the key}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhMQhjeubah}(h]h ]h"]h$]h&]uh1j1hjIubeh}(h]h ]h"]h$]h&]uh1jhjdhMQhjubj)}(h)``size_t payload_len`` length of payload h](j)}(h``size_t payload_len``h]j)}(hjh]hsize_t payload_len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMRhjubj2)}(hhh]h)}(hlength of payloadh]hlength of payload}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMRhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMRhjubj)}(h"``unsigned long flags`` key flags h](j)}(h``unsigned long flags``h]j)}(hjh]hunsigned long flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMShjubj2)}(hhh]h)}(h key flagsh]h key flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMShjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMShjubj)}(hG``bool create`` flag indicating whether the key was created or updated h](j)}(h``bool create``h]j)}(hjh]h bool create}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMThjubj2)}(hhh]h)}(h6flag indicating whether the key was created or updatedh]h6flag indicating whether the key was created or updated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMThjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMThjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj5h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMVhjubh)}(h.Notify the caller of a key creation or update.h]h.Notify the caller of a key creation or update.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMUhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_audit_rule_init (C function)c.security_audit_rule_inithNtauh1hhj%hhhNhNubj)}(hhh](j)}(hZint security_audit_rule_init (u32 field, u32 op, char *rulestr, void **lsmrule, gfp_t gfp)h]j)}(hYint security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule, gfp_t gfp)h](j )}(hinth]hint}(hjzhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjvhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMcubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvhhhjhMcubj{)}(hsecurity_audit_rule_inith]j)}(hsecurity_audit_rule_inith]hsecurity_audit_rule_init}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjvhhhjhMcubj)}(h=(u32 field, u32 op, char *rulestr, void **lsmrule, gfp_t gfp)h](j)}(h u32 fieldh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_audit_rule_initasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hfieldh]hfield}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hu32 oph](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_audit_rule_initasbuh1hhjubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hoph]hop}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h char *rulestrh](j )}(hcharh]hchar}(hjIhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjEubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hrulestrh]hrulestr}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvoid **lsmruleh](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlsmruleh]hlsmrule}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_audit_rule_initasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hgfph]hgfp}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjvhhhjhMcubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjrhhhjhMcubah}(h]jmah ](jjeh"]h$]h&]jj)jhuh1jhjhMchjohhubj)}(hhh]h)}(h*Allocate and init an LSM audit rule structh]h*Allocate and init an LSM audit rule struct}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMchj0hhubah}(h]h ]h"]h$]h&]uh1jhjohhhjhMcubeh}(h]h ](jfunctioneh"]h$]h&]jjjjKjjKjjjuh1jhhhj%hNhNubj)}(hX{**Parameters** ``u32 field`` audit action ``u32 op`` rule operator ``char *rulestr`` rule context ``void **lsmrule`` receive buffer for audit rule struct ``gfp_t gfp`` GFP flag used for kmalloc **Description** Allocate and initialize an LSM audit rule structure. **Return** Return 0 if **lsmrule** has been successfully set, -EINVAL in case of an invalid rule.h](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMghjOubj )}(hhh](j)}(h``u32 field`` audit action h](j)}(h ``u32 field``h]j)}(hjth]h u32 field}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMdhjnubj2)}(hhh]h)}(h audit actionh]h audit action}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMdhjubah}(h]h ]h"]h$]h&]uh1j1hjnubeh}(h]h ]h"]h$]h&]uh1jhjhMdhjkubj)}(h``u32 op`` rule operator h](j)}(h ``u32 op``h]j)}(hjh]hu32 op}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMehjubj2)}(hhh]h)}(h rule operatorh]h rule operator}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMehjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMehjkubj)}(h``char *rulestr`` rule context h](j)}(h``char *rulestr``h]j)}(hjh]h char *rulestr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMfhjubj2)}(hhh]h)}(h rule contexth]h rule context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMfhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMfhjkubj)}(h8``void **lsmrule`` receive buffer for audit rule struct h](j)}(h``void **lsmrule``h]j)}(hjh]hvoid **lsmrule}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMghjubj2)}(hhh]h)}(h$receive buffer for audit rule structh]h$receive buffer for audit rule struct}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hMghj5ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj4hMghjkubj)}(h(``gfp_t gfp`` GFP flag used for kmalloc h](j)}(h ``gfp_t gfp``h]j)}(hjXh]h gfp_t gfp}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhhjRubj2)}(hhh]h)}(hGFP flag used for kmalloch]hGFP flag used for kmalloc}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhMhhjnubah}(h]h ]h"]h$]h&]uh1j1hjRubeh}(h]h ]h"]h$]h&]uh1jhjmhMhhjkubeh}(h]h ]h"]h$]h&]uh1j hjOubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMjhjOubh)}(h4Allocate and initialize an LSM audit rule structure.h]h4Allocate and initialize an LSM audit rule structure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMihjOubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMkhjOubh)}(hVReturn 0 if **lsmrule** has been successfully set, -EINVAL in case of an invalid rule.h](h Return 0 if }(hjhhhNhNubj)}(h **lsmrule**h]hlsmrule}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh? has been successfully set, -EINVAL in case of an invalid rule.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMlhjOubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_audit_rule_known (C function)c.security_audit_rule_knownhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h9int security_audit_rule_known (struct audit_krule *krule)h]j)}(h8int security_audit_rule_known(struct audit_krule *krule)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMvubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhMvubj{)}(hsecurity_audit_rule_knownh]j)}(hsecurity_audit_rule_knownh]hsecurity_audit_rule_known}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhMvubj)}(h(struct audit_krule *krule)h]j)}(hstruct audit_krule *kruleh](j)}(hjAh]hstruct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubh)}(hhh]j)}(h audit_kruleh]h audit_krule}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjnmodnameN classnameNj] j` )}jc ]jf )}jY j4sbc.security_audit_rule_knownasbuh1hhjJubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj)}(hkruleh]hkrule}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjFubah}(h]h ]h"]h$]h&]jjuh1jhj hhhjhMvubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhjhMvubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMvhjhhubj)}(hhh]h)}(h*Check if an audit rule contains LSM fieldsh]h*Check if an audit rule contains LSM fields}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMvhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMvubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct audit_krule *krule`` audit rule **Description** Specifies whether given **krule** contains any fields related to the current LSM. **Return** Returns 1 in case of relation found, 0 otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMzhjubj )}(hhh]j)}(h)``struct audit_krule *krule`` audit rule h](j)}(h``struct audit_krule *krule``h]j)}(hjh]hstruct audit_krule *krule}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMwhj ubj2)}(hhh]h)}(h audit ruleh]h audit rule}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hMwhj(ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj'hMwhj ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjMh]h Description}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMyhjubh)}(hQSpecifies whether given **krule** contains any fields related to the current LSM.h](hSpecifies whether given }(hjchhhNhNubj)}(h **krule**h]hkrule}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubh0 contains any fields related to the current LSM.}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMxhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM{hjubh)}(h1Returns 1 in case of relation found, 0 otherwise.h]h1Returns 1 in case of relation found, 0 otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM|hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_audit_rule_free (C function)c.security_audit_rule_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h-void security_audit_rule_free (void *lsmrule)h]j)}(h,void security_audit_rule_free(void *lsmrule)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_audit_rule_freeh]j)}(hsecurity_audit_rule_freeh]hsecurity_audit_rule_free}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(void *lsmrule)h]j)}(h void *lsmruleh](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlsmruleh]hlsmrule}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hFree an LSM audit rule structh]hFree an LSM audit rule struct}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjXhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjsjjsjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``void *lsmrule`` audit rule struct **Description** Deallocate the LSM audit rule structure previously allocated by audit_rule_init().h](h)}(h**Parameters**h]j)}(hj}h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjwubj )}(hhh]j)}(h$``void *lsmrule`` audit rule struct h](j)}(h``void *lsmrule``h]j)}(hjh]h void *lsmrule}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(haudit rule structh]haudit rule struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjwubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjwubh)}(hRDeallocate the LSM audit rule structure previously allocated by audit_rule_init().h]hRDeallocate the LSM audit rule structure previously allocated by audit_rule_init().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjwubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_audit_rule_match (C function)c.security_audit_rule_matchhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hWint security_audit_rule_match (struct lsm_prop *prop, u32 field, u32 op, void *lsmrule)h]j)}(hVint security_audit_rule_match(struct lsm_prop *prop, u32 field, u32 op, void *lsmrule)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj*hMubj{)}(hsecurity_audit_rule_matchh]j)}(hsecurity_audit_rule_matchh]hsecurity_audit_rule_match}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj*hMubj)}(h9(struct lsm_prop *prop, u32 field, u32 op, void *lsmrule)h](j)}(hstruct lsm_prop *proph](j)}(hjAh]hstruct}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubh)}(hhh]j)}(hlsm_proph]hlsm_prop}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjymodnameN classnameNj] j` )}jc ]jf )}jY j?sbc.security_audit_rule_matchasbuh1hhjUubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(hproph]hprop}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubj)}(h u32 fieldh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_audit_rule_matchasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hfieldh]hfield}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubj)}(hu32 oph](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_audit_rule_matchasbuh1hhjubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hoph]hop}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubj)}(h void *lsmruleh](j )}(hvoidh]hvoid}(hj[hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjh]h*}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hlsmruleh]hlsmrule}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj*hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj*hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj*hMhjhhubj)}(hhh]h)}(h&Check if a label matches an audit ruleh]h&Check if a label matches an audit rule}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj*hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hXd**Parameters** ``struct lsm_prop *prop`` security label ``u32 field`` LSM audit field ``u32 op`` matching operator ``void *lsmrule`` audit rule **Description** Determine if given **secid** matches a rule previously approved by security_audit_rule_known(). **Return** Returns 1 if secid matches the rule, 0 if it does not, -ERRNO on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h)``struct lsm_prop *prop`` security label h](j)}(h``struct lsm_prop *prop``h]j)}(hjh]hstruct lsm_prop *prop}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hsecurity labelh]hsecurity label}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``u32 field`` LSM audit field h](j)}(h ``u32 field``h]j)}(hj(h]h u32 field}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj"ubj2)}(hhh]h)}(hLSM audit fieldh]hLSM audit field}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj>ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hMhjubj)}(h``u32 op`` matching operator h](j)}(h ``u32 op``h]j)}(hjah]hu32 op}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj[ubj2)}(hhh]h)}(hmatching operatorh]hmatching operator}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhMhjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjubj)}(h``void *lsmrule`` audit rule h](j)}(h``void *lsmrule``h]j)}(hjh]h void *lsmrule}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h audit ruleh]h audit rule}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h_Determine if given **secid** matches a rule previously approved by security_audit_rule_known().h](hDetermine if given }(hjhhhNhNubj)}(h **secid**h]hsecid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhC matches a rule previously approved by security_audit_rule_known().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hIReturns 1 if secid matches the rule, 0 if it does not, -ERRNO on failure.h]hIReturns 1 if secid matches the rule, 0 if it does not, -ERRNO on failure.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_bpf (C function)c.security_bpfhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hPint security_bpf (int cmd, union bpf_attr *attr, unsigned int size, bool kernel)h]j)}(hOint security_bpf(int cmd, union bpf_attr *attr, unsigned int size, bool kernel)h](j )}(hinth]hint}(hjShhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjOhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOhhhjahMubj{)}(h security_bpfh]j)}(h security_bpfh]h security_bpf}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjOhhhjahMubj)}(h?(int cmd, union bpf_attr *attr, unsigned int size, bool kernel)h](j)}(hint cmdh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcmdh]hcmd}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunion bpf_attr *attrh](j)}(hunionh]hunion}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbpf_attrh]hbpf_attr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jvsbc.security_bpfasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hattrh]hattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int sizeh](j )}(hunsignedh]hunsigned}(hj8hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj4ubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4ubj )}(hinth]hint}(hjThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj4ubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4ubj)}(hsizeh]hsize}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h bool kernelh](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hkernelh]hkernel}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjOhhhjahMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjKhhhjahMubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhjahMhjHhhubj)}(hhh]h)}(h-Check if the bpf syscall operation is allowedh]h-Check if the bpf syscall operation is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjahMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``int cmd`` command ``union bpf_attr *attr`` bpf attribute ``unsigned int size`` size ``bool kernel`` whether or not call originated from kernel **Description** Do a initial check for all bpf syscalls after the attribute is copied into the kernel. The actual security module can implement their own rules to check the specific cmd they need. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h``int cmd`` command h](j)}(h ``int cmd``h]j)}(hjh]hint cmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj ubj2)}(hhh]h)}(hcommandh]hcommand}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj%ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj$hMhjubj)}(h'``union bpf_attr *attr`` bpf attribute h](j)}(h``union bpf_attr *attr``h]j)}(hjHh]hunion bpf_attr *attr}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjBubj2)}(hhh]h)}(h bpf attributeh]h bpf attribute}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hMhj^ubah}(h]h ]h"]h$]h&]uh1j1hjBubeh}(h]h ]h"]h$]h&]uh1jhj]hMhjubj)}(h``unsigned int size`` size h](j)}(h``unsigned int size``h]j)}(hjh]hunsigned int size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj{ubj2)}(hhh]h)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj{ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h;``bool kernel`` whether or not call originated from kernel h](j)}(h``bool kernel``h]j)}(hjh]h bool kernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h*whether or not call originated from kernelh]h*whether or not call originated from kernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hDo a initial check for all bpf syscalls after the attribute is copied into the kernel. The actual security module can implement their own rules to check the specific cmd they need.h]hDo a initial check for all bpf syscalls after the attribute is copied into the kernel. The actual security module can implement their own rules to check the specific cmd they need.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_bpf_map (C function)c.security_bpf_maphNtauh1hhj%hhhNhNubj)}(hhh](j)}(h9int security_bpf_map (struct bpf_map *map, fmode_t fmode)h]j)}(h8int security_bpf_map(struct bpf_map *map, fmode_t fmode)h](j )}(hinth]hint}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]hhhjohMubj{)}(hsecurity_bpf_maph]j)}(hsecurity_bpf_maph]hsecurity_bpf_map}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj]hhhjohMubj)}(h$(struct bpf_map *map, fmode_t fmode)h](j)}(hstruct bpf_map *maph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbpf_maph]hbpf_map}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_bpf_mapasbuh1hhjubj2)}(h h]h }(hGjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmaph]hmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h fmode_t fmodeh](h)}(hhh]j)}(hfmode_th]hfmode_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_bpf_mapasbuh1hhj ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hfmodeh]hfmode}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj]hhhjohMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjYhhhjohMubah}(h]jTah ](jjeh"]h$]h&]jj)jhuh1jhjohMhjVhhubj)}(hhh]h)}(h'Check if access to a bpf map is allowedh]h'Check if access to a bpf map is allowed}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfhhubah}(h]h ]h"]h$]h&]uh1jhjVhhhjohMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct bpf_map *map`` bpf map ``fmode_t fmode`` mode **Description** Do a check when the kernel generates and returns a file descriptor for eBPF maps. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h ``struct bpf_map *map`` bpf map h](j)}(h``struct bpf_map *map``h]j)}(hjh]hstruct bpf_map *map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hbpf maph]hbpf map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``fmode_t fmode`` mode h](j)}(h``fmode_t fmode``h]j)}(hjh]h fmode_t fmode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hmodeh]hmode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hQDo a check when the kernel generates and returns a file descriptor for eBPF maps.h]hQDo a check when the kernel generates and returns a file descriptor for eBPF maps.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjEh]hReturn}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_bpf_prog (C function)c.security_bpf_proghNtauh1hhj%hhhNhNubj)}(hhh](j)}(h-int security_bpf_prog (struct bpf_prog *prog)h]j)}(h,int security_bpf_prog(struct bpf_prog *prog)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_bpf_progh]j)}(hsecurity_bpf_progh]hsecurity_bpf_prog}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct bpf_prog *prog)h]j)}(hstruct bpf_prog *progh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbpf_progh]hbpf_prog}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_bpf_progasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hprogh]hprog}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h+Check if access to a bpf program is allowedh]h+Check if access to a bpf program is allowed}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjGhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbjjbjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct bpf_prog *prog`` bpf program **Description** Do a check when the kernel generates and returns a file descriptor for eBPF programs. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubj )}(hhh]j)}(h&``struct bpf_prog *prog`` bpf program h](j)}(h``struct bpf_prog *prog``h]j)}(hjh]hstruct bpf_prog *prog}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h bpf programh]h bpf program}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjfubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubh)}(hUDo a check when the kernel generates and returns a file descriptor for eBPF programs.h]hUDo a check when the kernel generates and returns a file descriptor for eBPF programs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $security_bpf_map_create (C function)c.security_bpf_map_createhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hmint security_bpf_map_create (struct bpf_map *map, union bpf_attr *attr, struct bpf_token *token, bool kernel)h]j)}(hlint security_bpf_map_create(struct bpf_map *map, union bpf_attr *attr, struct bpf_token *token, bool kernel)h](j )}(hinth]hint}(hj2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.hhhj@hMubj{)}(hsecurity_bpf_map_createh]j)}(hsecurity_bpf_map_createh]hsecurity_bpf_map_create}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj.hhhj@hMubj)}(hQ(struct bpf_map *map, union bpf_attr *attr, struct bpf_token *token, bool kernel)h](j)}(hstruct bpf_map *maph](j)}(hjAh]hstruct}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubh)}(hhh]j)}(hbpf_maph]hbpf_map}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jUsbc.security_bpf_map_createasbuh1hhjkubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(hmaph]hmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubj)}(hunion bpf_attr *attrh](j)}(hjh]hunion}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbpf_attrh]hbpf_attr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_bpf_map_createasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hattrh]hattr}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubj)}(hstruct bpf_token *tokenh](j)}(hjAh]hstruct}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubh)}(hhh]j)}(h bpf_tokenh]h bpf_token}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjqmodnameN classnameNj] j` )}jc ]jc.security_bpf_map_createasbuh1hhjMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(htokenh]htoken}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubj)}(h bool kernelh](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hkernelh]hkernel}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubeh}(h]h ]h"]h$]h&]jjuh1jhj.hhhj@hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj*hhhj@hMubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj@hMhj'hhubj)}(hhh]h)}(h$Check if BPF map creation is allowedh]h$Check if BPF map creation is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj'hhhj@hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct bpf_map *map`` BPF map object ``union bpf_attr *attr`` BPF syscall attributes used to create BPF map ``struct bpf_token *token`` BPF token used to grant user access ``bool kernel`` whether or not call originated from kernel **Description** Do a check when the kernel creates a new BPF map. This is also the point where LSM blob is allocated for LSMs that need them. **Return** Returns 0 on success, error on failure.h](h)}(h**Parameters**h]j)}(hj(h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj"ubj )}(hhh](j)}(h'``struct bpf_map *map`` BPF map object h](j)}(h``struct bpf_map *map``h]j)}(hjGh]hstruct bpf_map *map}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjAubj2)}(hhh]h)}(hBPF map objecth]hBPF map object}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMhj]ubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj\hMhj>ubj)}(hG``union bpf_attr *attr`` BPF syscall attributes used to create BPF map h](j)}(h``union bpf_attr *attr``h]j)}(hjh]hunion bpf_attr *attr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjzubj2)}(hhh]h)}(h-BPF syscall attributes used to create BPF maph]h-BPF syscall attributes used to create BPF map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjzubeh}(h]h ]h"]h$]h&]uh1jhjhMhj>ubj)}(h@``struct bpf_token *token`` BPF token used to grant user access h](j)}(h``struct bpf_token *token``h]j)}(hjh]hstruct bpf_token *token}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h#BPF token used to grant user accessh]h#BPF token used to grant user access}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj>ubj)}(h;``bool kernel`` whether or not call originated from kernel h](j)}(h``bool kernel``h]j)}(hjh]h bool kernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h*whether or not call originated from kernelh]h*whether or not call originated from kernel}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj>ubeh}(h]h ]h"]h$]h&]uh1j hj"ubh)}(h**Description**h]j)}(hj-h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj"ubh)}(h}Do a check when the kernel creates a new BPF map. This is also the point where LSM blob is allocated for LSMs that need them.h]h}Do a check when the kernel creates a new BPF map. This is also the point where LSM blob is allocated for LSMs that need them.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj"ubh)}(h **Return**h]j)}(hjTh]hReturn}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj"ubh)}(h'Returns 0 on success, error on failure.h]h'Returns 0 on success, error on failure.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_bpf_prog_load (C function)c.security_bpf_prog_loadhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hnint security_bpf_prog_load (struct bpf_prog *prog, union bpf_attr *attr, struct bpf_token *token, bool kernel)h]j)}(hmint security_bpf_prog_load(struct bpf_prog *prog, union bpf_attr *attr, struct bpf_token *token, bool kernel)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_bpf_prog_loadh]j)}(hsecurity_bpf_prog_loadh]hsecurity_bpf_prog_load}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hS(struct bpf_prog *prog, union bpf_attr *attr, struct bpf_token *token, bool kernel)h](j)}(hstruct bpf_prog *progh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbpf_progh]hbpf_prog}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_bpf_prog_loadasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hprogh]hprog}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunion bpf_attr *attrh](j)}(hjh]hunion}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDubh)}(hhh]j)}(hbpf_attrh]hbpf_attr}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjhmodnameN classnameNj] j` )}jc ]jc.security_bpf_prog_loadasbuh1hhjDubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(hattrh]hattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct bpf_token *tokenh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h bpf_tokenh]h bpf_token}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.security_bpf_prog_loadasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(htokenh]htoken}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h bool kernelh](j )}(hj8h]hbool}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(hkernelh]hkernel}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h*Check if loading of BPF program is allowedh]h*Check if loading of BPF program is allowed}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX/**Parameters** ``struct bpf_prog *prog`` BPF program object ``union bpf_attr *attr`` BPF syscall attributes used to create BPF program ``struct bpf_token *token`` BPF token used to grant user access to BPF subsystem ``bool kernel`` whether or not call originated from kernel **Description** Perform an access control check when the kernel loads a BPF program and allocates associated BPF program object. This hook is also responsible for allocating any required LSM state for the BPF program. **Return** Returns 0 on success, error on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h-``struct bpf_prog *prog`` BPF program object h](j)}(h``struct bpf_prog *prog``h]j)}(hjh]hstruct bpf_prog *prog}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(hBPF program objecth]hBPF program object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hK``union bpf_attr *attr`` BPF syscall attributes used to create BPF program h](j)}(h``union bpf_attr *attr``h]j)}(hjh]hunion bpf_attr *attr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h1BPF syscall attributes used to create BPF programh]h1BPF syscall attributes used to create BPF program}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hQ``struct bpf_token *token`` BPF token used to grant user access to BPF subsystem h](j)}(h``struct bpf_token *token``h]j)}(hj h]hstruct bpf_token *token}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h4BPF token used to grant user access to BPF subsystemh]h4BPF token used to grant user access to BPF subsystem}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMhj6ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj5hMhjubj)}(h;``bool kernel`` whether or not call originated from kernel h](j)}(h``bool kernel``h]j)}(hjYh]h bool kernel}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjSubj2)}(hhh]h)}(h*whether or not call originated from kernelh]h*whether or not call originated from kernel}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhMhjoubah}(h]h ]h"]h$]h&]uh1j1hjSubeh}(h]h ]h"]h$]h&]uh1jhjnhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hPerform an access control check when the kernel loads a BPF program and allocates associated BPF program object. This hook is also responsible for allocating any required LSM state for the BPF program.h]hPerform an access control check when the kernel loads a BPF program and allocates associated BPF program object. This hook is also responsible for allocating any required LSM state for the BPF program.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h'Returns 0 on success, error on failure.h]h'Returns 0 on success, error on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_bpf_token_create (C function)c.security_bpf_token_createhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hfint security_bpf_token_create (struct bpf_token *token, union bpf_attr *attr, const struct path *path)h]j)}(heint security_bpf_token_create(struct bpf_token *token, union bpf_attr *attr, const struct path *path)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM ubj{)}(hsecurity_bpf_token_createh]j)}(hsecurity_bpf_token_createh]hsecurity_bpf_token_create}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM ubj)}(hH(struct bpf_token *token, union bpf_attr *attr, const struct path *path)h](j)}(hstruct bpf_token *tokenh](j)}(hjAh]hstruct}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubh)}(hhh]j)}(h bpf_tokenh]h bpf_token}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj]modnameN classnameNj] j` )}jc ]jf )}jY j#sbc.security_bpf_token_createasbuh1hhj9ubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(htokenh]htoken}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubj)}(hunion bpf_attr *attrh](j)}(hjh]hunion}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbpf_attrh]hbpf_attr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jwc.security_bpf_token_createasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hattrh]hattr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubj)}(hconst struct path *pathh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hpathh]hpath}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjZmodnameN classnameNj] j` )}jc ]jwc.security_bpf_token_createasbuh1hhjubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpathh]hpath}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h)Check if creating of BPF token is allowedh]h)Check if creating of BPF token is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``struct bpf_token *token`` BPF token object ``union bpf_attr *attr`` BPF syscall attributes used to create BPF token ``const struct path *path`` path pointing to BPF FS mount point from which BPF token is created **Description** Do a check when the kernel instantiates a new BPF token object from BPF FS instance. This is also the point where LSM blob can be allocated for LSMs. **Return** Returns 0 on success, error on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh](j)}(h-``struct bpf_token *token`` BPF token object h](j)}(h``struct bpf_token *token``h]j)}(hjh]hstruct bpf_token *token}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubj2)}(hhh]h)}(hBPF token objecth]hBPF token object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(hI``union bpf_attr *attr`` BPF syscall attributes used to create BPF token h](j)}(h``union bpf_attr *attr``h]j)}(hj5h]hunion bpf_attr *attr}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj/ubj2)}(hhh]h)}(h/BPF syscall attributes used to create BPF tokenh]h/BPF syscall attributes used to create BPF token}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhM hjKubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhjJhM hjubj)}(h```const struct path *path`` path pointing to BPF FS mount point from which BPF token is created h](j)}(h``const struct path *path``h]j)}(hjnh]hconst struct path *path}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhubj2)}(hhh]h)}(hCpath pointing to BPF FS mount point from which BPF token is createdh]hCpath pointing to BPF FS mount point from which BPF token is created}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hDo a check when the kernel instantiates a new BPF token object from BPF FS instance. This is also the point where LSM blob can be allocated for LSMs.h]hDo a check when the kernel instantiates a new BPF token object from BPF FS instance. This is also the point where LSM blob can be allocated for LSMs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h'Returns 0 on success, error on failure.h]h'Returns 0 on success, error on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_bpf_token_cmd (C function)c.security_bpf_token_cmdhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hLint security_bpf_token_cmd (const struct bpf_token *token, enum bpf_cmd cmd)h]j)}(hKint security_bpf_token_cmd(const struct bpf_token *token, enum bpf_cmd cmd)h](j )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM%ubj2)}(h h]h }(hj$ hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj# hM%ubj{)}(hsecurity_bpf_token_cmdh]j)}(hsecurity_bpf_token_cmdh]hsecurity_bpf_token_cmd}(hj6 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2 ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj# hM%ubj)}(h1(const struct bpf_token *token, enum bpf_cmd cmd)h](j)}(hconst struct bpf_token *tokenh](j)}(hjh]hconst}(hjR hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN ubj2)}(h h]h }(hj_ hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjN ubj)}(hjAh]hstruct}(hjm hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN ubj2)}(h h]h }(hjz hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjN ubh)}(hhh]j)}(h bpf_tokenh]h bpf_token}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY j8 sbc.security_bpf_token_cmdasbuh1hhjN ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjN ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN ubj)}(htokenh]htoken}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJ ubj)}(henum bpf_cmd cmdh](j)}(hj:h]henum}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hbpf_cmdh]hbpf_cmd}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]j c.security_bpf_token_cmdasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hcmdh]hcmd}(hj) hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJ ubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhj# hM%ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj# hM%ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj# hM%hj hhubj)}(hhh]h)}(hGCheck if BPF token is allowed to delegate requested BPF syscall commandh]hGCheck if BPF token is allowed to delegate requested BPF syscall command}(hjS hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM%hjP hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj# hM%ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjk jjk jjjuh1jhhhj%hNhNubj)}(hXV**Parameters** ``const struct bpf_token *token`` BPF token object ``enum bpf_cmd cmd`` BPF syscall command requested to be delegated by BPF token **Description** Do a check when the kernel decides whether provided BPF token should allow delegation of requested BPF syscall command. **Return** Returns 0 on success, error on failure.h](h)}(h**Parameters**h]j)}(hju h]h Parameters}(hjw hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM)hjo ubj )}(hhh](j)}(h3``const struct bpf_token *token`` BPF token object h](j)}(h!``const struct bpf_token *token``h]j)}(hj h]hconst struct bpf_token *token}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM'hj ubj2)}(hhh]h)}(hBPF token objecth]hBPF token object}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM'hj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hM'hj ubj)}(hP``enum bpf_cmd cmd`` BPF syscall command requested to be delegated by BPF token h](j)}(h``enum bpf_cmd cmd``h]j)}(hj h]henum bpf_cmd cmd}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM(hj ubj2)}(hhh]h)}(h:BPF syscall command requested to be delegated by BPF tokenh]h:BPF syscall command requested to be delegated by BPF token}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM(hj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hM(hj ubeh}(h]h ]h"]h$]h&]uh1j hjo ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM*hjo ubh)}(hwDo a check when the kernel decides whether provided BPF token should allow delegation of requested BPF syscall command.h]hwDo a check when the kernel decides whether provided BPF token should allow delegation of requested BPF syscall command.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM)hjo ubh)}(h **Return**h]j)}(hj/ h]hReturn}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj- ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM,hjo ubh)}(h'Returns 0 on success, error on failure.h]h'Returns 0 on success, error on failure.}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM-hjo ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'security_bpf_token_capable (C function)c.security_bpf_token_capablehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hGint security_bpf_token_capable (const struct bpf_token *token, int cap)h]j)}(hFint security_bpf_token_capable(const struct bpf_token *token, int cap)h](j )}(hinth]hint}(hjt hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjp hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjp hhhj hM5ubj{)}(hsecurity_bpf_token_capableh]j)}(hsecurity_bpf_token_capableh]hsecurity_bpf_token_capable}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjp hhhj hM5ubj)}(h((const struct bpf_token *token, int cap)h](j)}(hconst struct bpf_token *tokenh](j)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(h bpf_tokenh]h bpf_token}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY j sbc.security_bpf_token_capableasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(htokenh]htoken}(hj% hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hint caph](j )}(hinth]hint}(hj> hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj: ubj2)}(h h]h }(hjL hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj: ubj)}(hcaph]hcap}(hjZ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj: ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjp hhhj hM5ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjl hhhj hM5ubah}(h]jg ah ](jjeh"]h$]h&]jj)jhuh1jhj hM5hji hhubj)}(hhh]h)}(hJCheck if BPF token is allowed to delegate requested BPF-related capabilityh]hJCheck if BPF token is allowed to delegate requested BPF-related capability}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5hj hhubah}(h]h ]h"]h$]h&]uh1jhji hhhj hM5ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhj%hNhNubj)}(hXK**Parameters** ``const struct bpf_token *token`` BPF token object ``int cap`` capabilities requested to be delegated by BPF token **Description** Do a check when the kernel decides whether provided BPF token should allow delegation of requested BPF-related capabilities. **Return** Returns 0 on success, error on failure.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM9hj ubj )}(hhh](j)}(h3``const struct bpf_token *token`` BPF token object h](j)}(h!``const struct bpf_token *token``h]j)}(hj h]hconst struct bpf_token *token}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM7hj ubj2)}(hhh]h)}(hBPF token objecth]hBPF token object}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM7hj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hM7hj ubj)}(h@``int cap`` capabilities requested to be delegated by BPF token h](j)}(h ``int cap``h]j)}(hj h]hint cap}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM8hj ubj2)}(hhh]h)}(h3capabilities requested to be delegated by BPF tokenh]h3capabilities requested to be delegated by BPF token}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM8hj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hM8hj ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hj9 h]h Description}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7 ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM:hj ubh)}(h|Do a check when the kernel decides whether provided BPF token should allow delegation of requested BPF-related capabilities.h]h|Do a check when the kernel decides whether provided BPF token should allow delegation of requested BPF-related capabilities.}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM9hj ubh)}(h **Return**h]j)}(hj` h]hReturn}(hjb hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM<hj ubh)}(h'Returns 0 on success, error on failure.h]h'Returns 0 on success, error on failure.}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM=hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_bpf_map_free (C function)c.security_bpf_map_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h0void security_bpf_map_free (struct bpf_map *map)h]j)}(h/void security_bpf_map_free(struct bpf_map *map)h](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMEubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj hMEubj{)}(hsecurity_bpf_map_freeh]j)}(hsecurity_bpf_map_freeh]hsecurity_bpf_map_free}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj hMEubj)}(h(struct bpf_map *map)h]j)}(hstruct bpf_map *maph](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hbpf_maph]hbpf_map}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j sbc.security_bpf_map_freeasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hmaph]hmap}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhj hhhj hMEubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hMEubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hMEhj hhubj)}(hhh]h)}(hFree a bpf map's LSM blobh]hFree a bpf map’s LSM blob}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMEhjbhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMEubeh}(h]h ](jfunctioneh"]h$]h&]jjjj}jj}jjjuh1jhhhj%hNhNubj)}(h|**Parameters** ``struct bpf_map *map`` bpf map **Description** Clean up the security information stored inside bpf map.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMIhjubj )}(hhh]j)}(h ``struct bpf_map *map`` bpf map h](j)}(h``struct bpf_map *map``h]j)}(hjh]hstruct bpf_map *map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMFhjubj2)}(hhh]h)}(hbpf maph]hbpf map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMFhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMFhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMHhjubh)}(h8Clean up the security information stored inside bpf map.h]h8Clean up the security information stored inside bpf map.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMGhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_bpf_prog_free (C function)c.security_bpf_prog_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h3void security_bpf_prog_free (struct bpf_prog *prog)h]j)}(h2void security_bpf_prog_free(struct bpf_prog *prog)h](j )}(hvoidh]hvoid}(hj&hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj"hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMRubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"hhhj4hMRubj{)}(hsecurity_bpf_prog_freeh]j)}(hsecurity_bpf_prog_freeh]hsecurity_bpf_prog_free}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj"hhhj4hMRubj)}(h(struct bpf_prog *prog)h]j)}(hstruct bpf_prog *progh](j)}(hjAh]hstruct}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubh)}(hhh]j)}(hbpf_progh]hbpf_prog}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jIsbc.security_bpf_prog_freeasbuh1hhj_ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hprogh]hprog}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj[ubah}(h]h ]h"]h$]h&]jjuh1jhj"hhhj4hMRubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj4hMRubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj4hMRhjhhubj)}(hhh]h)}(hFree a BPF program's LSM blobh]hFree a BPF program’s LSM blob}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMRhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj4hMRubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct bpf_prog *prog`` BPF program struct **Description** Clean up the security information stored inside BPF program.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMVhjubj )}(hhh]j)}(h-``struct bpf_prog *prog`` BPF program struct h](j)}(h``struct bpf_prog *prog``h]j)}(hj'h]hstruct bpf_prog *prog}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMShj!ubj2)}(hhh]h)}(hBPF program structh]hBPF program struct}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMShj=ubah}(h]h ]h"]h$]h&]uh1j1hj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hMShjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjbh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMUhjubh)}(hah"]h$]h&]uh1j1hjhhhjhM_ubj{)}(hsecurity_bpf_token_freeh]j)}(hsecurity_bpf_token_freeh]hsecurity_bpf_token_free}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM_ubj)}(h(struct bpf_token *token)h]j)}(hstruct bpf_token *tokenh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h bpf_tokenh]h bpf_token}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_bpf_token_freeasbuh1hhjubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(htokenh]htoken}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM_ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM_ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM_hjhhubj)}(hhh]h)}(hFree a BPF token's LSM blobh]hFree a BPF token’s LSM blob}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM_hjdhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM_ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct bpf_token *token`` BPF token struct **Description** Clean up the security information stored inside BPF token.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMchjubj )}(hhh]j)}(h-``struct bpf_token *token`` BPF token struct h](j)}(h``struct bpf_token *token``h]j)}(hjh]hstruct bpf_token *token}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM`hjubj2)}(hhh]h)}(hBPF token structh]hBPF token struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM`hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM`hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMbhjubh)}(h:Clean up the security information stored inside BPF token.h]h:Clean up the security information stored inside BPF token.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMahjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_perf_event_open (C function)c.security_perf_event_openhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h'int security_perf_event_open (int type)h]j)}(h&int security_perf_event_open(int type)h](j )}(hinth]hint}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$hhhj6hMubj{)}(hsecurity_perf_event_openh]j)}(hsecurity_perf_event_openh]hsecurity_perf_event_open}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj$hhhj6hMubj)}(h (int type)h]j)}(hint typeh](j )}(hinth]hint}(hjehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(htypeh]htype}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubah}(h]h ]h"]h$]h&]jjuh1jhj$hhhj6hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj6hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj6hMhjhhubj)}(hhh]h)}(h%Check if a perf event open is allowedh]h%Check if a perf event open is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj6hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``int type`` type of event **Description** Check whether the **type** of perf_event_open syscall is allowed. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh]j)}(h``int type`` type of event h](j)}(h ``int type``h]j)}(hjh]hint type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h type of eventh]h type of event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj'h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hACheck whether the **type** of perf_event_open syscall is allowed.h](hCheck whether the }(hj=hhhNhNubj)}(h**type**h]htype}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh' of perf_event_open syscall is allowed.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hj`h]hReturn}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_perf_event_alloc (C function)c.security_perf_event_allochNtauh1hhj%hhhNhNubj)}(hhh](j)}(h8int security_perf_event_alloc (struct perf_event *event)h]j)}(h7int security_perf_event_alloc(struct perf_event *event)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_perf_event_alloch]j)}(hsecurity_perf_event_alloch]hsecurity_perf_event_alloc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct perf_event *event)h]j)}(hstruct perf_event *eventh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h perf_eventh]h perf_event}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_perf_event_allocasbuh1hhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(heventh]hevent}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hAllocate a perf event LSM blobh]hAllocate a perf event LSM blob}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjbhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj}jj}jjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct perf_event *event`` perf event **Description** Allocate and save perf_event security info. **Return** Returns 0 on success, error on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh]j)}(h(``struct perf_event *event`` perf event h](j)}(h``struct perf_event *event``h]j)}(hjh]hstruct perf_event *event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h perf eventh]h perf event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h+Allocate and save perf_event security info.h]h+Allocate and save perf_event security info.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h'Returns 0 on success, error on failure.h]h'Returns 0 on success, error on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_perf_event_free (C function)c.security_perf_event_freehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h8void security_perf_event_free (struct perf_event *event)h]j)}(h7void security_perf_event_free(struct perf_event *event)h](j )}(hvoidh]hvoid}(hjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjIhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIhhhj[hMubj{)}(hsecurity_perf_event_freeh]j)}(hsecurity_perf_event_freeh]hsecurity_perf_event_free}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjIhhhj[hMubj)}(h(struct perf_event *event)h]j)}(hstruct perf_event *eventh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h perf_eventh]h perf_event}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jpsbc.security_perf_event_freeasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(heventh]hevent}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjIhhhj[hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjEhhhj[hMubah}(h]j@ah ](jjeh"]h$]h&]jj)jhuh1jhj[hMhjBhhubj)}(hhh]h)}(hFree a perf event LSM blobh]hFree a perf event LSM blob}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjBhhhj[hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj%jj%jjjuh1jhhhj%hNhNubj)}(ht**Parameters** ``struct perf_event *event`` perf event **Description** Release (free) perf_event security info.h](h)}(h**Parameters**h]j)}(hj/h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj)ubj )}(hhh]j)}(h(``struct perf_event *event`` perf event h](j)}(h``struct perf_event *event``h]j)}(hjNh]hstruct perf_event *event}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjHubj2)}(hhh]h)}(h perf eventh]h perf event}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMhjdubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjchMhjEubah}(h]h ]h"]h$]h&]uh1j hj)ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj)ubh)}(h(Release (free) perf_event security info.h]h(Release (free) perf_event security info.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %security_perf_event_read (C function)c.security_perf_event_readhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h7int security_perf_event_read (struct perf_event *event)h]j)}(h6int security_perf_event_read(struct perf_event *event)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsecurity_perf_event_readh]j)}(hsecurity_perf_event_readh]hsecurity_perf_event_read}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct perf_event *event)h]j)}(hstruct perf_event *eventh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h perf_eventh]h perf_event}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj+modnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_perf_event_readasbuh1hhjubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(heventh]hevent}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h.Check if reading a perf event label is allowedh]h.Check if reading a perf event label is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct perf_event *event`` perf event **Description** Read perf_event security info if allowed. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh]j)}(h(``struct perf_event *event`` perf event h](j)}(h``struct perf_event *event``h]j)}(hjh]hstruct perf_event *event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj2)}(hhh]h)}(h perf eventh]h perf event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h)Read perf_event security info if allowed.h]h)Read perf_event security info if allowed.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hj1h]hReturn}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &security_perf_event_write (C function)c.security_perf_event_writehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h8int security_perf_event_write (struct perf_event *event)h]j)}(h7int security_perf_event_write(struct perf_event *event)h](j )}(hinth]hint}(hjvhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrhhhjhM ubj{)}(hsecurity_perf_event_writeh]j)}(hsecurity_perf_event_writeh]hsecurity_perf_event_write}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjrhhhjhM ubj)}(h(struct perf_event *event)h]j)}(hstruct perf_event *eventh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h perf_eventh]h perf_event}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.security_perf_event_writeasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(heventh]hevent}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjrhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjnhhhjhM ubah}(h]jiah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjkhhubj)}(hhh]h)}(h.Check if writing a perf event label is allowedh]h.Check if writing a perf event label is allowed}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hj3hhubah}(h]h ]h"]h$]h&]uh1jhjkhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjNjjNjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct perf_event *event`` perf event **Description** Write perf_event security info if allowed. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjXh]h Parameters}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjRubj )}(hhh]j)}(h(``struct perf_event *event`` perf event h](j)}(h``struct perf_event *event``h]j)}(hjwh]hstruct perf_event *event}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjqubj2)}(hhh]h)}(h perf eventh]h perf event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjqubeh}(h]h ]h"]h$]h&]uh1jhjhM hjnubah}(h]h ]h"]h$]h&]uh1j hjRubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjRubh)}(h*Write perf_event security info if allowed.h]h*Write perf_event security info if allowed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjRubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjRubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *security_uring_override_creds (C function)c.security_uring_override_credshNtauh1hhj%hhhNhNubj)}(hhh](j)}(h:int security_uring_override_creds (const struct cred *new)h]j)}(h9int security_uring_override_creds(const struct cred *new)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj,hMubj{)}(hsecurity_uring_override_credsh]j)}(hsecurity_uring_override_credsh]hsecurity_uring_override_creds}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj,hMubj)}(h(const struct cred *new)h]j)}(hconst struct cred *newh](j)}(hjh]hconst}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjAh]hstruct}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubh)}(hhh]j)}(hcredh]hcred}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jAsbc.security_uring_override_credsasbuh1hhjWubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hnewh]hnew}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj,hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj,hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj,hMhjhhubj)}(hhh]h)}(h$Check if overriding creds is allowedh]h$Check if overriding creds is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj,hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``const struct cred *new`` new credentials **Description** Check if the current task, executing an io_uring operation, is allowed to override it's credentials with **new**. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubj )}(hhh]j)}(h+``const struct cred *new`` new credentials h](j)}(h``const struct cred *new``h]j)}(hj:h]hconst struct cred *new}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhj4ubj2)}(hhh]h)}(hnew credentialsh]hnew credentials}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjPubah}(h]h ]h"]h$]h&]uh1j1hj4ubeh}(h]h ]h"]h$]h&]uh1jhjOhMhj1ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjuh]h Description}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(hqCheck if the current task, executing an io_uring operation, is allowed to override it's credentials with **new**.h](hkCheck if the current task, executing an io_uring operation, is allowed to override it’s credentials with }(hjhhhNhNubj)}(h**new**h]hnew}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMhjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "security_uring_sqpoll (C function)c.security_uring_sqpollhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h int security_uring_sqpoll (void)h]j)}(hint security_uring_sqpoll(void)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM(ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM(ubj{)}(hsecurity_uring_sqpollh]j)}(hsecurity_uring_sqpollh]hsecurity_uring_sqpoll}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM(ubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM(ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM(ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM(hjhhubj)}(hhh]h)}(h'Check if IORING_SETUP_SQPOLL is allowedh]h'Check if IORING_SETUP_SQPOLL is allowed}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM(hjWhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM(ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjrjjrjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``void`` no arguments **Description** Check whether the current task is allowed to spawn a io_uring polling thread (IORING_SETUP_SQPOLL). **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj|h]h Parameters}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM,hjvubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjvubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjvubh)}(hcCheck whether the current task is allowed to spawn a io_uring polling thread (IORING_SETUP_SQPOLL).h]hcCheck whether the current task is allowed to spawn a io_uring polling thread (IORING_SETUP_SQPOLL).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM)hjvubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM,hjvubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM-hjvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j security_uring_cmd (C function)c.security_uring_cmdhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h4int security_uring_cmd (struct io_uring_cmd *ioucmd)h]j)}(h3int security_uring_cmd(struct io_uring_cmd *ioucmd)h](j )}(hinth]hint}(hjBhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5ubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>hhhjPhM5ubj{)}(hsecurity_uring_cmdh]j)}(hsecurity_uring_cmdh]hsecurity_uring_cmd}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj>hhhjPhM5ubj)}(h(struct io_uring_cmd *ioucmd)h]j)}(hstruct io_uring_cmd *ioucmdh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubh)}(hhh]j)}(h io_uring_cmdh]h io_uring_cmd}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jesbc.security_uring_cmdasbuh1hhj{ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(hioucmdh]hioucmd}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwubah}(h]h ]h"]h$]h&]jjuh1jhj>hhhjPhM5ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj:hhhjPhM5ubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1jhjPhM5hj7hhubj)}(hhh]h)}(h2Check if a io_uring passthrough command is allowedh]h2Check if a io_uring passthrough command is allowed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM5hjhhubah}(h]h ]h"]h$]h&]uh1jhj7hhhjPhM5ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj%hNhNubj)}(h**Parameters** ``struct io_uring_cmd *ioucmd`` command **Description** Check whether the file_operations uring_cmd is allowed to run. **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM9hjubj )}(hhh]j)}(h(``struct io_uring_cmd *ioucmd`` command h](j)}(h``struct io_uring_cmd *ioucmd``h]j)}(hjCh]hstruct io_uring_cmd *ioucmd}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM6hj=ubj2)}(hhh]h)}(hcommandh]hcommand}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhM6hjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhM6hj:ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj~h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM8hjubh)}(h>Check whether the file_operations uring_cmd is allowed to run.h]h>Check whether the file_operations uring_cmd is allowed to run.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM7hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM9hjubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chM:hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #security_uring_allowed (C function)c.security_uring_allowedhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h!int security_uring_allowed (void)h]j)}(h int security_uring_allowed(void)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMBubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMBubj{)}(hsecurity_uring_allowedh]j)}(hsecurity_uring_allowedh]hsecurity_uring_allowed}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMBubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj'hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMBubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMBubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMBhjhhubj)}(hhh]h)}(h$Check if io_uring_setup() is allowedh]h$Check if io_uring_setup() is allowed}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMBhjNhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMBubeh}(h]h ](jfunctioneh"]h$]h&]jjjjijjijjjuh1jhhhj%hNhNubj)}(h**Parameters** ``void`` no arguments **Description** Check whether the current task is allowed to call io_uring_setup(). **Return** Returns 0 if permission is granted.h](h)}(h**Parameters**h]j)}(hjsh]h Parameters}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMFhjmubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjmubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhjmubh)}(hCCheck whether the current task is allowed to call io_uring_setup().h]hCCheck whether the current task is allowed to call io_uring_setup().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMChjmubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMEhjmubh)}(h#Returns 0 if permission is granted.h]h#Returns 0 if permission is granted.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMFhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )security_initramfs_populated (C function)c.security_initramfs_populatedhNtauh1hhj%hhhNhNubj)}(hhh](j)}(h(void security_initramfs_populated (void)h]j)}(h'void security_initramfs_populated(void)h](j )}(hvoidh]hvoid}(hj9 hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5 hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMOubj2)}(h h]h }(hjH hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5 hhhjG hMOubj{)}(hsecurity_initramfs_populatedh]j)}(hsecurity_initramfs_populatedh]hsecurity_initramfs_populated}(hjZ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj5 hhhjG hMOubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjv hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjr ubah}(h]h ]h"]h$]h&]noemphjjuh1jhjn ubah}(h]h ]h"]h$]h&]jjuh1jhj5 hhhjG hMOubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj1 hhhjG hMOubah}(h]j, ah ](jjeh"]h$]h&]jj)jhuh1jhjG hMOhj. hhubj)}(hhh]h)}(h*Notify LSMs that initramfs has been loadedh]h*Notify LSMs that initramfs has been loaded}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMOhj hhubah}(h]h ]h"]h$]h&]uh1jhj. hhhjG hMOubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhj%hNhNubj)}(hy**Parameters** ``void`` no arguments **Description** Tells the LSMs the initramfs has been unpacked into the rootfs.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMShj ubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj h]hvoid}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hj!h]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chKhj ubh)}(h?Tells the LSMs the initramfs has been unpacked into the rootfs.h]h?Tells the LSMs the initramfs has been unpacked into the rootfs.}(hj2!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:283: ./security/security.chMPhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #securityfs_create_file (C function)c.securityfs_create_filehNtauh1hhj%hhhNhNubj)}(hhh](j)}(hstruct dentry * securityfs_create_file (const char *name, umode_t mode, struct dentry *parent, void *data, const struct file_operations *fops)h]j)}(hstruct dentry *securityfs_create_file(const char *name, umode_t mode, struct dentry *parent, void *data, const struct file_operations *fops)h](j)}(hjAh]hstruct}(hja!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]!hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKubj2)}(h h]h }(hjo!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]!hhhjn!hKubh)}(hhh]j)}(hdentryh]hdentry}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}!ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj!modnameN classnameNj] j` )}jc ]jf )}jY securityfs_create_filesbc.securityfs_create_fileasbuh1hhj]!hhhjn!hKubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]!hhhjn!hKubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]!hhhjn!hKubj{)}(hsecurityfs_create_fileh]j)}(hj!h]hsecurityfs_create_file}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj]!hhhjn!hKubj)}(hg(const char *name, umode_t mode, struct dentry *parent, void *data, const struct file_operations *fops)h](j)}(hconst char *nameh](j)}(hjh]hconst}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!ubj )}(hcharh]hchar}(hj!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!ubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!ubj)}(hjh]h*}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(hnameh]hname}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h umode_t modeh](h)}(hhh]j)}(humode_th]humode_t}(hj;"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8"ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj="modnameN classnameNj] j` )}jc ]j!c.securityfs_create_fileasbuh1hhj4"ubj2)}(h h]h }(hjY"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4"ubj)}(hmodeh]hmode}(hjg"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4"ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(hstruct dentry *parenth](j)}(hjAh]hstruct}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|"ubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|"ubh)}(hhh]j)}(hdentryh]hdentry}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj"modnameN classnameNj] j` )}jc ]j!c.securityfs_create_fileasbuh1hhj|"ubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|"ubj)}(hjh]h*}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|"ubj)}(hparenth]hparent}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|"ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h void *datah](j )}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj"ubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"ubj)}(hjh]h*}(hj #hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hdatah]hdata}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h"const struct file_operations *fopsh](j)}(hjh]hconst}(hj2#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.#ubj2)}(h h]h }(hj?#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.#ubj)}(hjAh]hstruct}(hjM#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.#ubj2)}(h h]h }(hjZ#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.#ubh)}(hhh]j)}(hfile_operationsh]hfile_operations}(hjk#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh#ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjm#modnameN classnameNj] j` )}jc ]j!c.securityfs_create_fileasbuh1hhj.#ubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.#ubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.#ubj)}(hfopsh]hfops}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.#ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubeh}(h]h ]h"]h$]h&]jjuh1jhj]!hhhjn!hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjY!hhhjn!hKubah}(h]jT!ah ](jjeh"]h$]h&]jj)jhuh1jhjn!hKhjV!hhubj)}(hhh]h)}(h*create a file in the securityfs filesystemh]h*create a file in the securityfs filesystem}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj#hhubah}(h]h ]h"]h$]h&]uh1jhjV!hhhjn!hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj#jj#jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``const char *name`` a pointer to a string containing the name of the file to create. ``umode_t mode`` the permission that the file should have ``struct dentry *parent`` a pointer to the parent dentry for this file. This should be a directory dentry if set. If this parameter is ``NULL``, then the file will be created in the root of the securityfs filesystem. ``void *data`` a pointer to something that the caller will want to get to later on. The inode.i_private pointer will point to this value on the open() call. ``const struct file_operations *fops`` a pointer to a struct file_operations that should be used for this file. **Description** This function creates a file in securityfs with the given **name**. This function returns a pointer to a dentry if it succeeds. This pointer must be passed to the securityfs_remove() function when the file is to be removed (no automatic cleanup happens if your module is unloaded, you are responsible here). If an error occurs, the function will return the error value (via ERR_PTR). If securityfs is not enabled in the kernel, the value ``-ENODEV`` is returned.h](h)}(h**Parameters**h]j)}(hj#h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj#ubj )}(hhh](j)}(hV``const char *name`` a pointer to a string containing the name of the file to create. h](j)}(h``const char *name``h]j)}(hj$h]hconst char *name}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj $ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj $ubj2)}(hhh]h)}(h@a pointer to a string containing the name of the file to create.h]h@a pointer to a string containing the name of the file to create.}(hj($hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$$hKhj%$ubah}(h]h ]h"]h$]h&]uh1j1hj $ubeh}(h]h ]h"]h$]h&]uh1jhj$$hKhj$ubj)}(h:``umode_t mode`` the permission that the file should have h](j)}(h``umode_t mode``h]j)}(hjH$h]h umode_t mode}(hjJ$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF$ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhjB$ubj2)}(hhh]h)}(h(the permission that the file should haveh]h(the permission that the file should have}(hja$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]$hKhj^$ubah}(h]h ]h"]h$]h&]uh1j1hjB$ubeh}(h]h ]h"]h$]h&]uh1jhj]$hKhj$ubj)}(h``struct dentry *parent`` a pointer to the parent dentry for this file. This should be a directory dentry if set. If this parameter is ``NULL``, then the file will be created in the root of the securityfs filesystem. h](j)}(h``struct dentry *parent``h]j)}(hj$h]hstruct dentry *parent}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj{$ubj2)}(hhh]h)}(ha pointer to the parent dentry for this file. This should be a directory dentry if set. If this parameter is ``NULL``, then the file will be created in the root of the securityfs filesystem.h](hoa pointer to the parent dentry for this file. This should be a directory dentry if set. If this parameter is }(hj$hhhNhNubj)}(h``NULL``h]hNULL}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubhI, then the file will be created in the root of the securityfs filesystem.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj$ubah}(h]h ]h"]h$]h&]uh1j1hj{$ubeh}(h]h ]h"]h$]h&]uh1jhj$hKhj$ubj)}(h``void *data`` a pointer to something that the caller will want to get to later on. The inode.i_private pointer will point to this value on the open() call. h](j)}(h``void *data``h]j)}(hj$h]h void *data}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj$ubj2)}(hhh]h)}(ha pointer to something that the caller will want to get to later on. The inode.i_private pointer will point to this value on the open() call.h]ha pointer to something that the caller will want to get to later on. The inode.i_private pointer will point to this value on the open() call.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj$ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hKhj$ubj)}(hp``const struct file_operations *fops`` a pointer to a struct file_operations that should be used for this file. h](j)}(h&``const struct file_operations *fops``h]j)}(hj%h]h"const struct file_operations *fops}(hj %hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj%ubj2)}(hhh]h)}(hHa pointer to a struct file_operations that should be used for this file.h]hHa pointer to a struct file_operations that should be used for this file.}(hj %hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj%ubah}(h]h ]h"]h$]h&]uh1j1hj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hKhj$ubeh}(h]h ]h"]h$]h&]uh1j hj#ubh)}(h**Description**h]j)}(hjC%h]h Description}(hjE%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA%ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj#ubh)}(hCThis function creates a file in securityfs with the given **name**.h](h:This function creates a file in securityfs with the given }(hjY%hhhNhNubj)}(h**name**h]hname}(hja%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY%ubh.}(hjY%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj#ubh)}(hX=This function returns a pointer to a dentry if it succeeds. This pointer must be passed to the securityfs_remove() function when the file is to be removed (no automatic cleanup happens if your module is unloaded, you are responsible here). If an error occurs, the function will return the error value (via ERR_PTR).h]hX=This function returns a pointer to a dentry if it succeeds. This pointer must be passed to the securityfs_remove() function when the file is to be removed (no automatic cleanup happens if your module is unloaded, you are responsible here). If an error occurs, the function will return the error value (via ERR_PTR).}(hjz%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj#ubh)}(hNIf securityfs is not enabled in the kernel, the value ``-ENODEV`` is returned.h](h6If securityfs is not enabled in the kernel, the value }(hj%hhhNhNubj)}(h ``-ENODEV``h]h-ENODEV}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh is returned.}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "securityfs_create_dir (C function)c.securityfs_create_dirhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hOstruct dentry * securityfs_create_dir (const char *name, struct dentry *parent)h]j)}(hMstruct dentry *securityfs_create_dir(const char *name, struct dentry *parent)h](j)}(hjAh]hstruct}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKubj2)}(h h]h }(hj%hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%hhhj%hKubh)}(hhh]j)}(hdentryh]hdentry}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj%modnameN classnameNj] j` )}jc ]jf )}jY securityfs_create_dirsbc.securityfs_create_dirasbuh1hhj%hhhj%hKubj2)}(h h]h }(hj &hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%hhhj%hKubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%hhhj%hKubj{)}(hsecurityfs_create_dirh]j)}(hj&h]hsecurityfs_create_dir}(hj)&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%&ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj%hhhj%hKubj)}(h)(const char *name, struct dentry *parent)h](j)}(hconst char *nameh](j)}(hjh]hconst}(hjD&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@&ubj2)}(h h]h }(hjQ&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@&ubj )}(hcharh]hchar}(hj_&hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj@&ubj2)}(h h]h }(hjm&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@&ubj)}(hjh]h*}(hj{&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@&ubj)}(hnameh]hname}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<&ubj)}(hstruct dentry *parenth](j)}(hjAh]hstruct}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubh)}(hhh]j)}(hdentryh]hdentry}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj&modnameN classnameNj] j` )}jc ]j&c.securityfs_create_dirasbuh1hhj&ubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hparenth]hparent}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<&ubeh}(h]h ]h"]h$]h&]jjuh1jhj%hhhj%hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj%hhhj%hKubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj%hKhj%hhubj)}(hhh]h)}(h/create a directory in the securityfs filesystemh]h/create a directory in the securityfs filesystem}(hj"'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj'hhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj%hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj:'jj:'jjjuh1jhhhj%hNhNubj)}(hX?**Parameters** ``const char *name`` a pointer to a string containing the name of the directory to create. ``struct dentry *parent`` a pointer to the parent dentry for this file. This should be a directory dentry if set. If this parameter is ``NULL``, then the directory will be created in the root of the securityfs filesystem. **Description** This function creates a directory in securityfs with the given **name**. This function returns a pointer to a dentry if it succeeds. This pointer must be passed to the securityfs_remove() function when the file is to be removed (no automatic cleanup happens if your module is unloaded, you are responsible here). If an error occurs, the function will return the error value (via ERR_PTR). If securityfs is not enabled in the kernel, the value ``-ENODEV`` is returned.h](h)}(h**Parameters**h]j)}(hjD'h]h Parameters}(hjF'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjB'ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj>'ubj )}(hhh](j)}(h[``const char *name`` a pointer to a string containing the name of the directory to create. h](j)}(h``const char *name``h]j)}(hjc'h]hconst char *name}(hje'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhja'ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj]'ubj2)}(hhh]h)}(hEa pointer to a string containing the name of the directory to create.h]hEa pointer to a string containing the name of the directory to create.}(hj|'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhjy'ubah}(h]h ]h"]h$]h&]uh1j1hj]'ubeh}(h]h ]h"]h$]h&]uh1jhjx'hKhjZ'ubj)}(h``struct dentry *parent`` a pointer to the parent dentry for this file. This should be a directory dentry if set. If this parameter is ``NULL``, then the directory will be created in the root of the securityfs filesystem. h](j)}(h``struct dentry *parent``h]j)}(hj'h]hstruct dentry *parent}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj'ubj2)}(hhh]h)}(ha pointer to the parent dentry for this file. This should be a directory dentry if set. If this parameter is ``NULL``, then the directory will be created in the root of the securityfs filesystem.h](hoa pointer to the parent dentry for this file. This should be a directory dentry if set. If this parameter is }(hj'hhhNhNubj)}(h``NULL``h]hNULL}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubhN, then the directory will be created in the root of the securityfs filesystem.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj'ubah}(h]h ]h"]h$]h&]uh1j1hj'ubeh}(h]h ]h"]h$]h&]uh1jhj'hKhjZ'ubeh}(h]h ]h"]h$]h&]uh1j hj>'ubh)}(h**Description**h]j)}(hj'h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj>'ubh)}(hHThis function creates a directory in securityfs with the given **name**.h](h?This function creates a directory in securityfs with the given }(hj(hhhNhNubj)}(h**name**h]hname}(hj (hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubh.}(hj(hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj>'ubh)}(hX=This function returns a pointer to a dentry if it succeeds. This pointer must be passed to the securityfs_remove() function when the file is to be removed (no automatic cleanup happens if your module is unloaded, you are responsible here). If an error occurs, the function will return the error value (via ERR_PTR).h]hX=This function returns a pointer to a dentry if it succeeds. This pointer must be passed to the securityfs_remove() function when the file is to be removed (no automatic cleanup happens if your module is unloaded, you are responsible here). If an error occurs, the function will return the error value (via ERR_PTR).}(hj"(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj>'ubh)}(hNIf securityfs is not enabled in the kernel, the value ``-ENODEV`` is returned.h](h6If securityfs is not enabled in the kernel, the value }(hj1(hhhNhNubj)}(h ``-ENODEV``h]h-ENODEV}(hj9(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1(ubh is returned.}(hj1(hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj>'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &securityfs_create_symlink (C function)c.securityfs_create_symlinkhNtauh1hhj%hhhNhNubj)}(hhh](j)}(hstruct dentry * securityfs_create_symlink (const char *name, struct dentry *parent, const char *target, const struct inode_operations *iops)h]j)}(hstruct dentry *securityfs_create_symlink(const char *name, struct dentry *parent, const char *target, const struct inode_operations *iops)h](j)}(hjAh]hstruct}(hjr(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn(hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjn(hhhj(hKubh)}(hhh]j)}(hdentryh]hdentry}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj(modnameN classnameNj] j` )}jc ]jf )}jY securityfs_create_symlinksbc.securityfs_create_symlinkasbuh1hhjn(hhhj(hKubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjn(hhhj(hKubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn(hhhj(hKubj{)}(hsecurityfs_create_symlinkh]j)}(hj(h]hsecurityfs_create_symlink}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjn(hhhj(hKubj)}(hb(const char *name, struct dentry *parent, const char *target, const struct inode_operations *iops)h](j)}(hconst char *nameh](j)}(hjh]hconst}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(ubj )}(hcharh]hchar}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj(ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(ubj)}(hjh]h*}(hj#)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hnameh]hname}(hj0)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubj)}(hstruct dentry *parenth](j)}(hjAh]hstruct}(hjI)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE)ubj2)}(h h]h }(hjV)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjE)ubh)}(hhh]j)}(hdentryh]hdentry}(hjg)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd)ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetji)modnameN classnameNj] j` )}jc ]j(c.securityfs_create_symlinkasbuh1hhjE)ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjE)ubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE)ubj)}(hparenth]hparent}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubj)}(hconst char *targeth](j)}(hjh]hconst}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj )}(hcharh]hchar}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(htargeth]htarget}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubj)}(h#const struct inode_operations *iopsh](j)}(hjh]hconst}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj#*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj)}(hjAh]hstruct}(hj1*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj>*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubh)}(hhh]j)}(hinode_operationsh]hinode_operations}(hjO*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL*ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjQ*modnameN classnameNj] j` )}jc ]j(c.securityfs_create_symlinkasbuh1hhj*ubj2)}(h h]h }(hjm*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj)}(hjh]h*}(hj{*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hiopsh]hiops}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubeh}(h]h ]h"]h$]h&]jjuh1jhjn(hhhj(hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjj(hhhj(hKubah}(h]je(ah ](jjeh"]h$]h&]jj)jhuh1jhj(hKhjg(hhubj)}(hhh]h)}(h-create a symlink in the securityfs filesystemh]h-create a symlink in the securityfs filesystem}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj*hhubah}(h]h ]h"]h$]h&]uh1jhjg(hhhj(hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj*jj*jjjuh1jhhhj%hNhNubj)}(hX**Parameters** ``const char *name`` a pointer to a string containing the name of the symlink to create. ``struct dentry *parent`` a pointer to the parent dentry for the symlink. This should be a directory dentry if set. If this parameter is ``NULL``, then the directory will be created in the root of the securityfs filesystem. ``const char *target`` a pointer to a string containing the name of the symlink's target. If this parameter is ``NULL``, then the **iops** parameter needs to be setup to handle .readlink and .get_link inode_operations. ``const struct inode_operations *iops`` a pointer to the struct inode_operations to use for the symlink. If this parameter is ``NULL``, then the default simple_symlink_inode operations will be used. **Description** This function creates a symlink in securityfs with the given **name**. This function returns a pointer to a dentry if it succeeds. This pointer must be passed to the securityfs_remove() function when the file is to be removed (no automatic cleanup happens if your module is unloaded, you are responsible here). If an error occurs, the function will return the error value (via ERR_PTR). If securityfs is not enabled in the kernel, the value ``-ENODEV`` is returned.h](h)}(h**Parameters**h]j)}(hj*h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj*ubj )}(hhh](j)}(hY``const char *name`` a pointer to a string containing the name of the symlink to create. h](j)}(h``const char *name``h]j)}(hj*h]hconst char *name}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj*ubj2)}(hhh]h)}(hCa pointer to a string containing the name of the symlink to create.h]hCa pointer to a string containing the name of the symlink to create.}(hj +hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj +ubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhj+hKhj*ubj)}(h``struct dentry *parent`` a pointer to the parent dentry for the symlink. This should be a directory dentry if set. If this parameter is ``NULL``, then the directory will be created in the root of the securityfs filesystem. h](j)}(h``struct dentry *parent``h]j)}(hj-+h]hstruct dentry *parent}(hj/+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj++ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj'+ubj2)}(hhh]h)}(ha pointer to the parent dentry for the symlink. This should be a directory dentry if set. If this parameter is ``NULL``, then the directory will be created in the root of the securityfs filesystem.h](hqa pointer to the parent dentry for the symlink. This should be a directory dentry if set. If this parameter is }(hjF+hhhNhNubj)}(h``NULL``h]hNULL}(hjN+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF+ubhN, then the directory will be created in the root of the securityfs filesystem.}(hjF+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhjC+ubah}(h]h ]h"]h$]h&]uh1j1hj'+ubeh}(h]h ]h"]h$]h&]uh1jhjB+hKhj*ubj)}(h``const char *target`` a pointer to a string containing the name of the symlink's target. If this parameter is ``NULL``, then the **iops** parameter needs to be setup to handle .readlink and .get_link inode_operations. h](j)}(h``const char *target``h]j)}(hjy+h]hconst char *target}(hj{+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw+ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhjs+ubj2)}(hhh]h)}(ha pointer to a string containing the name of the symlink's target. If this parameter is ``NULL``, then the **iops** parameter needs to be setup to handle .readlink and .get_link inode_operations.h](hZa pointer to a string containing the name of the symlink’s target. If this parameter is }(hj+hhhNhNubj)}(h``NULL``h]hNULL}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh , then the }(hj+hhhNhNubj)}(h**iops**h]hiops}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubhP parameter needs to be setup to handle .readlink and .get_link inode_operations.}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj+ubah}(h]h ]h"]h$]h&]uh1j1hjs+ubeh}(h]h ]h"]h$]h&]uh1jhj+hKhj*ubj)}(h``const struct inode_operations *iops`` a pointer to the struct inode_operations to use for the symlink. If this parameter is ``NULL``, then the default simple_symlink_inode operations will be used. h](j)}(h'``const struct inode_operations *iops``h]j)}(hj+h]h#const struct inode_operations *iops}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj+ubj2)}(hhh]h)}(ha pointer to the struct inode_operations to use for the symlink. If this parameter is ``NULL``, then the default simple_symlink_inode operations will be used.h](hVa pointer to the struct inode_operations to use for the symlink. If this parameter is }(hj+hhhNhNubj)}(h``NULL``h]hNULL}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh@, then the default simple_symlink_inode operations will be used.}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj+ubah}(h]h ]h"]h$]h&]uh1j1hj+ubeh}(h]h ]h"]h$]h&]uh1jhj+hKhj*ubeh}(h]h ]h"]h$]h&]uh1j hj*ubh)}(h**Description**h]j)}(hj%,h]h Description}(hj',hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#,ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj*ubh)}(hFThis function creates a symlink in securityfs with the given **name**.h](h=This function creates a symlink in securityfs with the given }(hj;,hhhNhNubj)}(h**name**h]hname}(hjC,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;,ubh.}(hj;,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj*ubh)}(hX=This function returns a pointer to a dentry if it succeeds. This pointer must be passed to the securityfs_remove() function when the file is to be removed (no automatic cleanup happens if your module is unloaded, you are responsible here). If an error occurs, the function will return the error value (via ERR_PTR).h]hX=This function returns a pointer to a dentry if it succeeds. This pointer must be passed to the securityfs_remove() function when the file is to be removed (no automatic cleanup happens if your module is unloaded, you are responsible here). If an error occurs, the function will return the error value (via ERR_PTR).}(hj\,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj*ubh)}(hNIf securityfs is not enabled in the kernel, the value ``-ENODEV`` is returned.h](h6If securityfs is not enabled in the kernel, the value }(hjk,hhhNhNubj)}(h ``-ENODEV``h]h-ENODEV}(hjs,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk,ubh is returned.}(hjk,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chKhj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j securityfs_remove (C function)c.securityfs_removehNtauh1hhj%hhhNhNubj)}(hhh](j)}(h.void securityfs_remove (struct dentry *dentry)h]j)}(h-void securityfs_remove(struct dentry *dentry)h](j )}(hvoidh]hvoid}(hj,hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj,hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chMubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,hhhj,hMubj{)}(hsecurityfs_removeh]j)}(hsecurityfs_removeh]hsecurityfs_remove}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj,hhhj,hMubj)}(h(struct dentry *dentry)h]j)}(hstruct dentry *dentryh](j)}(hjAh]hstruct}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubh)}(hhh]j)}(hdentryh]hdentry}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj -modnameN classnameNj] j` )}jc ]jf )}jY j,sbc.securityfs_removeasbuh1hhj,ubj2)}(h h]h }(hj'-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubj)}(hjh]h*}(hj5-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(hdentryh]hdentry}(hjB-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj,ubah}(h]h ]h"]h$]h&]jjuh1jhj,hhhj,hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj,hhhj,hMubah}(h]j,ah ](jjeh"]h$]h&]jj)jhuh1jhj,hMhj,hhubj)}(hhh]h)}(h:removes a file or directory from the securityfs filesystemh]h:removes a file or directory from the securityfs filesystem}(hjl-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chMhji-hhubah}(h]h ]h"]h$]h&]uh1jhj,hhhj,hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj-jj-jjjuh1jhhhj%hNhNubj)}(hX^**Parameters** ``struct dentry *dentry`` a pointer to a the dentry of the file or directory to be removed. **Description** This function removes a file or directory in securityfs that was previously created with a call to another securityfs function (like securityfs_create_file() or variants thereof.) This function is required to be called in order for the file to be removed. No automatic cleanup of files will happen when a module is removed; you are responsible here. AV: when applied to directory it will take all children out; no need to call it for descendents if ancestor is getting killed.h](h)}(h**Parameters**h]j)}(hj-h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chM hj-ubj )}(hhh]j)}(h\``struct dentry *dentry`` a pointer to a the dentry of the file or directory to be removed. h](j)}(h``struct dentry *dentry``h]j)}(hj-h]hstruct dentry *dentry}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chMhj-ubj2)}(hhh]h)}(hAa pointer to a the dentry of the file or directory to be removed.h]hAa pointer to a the dentry of the file or directory to be removed.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1j1hj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1j hj-ubh)}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chM hj-ubh)}(hThis function removes a file or directory in securityfs that was previously created with a call to another securityfs function (like securityfs_create_file() or variants thereof.)h]hThis function removes a file or directory in securityfs that was previously created with a call to another securityfs function (like securityfs_create_file() or variants thereof.)}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chMhj-ubh)}(hThis function is required to be called in order for the file to be removed. No automatic cleanup of files will happen when a module is removed; you are responsible here.h]hThis function is required to be called in order for the file to be removed. No automatic cleanup of files will happen when a module is removed; you are responsible here.}(hj .hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chM#hj-ubh)}(h~AV: when applied to directory it will take all children out; no need to call it for descendents if ancestor is getting killed.h]h~AV: when applied to directory it will take all children out; no need to call it for descendents if ancestor is getting killed.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:286: ./security/inode.chM'hj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj%hhhNhNubeh}(h]security-frameworkah ]h"]security frameworkah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hAudit Interfacesh]hAudit Interfaces}(hj=.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:.hhhhhM"ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_log_start (C function)c.audit_log_starthNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h[struct audit_buffer * audit_log_start (struct audit_context *ctx, gfp_t gfp_mask, int type)h]j)}(hYstruct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type)h](j)}(hjAh]hstruct}(hjd.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`.hhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMkubj2)}(h h]h }(hjr.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`.hhhjq.hMkubh)}(hhh]j)}(h audit_bufferh]h audit_buffer}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj.modnameN classnameNj] j` )}jc ]jf )}jY audit_log_startsbc.audit_log_startasbuh1hhj`.hhhjq.hMkubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`.hhhjq.hMkubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`.hhhjq.hMkubj{)}(haudit_log_starth]j)}(hj.h]haudit_log_start}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj`.hhhjq.hMkubj)}(h5(struct audit_context *ctx, gfp_t gfp_mask, int type)h](j)}(hstruct audit_context *ctxh](j)}(hjAh]hstruct}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubh)}(hhh]j)}(h audit_contexth]h audit_context}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj.modnameN classnameNj] j` )}jc ]j.c.audit_log_startasbuh1hhj.ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hjh]h*}(hj(/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hctxh]hctx}(hj5/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj.ubj)}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjQ/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN/ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjS/modnameN classnameNj] j` )}jc ]j.c.audit_log_startasbuh1hhjJ/ubj2)}(h h]h }(hjo/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJ/ubj)}(hgfp_maskh]hgfp_mask}(hj}/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj.ubj)}(hint typeh](j )}(hinth]hint}(hj/hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj/ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(htypeh]htype}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj.ubeh}(h]h ]h"]h$]h&]jjuh1jhj`.hhhjq.hMkubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj\.hhhjq.hMkubah}(h]jW.ah ](jjeh"]h$]h&]jj)jhuh1jhjq.hMkhjY.hhubj)}(hhh]h)}(hobtain an audit bufferh]hobtain an audit buffer}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMkhj/hhubah}(h]h ]h"]h$]h&]uh1jhjY.hhhjq.hMkubeh}(h]h ](jfunctioneh"]h$]h&]jjjj/jj/jjjuh1jhhhj:.hNhNubj)}(hXV**Parameters** ``struct audit_context *ctx`` audit_context (may be NULL) ``gfp_t gfp_mask`` type of allocation ``int type`` audit message type **Description** Returns audit_buffer pointer on success or NULL on error. Obtain an audit buffer. This routine does locking to obtain the audit buffer, but then no locking is required for calls to audit_log_*format. If the task (ctx) is a task that is currently in a syscall, then the syscall is marked as auditable and an audit record will be written at syscall exit. If there is no associated task, then task context (ctx) should be NULL.h](h)}(h**Parameters**h]j)}(hj/h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMohj/ubj )}(hhh](j)}(h:``struct audit_context *ctx`` audit_context (may be NULL) h](j)}(h``struct audit_context *ctx``h]j)}(hj0h]hstruct audit_context *ctx}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMlhj0ubj2)}(hhh]h)}(haudit_context (may be NULL)h]haudit_context (may be NULL)}(hj60hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj20hMlhj30ubah}(h]h ]h"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]uh1jhj20hMlhj0ubj)}(h&``gfp_t gfp_mask`` type of allocation h](j)}(h``gfp_t gfp_mask``h]j)}(hjV0h]hgfp_t gfp_mask}(hjX0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT0ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMmhjP0ubj2)}(hhh]h)}(htype of allocationh]htype of allocation}(hjo0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjk0hMmhjl0ubah}(h]h ]h"]h$]h&]uh1j1hjP0ubeh}(h]h ]h"]h$]h&]uh1jhjk0hMmhj0ubj)}(h ``int type`` audit message type h](j)}(h ``int type``h]j)}(hj0h]hint type}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMnhj0ubj2)}(hhh]h)}(haudit message typeh]haudit message type}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMnhj0ubah}(h]h ]h"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]uh1jhj0hMnhj0ubeh}(h]h ]h"]h$]h&]uh1j hj/ubh)}(h**Description**h]j)}(hj0h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMphj/ubh)}(h9Returns audit_buffer pointer on success or NULL on error.h]h9Returns audit_buffer pointer on success or NULL on error.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMohj/ubh)}(hXqObtain an audit buffer. This routine does locking to obtain the audit buffer, but then no locking is required for calls to audit_log_*format. If the task (ctx) is a task that is currently in a syscall, then the syscall is marked as auditable and an audit record will be written at syscall exit. If there is no associated task, then task context (ctx) should be NULL.h]hXqObtain an audit buffer. This routine does locking to obtain the audit buffer, but then no locking is required for calls to audit_log_*format. If the task (ctx) is a task that is currently in a syscall, then the syscall is marked as auditable and an audit record will be written at syscall exit. If there is no associated task, then task context (ctx) should be NULL.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMqhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_log_format (C function)c.audit_log_formathNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hEvoid audit_log_format (struct audit_buffer *ab, const char *fmt, ...)h]j)}(hDvoid audit_log_format(struct audit_buffer *ab, const char *fmt, ...)h](j )}(hvoidh]hvoid}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj1hhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMubj2)}(h h]h }(hj-1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1hhhj,1hMubj{)}(haudit_log_formath]j)}(haudit_log_formath]haudit_log_format}(hj?1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;1ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj1hhhj,1hMubj)}(h/(struct audit_buffer *ab, const char *fmt, ...)h](j)}(hstruct audit_buffer *abh](j)}(hjAh]hstruct}(hj[1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjW1ubj2)}(h h]h }(hjh1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjW1ubh)}(hhh]j)}(h audit_bufferh]h audit_buffer}(hjy1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv1ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj{1modnameN classnameNj] j` )}jc ]jf )}jY jA1sbc.audit_log_formatasbuh1hhjW1ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjW1ubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjW1ubj)}(habh]hab}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjW1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjS1ubj)}(hconst char *fmth](j)}(hjh]hconst}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1ubj )}(hcharh]hchar}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj1ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1ubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(hfmth]hfmt}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjS1ubj)}(h...h]j)}(hjh]h...}(hj*2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&2ubah}(h]h ]h"]h$]h&]noemphjjuh1jhjS1ubeh}(h]h ]h"]h$]h&]jjuh1jhj1hhhj,1hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj1hhhj,1hMubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1jhj,1hMhj1hhubj)}(hhh]h)}(h'format a message into the audit buffer.h]h'format a message into the audit buffer.}(hjS2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhjP2hhubah}(h]h ]h"]h$]h&]uh1jhj1hhhj,1hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjk2jjk2jjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``struct audit_buffer *ab`` audit_buffer ``const char *fmt`` format string ``...`` optional parameters matching **fmt** string **Description** All the work is done in audit_log_vformat.h](h)}(h**Parameters**h]j)}(hju2h]h Parameters}(hjw2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs2ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhjo2ubj )}(hhh](j)}(h)``struct audit_buffer *ab`` audit_buffer h](j)}(h``struct audit_buffer *ab``h]j)}(hj2h]hstruct audit_buffer *ab}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhj2ubj2)}(hhh]h)}(h audit_bufferh]h audit_buffer}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhj2hMhj2ubj)}(h"``const char *fmt`` format string h](j)}(h``const char *fmt``h]j)}(hj2h]hconst char *fmt}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhj2ubj2)}(hhh]h)}(h format stringh]h format string}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhj2hMhj2ubj)}(h4``...`` optional parameters matching **fmt** string h](j)}(h``...``h]j)}(hj3h]h...}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhj3ubj2)}(hhh]h)}(h+optional parameters matching **fmt** stringh](hoptional parameters matching }(hj3hhhNhNubj)}(h**fmt**h]hfmt}(hj'3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh string}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hMhj2ubeh}(h]h ]h"]h$]h&]uh1j hjo2ubh)}(h**Description**h]j)}(hjS3h]h Description}(hjU3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ3ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hjo2ubh)}(h*All the work is done in audit_log_vformat.h]h*All the work is done in audit_log_vformat.}(hji3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhjo2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_log_subj_ctx (C function)c.audit_log_subj_ctxhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hGint audit_log_subj_ctx (struct audit_buffer *ab, struct lsm_prop *prop)h]j)}(hFint audit_log_subj_ctx(struct audit_buffer *ab, struct lsm_prop *prop)h](j )}(hinth]hint}(hj3hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj3hhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3hhhj3hMubj{)}(haudit_log_subj_ctxh]j)}(haudit_log_subj_ctxh]haudit_log_subj_ctx}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj3hhhj3hMubj)}(h0(struct audit_buffer *ab, struct lsm_prop *prop)h](j)}(hstruct audit_buffer *abh](j)}(hjAh]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubh)}(hhh]j)}(h audit_bufferh]h audit_buffer}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj3modnameN classnameNj] j` )}jc ]jf )}jY j3sbc.audit_log_subj_ctxasbuh1hhj3ubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj)}(hjh]h*}(hj!4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj)}(habh]hab}(hj.4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubj)}(hstruct lsm_prop *proph](j)}(hjAh]hstruct}(hjG4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC4ubj2)}(h h]h }(hjT4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjC4ubh)}(hhh]j)}(hlsm_proph]hlsm_prop}(hje4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb4ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjg4modnameN classnameNj] j` )}jc ]j4c.audit_log_subj_ctxasbuh1hhjC4ubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjC4ubj)}(hjh]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC4ubj)}(hproph]hprop}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubeh}(h]h ]h"]h$]h&]jjuh1jhj3hhhj3hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj3hhhj3hMubah}(h]j3ah ](jjeh"]h$]h&]jj)jhuh1jhj3hMhj3hhubj)}(hhh]h)}(hAdd LSM subject informationh]hAdd LSM subject information}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhj4hhubah}(h]h ]h"]h$]h&]uh1jhj3hhhj3hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4jj4jjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``struct audit_buffer *ab`` audit_buffer ``struct lsm_prop *prop`` LSM subject properties. **Description** Add a subj= field and, if necessary, a AUDIT_MAC_TASK_CONTEXTS record.h](h)}(h**Parameters**h]j)}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhj4ubj )}(hhh](j)}(h)``struct audit_buffer *ab`` audit_buffer h](j)}(h``struct audit_buffer *ab``h]j)}(hj 5h]hstruct audit_buffer *ab}(hj 5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhj5ubj2)}(hhh]h)}(h audit_bufferh]h audit_buffer}(hj"5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMhj5ubah}(h]h ]h"]h$]h&]uh1j1hj5ubeh}(h]h ]h"]h$]h&]uh1jhj5hMhj5ubj)}(h2``struct lsm_prop *prop`` LSM subject properties. h](j)}(h``struct lsm_prop *prop``h]j)}(hjB5h]hstruct lsm_prop *prop}(hjD5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@5ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhj<5ubj2)}(hhh]h)}(hLSM subject properties.h]hLSM subject properties.}(hj[5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjW5hMhjX5ubah}(h]h ]h"]h$]h&]uh1j1hj<5ubeh}(h]h ]h"]h$]h&]uh1jhjW5hMhj5ubeh}(h]h ]h"]h$]h&]uh1j hj4ubh)}(h**Description**h]j)}(hj}5h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{5ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhj4ubh)}(hFAdd a subj= field and, if necessary, a AUDIT_MAC_TASK_CONTEXTS record.h]hFAdd a subj= field and, if necessary, a AUDIT_MAC_TASK_CONTEXTS record.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chMhj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_log_end (C function)c.audit_log_endhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h,void audit_log_end (struct audit_buffer *ab)h]j)}(h+void audit_log_end(struct audit_buffer *ab)h](j )}(hvoidh]hvoid}(hj5hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5hhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM ubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5hhhj5hM ubj{)}(h audit_log_endh]j)}(h audit_log_endh]h audit_log_end}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj5hhhj5hM ubj)}(h(struct audit_buffer *ab)h]j)}(hstruct audit_buffer *abh](j)}(hjAh]hstruct}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hj 6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubh)}(hhh]j)}(h audit_bufferh]h audit_buffer}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj6modnameN classnameNj] j` )}jc ]jf )}jY j5sbc.audit_log_endasbuh1hhj5ubj2)}(h h]h }(hj=6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hjh]h*}(hjK6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(habh]hab}(hjX6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubah}(h]h ]h"]h$]h&]jjuh1jhj5hhhj5hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj5hhhj5hM ubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1jhj5hM hj5hhubj)}(hhh]h)}(hend one audit recordh]hend one audit record}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj6hhubah}(h]h ]h"]h$]h&]uh1jhj5hhhj5hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj6jj6jjjuh1jhhhj:.hNhNubj)}(hX^**Parameters** ``struct audit_buffer *ab`` the audit_buffer **Description** We can not do a netlink send inside an irq context because it blocks (last arg, flags, is not set to MSG_DONTWAIT), so the audit buffer is placed on a queue and a kthread is scheduled to remove them from the queue outside the irq context. May be called in any context.h](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj6ubj )}(hhh]j)}(h-``struct audit_buffer *ab`` the audit_buffer h](j)}(h``struct audit_buffer *ab``h]j)}(hj6h]hstruct audit_buffer *ab}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj6ubj2)}(hhh]h)}(hthe audit_bufferh]hthe audit_buffer}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hM hj6ubah}(h]h ]h"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]uh1jhj6hM hj6ubah}(h]h ]h"]h$]h&]uh1j hj6ubh)}(h**Description**h]j)}(hj6h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj6ubh)}(hX We can not do a netlink send inside an irq context because it blocks (last arg, flags, is not set to MSG_DONTWAIT), so the audit buffer is placed on a queue and a kthread is scheduled to remove them from the queue outside the irq context. May be called in any context.h]hX We can not do a netlink send inside an irq context because it blocks (last arg, flags, is not set to MSG_DONTWAIT), so the audit buffer is placed on a queue and a kthread is scheduled to remove them from the queue outside the irq context. May be called in any context.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_log (C function) c.audit_loghNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hZvoid audit_log (struct audit_context *ctx, gfp_t gfp_mask, int type, const char *fmt, ...)h]j)}(hYvoid audit_log(struct audit_context *ctx, gfp_t gfp_mask, int type, const char *fmt, ...)h](j )}(hvoidh]hvoid}(hjC7hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj?7hhhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM ubj2)}(h h]h }(hjR7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?7hhhjQ7hM ubj{)}(h audit_logh]j)}(h audit_logh]h audit_log}(hjd7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`7ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj?7hhhjQ7hM ubj)}(hK(struct audit_context *ctx, gfp_t gfp_mask, int type, const char *fmt, ...)h](j)}(hstruct audit_context *ctxh](j)}(hjAh]hstruct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|7ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|7ubh)}(hhh]j)}(h audit_contexth]h audit_context}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7modnameN classnameNj] j` )}jc ]jf )}jY jf7sb c.audit_logasbuh1hhj|7ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|7ubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|7ubj)}(hctxh]hctx}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjx7ubj)}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7modnameN classnameNj] j` )}jc ]j7 c.audit_logasbuh1hhj7ubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7ubj)}(hgfp_maskh]hgfp_mask}(hj!8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjx7ubj)}(hint typeh](j )}(hinth]hint}(hj:8hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj68ubj2)}(h h]h }(hjH8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj68ubj)}(htypeh]htype}(hjV8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj68ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjx7ubj)}(hconst char *fmth](j)}(hjh]hconst}(hjo8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk8ubj2)}(h h]h }(hj|8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjk8ubj )}(hcharh]hchar}(hj8hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjk8ubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjk8ubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk8ubj)}(hfmth]hfmt}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjx7ubj)}(h...h]j)}(hjh]h...}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]noemphjjuh1jhjx7ubeh}(h]h ]h"]h$]h&]jjuh1jhj?7hhhjQ7hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj;7hhhjQ7hM ubah}(h]j67ah ](jjeh"]h$]h&]jj)jhuh1jhjQ7hM hj87hhubj)}(hhh]h)}(hLog an audit recordh]hLog an audit record}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj8hhubah}(h]h ]h"]h$]h&]uh1jhj87hhhjQ7hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj 9jj 9jjjuh1jhhhj:.hNhNubj)}(hX**Parameters** ``struct audit_context *ctx`` audit context ``gfp_t gfp_mask`` type of allocation ``int type`` audit message type ``const char *fmt`` format string to use ``...`` variable parameters matching the format string **Description** This is a convenience function that calls audit_log_start, audit_log_vformat, and audit_log_end. It may be called in any context.h](h)}(h**Parameters**h]j)}(hj9h]h Parameters}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj9ubj )}(hhh](j)}(h,``struct audit_context *ctx`` audit context h](j)}(h``struct audit_context *ctx``h]j)}(hj69h]hstruct audit_context *ctx}(hj89hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj49ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj09ubj2)}(hhh]h)}(h audit contexth]h audit context}(hjO9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjK9hM hjL9ubah}(h]h ]h"]h$]h&]uh1j1hj09ubeh}(h]h ]h"]h$]h&]uh1jhjK9hM hj-9ubj)}(h&``gfp_t gfp_mask`` type of allocation h](j)}(h``gfp_t gfp_mask``h]j)}(hjo9h]hgfp_t gfp_mask}(hjq9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm9ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hji9ubj2)}(hhh]h)}(htype of allocationh]htype of allocation}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hM hj9ubah}(h]h ]h"]h$]h&]uh1j1hji9ubeh}(h]h ]h"]h$]h&]uh1jhj9hM hj-9ubj)}(h ``int type`` audit message type h](j)}(h ``int type``h]j)}(hj9h]hint type}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj9ubj2)}(hhh]h)}(haudit message typeh]haudit message type}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hM hj9ubah}(h]h ]h"]h$]h&]uh1j1hj9ubeh}(h]h ]h"]h$]h&]uh1jhj9hM hj-9ubj)}(h)``const char *fmt`` format string to use h](j)}(h``const char *fmt``h]j)}(hj9h]hconst char *fmt}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj9ubj2)}(hhh]h)}(hformat string to useh]hformat string to use}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hM hj9ubah}(h]h ]h"]h$]h&]uh1j1hj9ubeh}(h]h ]h"]h$]h&]uh1jhj9hM hj-9ubj)}(h7``...`` variable parameters matching the format string h](j)}(h``...``h]j)}(hj:h]h...}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj:ubj2)}(hhh]h)}(h.variable parameters matching the format stringh]h.variable parameters matching the format string}(hj3:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/:hM hj0:ubah}(h]h ]h"]h$]h&]uh1j1hj:ubeh}(h]h ]h"]h$]h&]uh1jhj/:hM hj-9ubeh}(h]h ]h"]h$]h&]uh1j hj9ubh)}(h**Description**h]j)}(hjU:h]h Description}(hjW:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS:ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj9ubh)}(hThis is a convenience function that calls audit_log_start, audit_log_vformat, and audit_log_end. It may be called in any context.h]hThis is a convenience function that calls audit_log_start, audit_log_vformat, and audit_log_end. It may be called in any context.}(hjk:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:292: ./kernel/audit.chM hj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_filter_op (C function)c.__audit_filter_ophNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hint __audit_filter_op (struct task_struct *tsk, struct audit_context *ctx, struct list_head *list, struct audit_names *name, unsigned long op)h]j)}(hint __audit_filter_op(struct task_struct *tsk, struct audit_context *ctx, struct list_head *list, struct audit_names *name, unsigned long op)h](j )}(hinth]hint}(hj:hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj:hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM.ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:hhhj:hM.ubj{)}(h__audit_filter_oph]j)}(h__audit_filter_oph]h__audit_filter_op}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj:hhhj:hM.ubj)}(hx(struct task_struct *tsk, struct audit_context *ctx, struct list_head *list, struct audit_names *name, unsigned long op)h](j)}(hstruct task_struct *tskh](j)}(hjAh]hstruct}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubh)}(hhh]j)}(h task_structh]h task_struct}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj:modnameN classnameNj] j` )}jc ]jf )}jY j:sbc.__audit_filter_opasbuh1hhj:ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(hjh]h*}(hj#;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(htskh]htsk}(hj0;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hstruct audit_context *ctxh](j)}(hjAh]hstruct}(hjI;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE;ubj2)}(h h]h }(hjV;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjE;ubh)}(hhh]j)}(h audit_contexth]h audit_context}(hjg;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd;ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetji;modnameN classnameNj] j` )}jc ]j;c.__audit_filter_opasbuh1hhjE;ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjE;ubj)}(hjh]h*}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE;ubj)}(hctxh]hctx}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE;ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hstruct list_head *listh](j)}(hjAh]hstruct}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;ubh)}(hhh]j)}(h list_headh]h list_head}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj;modnameN classnameNj] j` )}jc ]j;c.__audit_filter_opasbuh1hhj;ubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(hlisth]hlist}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hstruct audit_names *nameh](j)}(hjAh]hstruct}(hj)<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%<ubj2)}(h h]h }(hj6<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%<ubh)}(hhh]j)}(h audit_namesh]h audit_names}(hjG<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD<ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjI<modnameN classnameNj] j` )}jc ]j;c.__audit_filter_opasbuh1hhj%<ubj2)}(h h]h }(hje<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%<ubj)}(hjh]h*}(hjs<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%<ubj)}(hnameh]hname}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubj)}(hunsigned long oph](j )}(hunsignedh]hunsigned}(hj<hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj<ubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubj )}(hlongh]hlong}(hj<hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj<ubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubj)}(hoph]hop}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubeh}(h]h ]h"]h$]h&]jjuh1jhj:hhhj:hM.ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj:hhhj:hM.ubah}(h]j:ah ](jjeh"]h$]h&]jj)jhuh1jhj:hM.hj:hhubj)}(hhh]h)}(h7common filter helper for operations (syscall/uring/etc)h]h7common filter helper for operations (syscall/uring/etc)}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM.hj<hhubah}(h]h ]h"]h$]h&]uh1jhj:hhhj:hM.ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj=jj=jjjuh1jhhhj:.hNhNubj)}(hXq**Parameters** ``struct task_struct *tsk`` associated task ``struct audit_context *ctx`` audit context ``struct list_head *list`` audit filter list ``struct audit_names *name`` audit_name (can be NULL) ``unsigned long op`` current syscall/uring_op **Description** Run the udit filters specified in **list** against **tsk** using **ctx**, **name**, and **op**, as necessary; the caller is responsible for ensuring that the call is made while the RCU read lock is held. The **name** parameter can be NULL, but all others must be specified. Returns 1/true if the filter finds a match, 0/false if none are found.h](h)}(h**Parameters**h]j)}(hj=h]h Parameters}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM2hj=ubj )}(hhh](j)}(h,``struct task_struct *tsk`` associated task h](j)}(h``struct task_struct *tsk``h]j)}(hj<=h]hstruct task_struct *tsk}(hj>=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:=ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM/hj6=ubj2)}(hhh]h)}(hassociated taskh]hassociated task}(hjU=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ=hM/hjR=ubah}(h]h ]h"]h$]h&]uh1j1hj6=ubeh}(h]h ]h"]h$]h&]uh1jhjQ=hM/hj3=ubj)}(h,``struct audit_context *ctx`` audit context h](j)}(h``struct audit_context *ctx``h]j)}(hju=h]hstruct audit_context *ctx}(hjw=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs=ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM0hjo=ubj2)}(hhh]h)}(h audit contexth]h audit context}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM0hj=ubah}(h]h ]h"]h$]h&]uh1j1hjo=ubeh}(h]h ]h"]h$]h&]uh1jhj=hM0hj3=ubj)}(h-``struct list_head *list`` audit filter list h](j)}(h``struct list_head *list``h]j)}(hj=h]hstruct list_head *list}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM1hj=ubj2)}(hhh]h)}(haudit filter listh]haudit filter list}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM1hj=ubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hM1hj3=ubj)}(h6``struct audit_names *name`` audit_name (can be NULL) h](j)}(h``struct audit_names *name``h]j)}(hj=h]hstruct audit_names *name}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM2hj=ubj2)}(hhh]h)}(haudit_name (can be NULL)h]haudit_name (can be NULL)}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM2hj=ubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hM2hj3=ubj)}(h.``unsigned long op`` current syscall/uring_op h](j)}(h``unsigned long op``h]j)}(hj >h]hunsigned long op}(hj">hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM3hj>ubj2)}(hhh]h)}(hcurrent syscall/uring_oph]hcurrent syscall/uring_op}(hj9>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5>hM3hj6>ubah}(h]h ]h"]h$]h&]uh1j1hj>ubeh}(h]h ]h"]h$]h&]uh1jhj5>hM3hj3=ubeh}(h]h ]h"]h$]h&]uh1j hj=ubh)}(h**Description**h]j)}(hj[>h]h Description}(hj]>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY>ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM5hj=ubh)}(hXXRun the udit filters specified in **list** against **tsk** using **ctx**, **name**, and **op**, as necessary; the caller is responsible for ensuring that the call is made while the RCU read lock is held. The **name** parameter can be NULL, but all others must be specified. Returns 1/true if the filter finds a match, 0/false if none are found.h](h"Run the udit filters specified in }(hjq>hhhNhNubj)}(h**list**h]hlist}(hjy>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq>ubh against }(hjq>hhhNhNubj)}(h**tsk**h]htsk}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq>ubh using }(hjq>hhhNhNubj)}(h**ctx**h]hctx}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq>ubh, }(hjq>hhhNhNubj)}(h**name**h]hname}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq>ubh, and }(hjq>hhhNhNubj)}(h**op**h]hop}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq>ubhr, as necessary; the caller is responsible for ensuring that the call is made while the RCU read lock is held. The }(hjq>hhhNhNubj)}(h**name**h]hname}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq>ubh parameter can be NULL, but all others must be specified. Returns 1/true if the filter finds a match, 0/false if none are found.}(hjq>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM4hj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_filter_uring (C function)c.audit_filter_uringhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hLvoid audit_filter_uring (struct task_struct *tsk, struct audit_context *ctx)h]j)}(hKvoid audit_filter_uring(struct task_struct *tsk, struct audit_context *ctx)h](j )}(hvoidh]hvoid}(hj ?hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj?hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMPubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?hhhj?hMPubj{)}(haudit_filter_uringh]j)}(haudit_filter_uringh]haudit_filter_uring}(hj-?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)?ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj?hhhj?hMPubj)}(h4(struct task_struct *tsk, struct audit_context *ctx)h](j)}(hstruct task_struct *tskh](j)}(hjAh]hstruct}(hjI?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE?ubj2)}(h h]h }(hjV?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjE?ubh)}(hhh]j)}(h task_structh]h task_struct}(hjg?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd?ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetji?modnameN classnameNj] j` )}jc ]jf )}jY j/?sbc.audit_filter_uringasbuh1hhjE?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjE?ubj)}(hjh]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE?ubj)}(htskh]htsk}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjA?ubj)}(hstruct audit_context *ctxh](j)}(hjAh]hstruct}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubh)}(hhh]j)}(h audit_contexth]h audit_context}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj?modnameN classnameNj] j` )}jc ]j?c.audit_filter_uringasbuh1hhj?ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?ubj)}(hjh]h*}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hctxh]hctx}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjA?ubeh}(h]h ]h"]h$]h&]jjuh1jhj?hhhj?hMPubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj?hhhj?hMPubah}(h]j>ah ](jjeh"]h$]h&]jj)jhuh1jhj?hMPhj?hhubj)}(hhh]h)}(h&apply filters to an io_uring operationh]h&apply filters to an io_uring operation}(hj<@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMPhj9@hhubah}(h]h ]h"]h$]h&]uh1jhj?hhhj?hMPubeh}(h]h ](jfunctioneh"]h$]h&]jjjjT@jjT@jjjuh1jhhhj:.hNhNubj)}(hl**Parameters** ``struct task_struct *tsk`` associated task ``struct audit_context *ctx`` audit contexth](h)}(h**Parameters**h]j)}(hj^@h]h Parameters}(hj`@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\@ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMThjX@ubj )}(hhh](j)}(h,``struct task_struct *tsk`` associated task h](j)}(h``struct task_struct *tsk``h]j)}(hj}@h]hstruct task_struct *tsk}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{@ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMQhjw@ubj2)}(hhh]h)}(hassociated taskh]hassociated task}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMQhj@ubah}(h]h ]h"]h$]h&]uh1j1hjw@ubeh}(h]h ]h"]h$]h&]uh1jhj@hMQhjt@ubj)}(h+``struct audit_context *ctx`` audit contexth](j)}(h``struct audit_context *ctx``h]j)}(hj@h]hstruct audit_context *ctx}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMShj@ubj2)}(hhh]h)}(h audit contexth]h audit context}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMRhj@ubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hMShjt@ubeh}(h]h ]h"]h$]h&]uh1j hjX@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  audit_reset_context (C function)c.audit_reset_contexthNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h4void audit_reset_context (struct audit_context *ctx)h]j)}(h3void audit_reset_context(struct audit_context *ctx)h](j )}(hvoidh]hvoid}(hjAhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj AhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj AhhhjAhMubj{)}(haudit_reset_contexth]j)}(haudit_reset_contexth]haudit_reset_context}(hj1AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-Aubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj AhhhjAhMubj)}(h(struct audit_context *ctx)h]j)}(hstruct audit_context *ctxh](j)}(hjAh]hstruct}(hjMAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIAubj2)}(h h]h }(hjZAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIAubh)}(hhh]j)}(h audit_contexth]h audit_context}(hjkAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhAubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmAmodnameN classnameNj] j` )}jc ]jf )}jY j3Asbc.audit_reset_contextasbuh1hhjIAubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIAubj)}(hjh]h*}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIAubj)}(hctxh]hctx}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEAubah}(h]h ]h"]h$]h&]jjuh1jhj AhhhjAhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjAhhhjAhMubah}(h]jAah ](jjeh"]h$]h&]jj)jhuh1jhjAhMhjAhhubj)}(hhh]h)}(hreset a audit_context structureh]hreset a audit_context structure}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjAhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjAhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjAjjAjjjuh1jhhhj:.hNhNubj)}(hX{**Parameters** ``struct audit_context *ctx`` the audit_context to reset **Description** All fields in the audit_context will be reset to an initial state, all references held by fields will be dropped, and private memory will be released. When this function returns the audit_context will be suitable for reuse, so long as the passed context is not NULL or a dummy context.h](h)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjAubj )}(hhh]j)}(h9``struct audit_context *ctx`` the audit_context to reset h](j)}(h``struct audit_context *ctx``h]j)}(hjBh]hstruct audit_context *ctx}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhj Bubj2)}(hhh]h)}(hthe audit_context to reseth]hthe audit_context to reset}(hj*BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&BhMhj'Bubah}(h]h ]h"]h$]h&]uh1j1hj Bubeh}(h]h ]h"]h$]h&]uh1jhj&BhMhjBubah}(h]h ]h"]h$]h&]uh1j hjAubh)}(h**Description**h]j)}(hjLBh]h Description}(hjNBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJBubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjAubh)}(hXAll fields in the audit_context will be reset to an initial state, all references held by fields will be dropped, and private memory will be released. When this function returns the audit_context will be suitable for reuse, so long as the passed context is not NULL or a dummy context.h]hXAll fields in the audit_context will be reset to an initial state, all references held by fields will be dropped, and private memory will be released. When this function returns the audit_context will be suitable for reuse, so long as the passed context is not NULL or a dummy context.}(hjbBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_alloc (C function) c.audit_allochNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h)int audit_alloc (struct task_struct *tsk)h]j)}(h(int audit_alloc(struct task_struct *tsk)h](j )}(hinth]hint}(hjBhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBhhhjBhMubj{)}(h audit_alloch]j)}(h audit_alloch]h audit_alloc}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjBhhhjBhMubj)}(h(struct task_struct *tsk)h]j)}(hstruct task_struct *tskh](j)}(hjAh]hstruct}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubh)}(hhh]j)}(h task_structh]h task_struct}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjBmodnameN classnameNj] j` )}jc ]jf )}jY jBsb c.audit_allocasbuh1hhjBubj2)}(h h]h }(hj ChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(htskh]htsk}(hj'ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubah}(h]h ]h"]h$]h&]jjuh1jhjBhhhjBhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjBhhhjBhMubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jhjBhMhjBhhubj)}(hhh]h)}(h*allocate an audit context block for a taskh]h*allocate an audit context block for a task}(hjQChhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjNChhubah}(h]h ]h"]h$]h&]uh1jhjBhhhjBhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjiCjjiCjjjuh1jhhhj:.hNhNubj)}(hX**Parameters** ``struct task_struct *tsk`` task **Description** Filter on the task information and allocate a per-task audit context if necessary. Doing so turns on system call auditing for the specified task. This is called from copy_process, so no lock is needed.h](h)}(h**Parameters**h]j)}(hjsCh]h Parameters}(hjuChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqCubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjmCubj )}(hhh]j)}(h!``struct task_struct *tsk`` task h](j)}(h``struct task_struct *tsk``h]j)}(hjCh]hstruct task_struct *tsk}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjCubj2)}(hhh]h)}(htaskh]htask}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMhjCubah}(h]h ]h"]h$]h&]uh1j1hjCubeh}(h]h ]h"]h$]h&]uh1jhjChMhjCubah}(h]h ]h"]h$]h&]uh1j hjmCubh)}(h**Description**h]j)}(hjCh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjmCubh)}(hFilter on the task information and allocate a per-task audit context if necessary. Doing so turns on system call auditing for the specified task. This is called from copy_process, so no lock is needed.h]hFilter on the task information and allocate a per-task audit context if necessary. Doing so turns on system call auditing for the specified task. This is called from copy_process, so no lock is needed.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjmCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_log_uring (C function)c.audit_log_uringhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h0void audit_log_uring (struct audit_context *ctx)h]j)}(h/void audit_log_uring(struct audit_context *ctx)h](j )}(hvoidh]hvoid}(hjDhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjDhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMOubj2)}(h h]h }(hj!DhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDhhhj DhMOubj{)}(haudit_log_uringh]j)}(haudit_log_uringh]haudit_log_uring}(hj3DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/Dubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjDhhhj DhMOubj)}(h(struct audit_context *ctx)h]j)}(hstruct audit_context *ctxh](j)}(hjAh]hstruct}(hjODhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKDubj2)}(h h]h }(hj\DhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKDubh)}(hhh]j)}(h audit_contexth]h audit_context}(hjmDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjDubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjoDmodnameN classnameNj] j` )}jc ]jf )}jY j5Dsbc.audit_log_uringasbuh1hhjKDubj2)}(h h]h }(hjDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKDubj)}(hjh]h*}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKDubj)}(hctxh]hctx}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKDubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjGDubah}(h]h ]h"]h$]h&]jjuh1jhjDhhhj DhMOubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj Dhhhj DhMOubah}(h]jDah ](jjeh"]h$]h&]jj)jhuh1jhj DhMOhjDhhubj)}(hhh]h)}(hgenerate a AUDIT_URINGOP recordh]hgenerate a AUDIT_URINGOP record}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMOhjDhhubah}(h]h ]h"]h$]h&]uh1jhjDhhhj DhMOubeh}(h]h ](jfunctioneh"]h$]h&]jjjjDjjDjjjuh1jhhhj:.hNhNubj)}(hA**Parameters** ``struct audit_context *ctx`` the audit contexth](h)}(h**Parameters**h]j)}(hjDh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMShjDubj )}(hhh]j)}(h/``struct audit_context *ctx`` the audit contexth](j)}(h``struct audit_context *ctx``h]j)}(hjEh]hstruct audit_context *ctx}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMUhj Eubj2)}(hhh]h)}(hthe audit contexth]hthe audit context}(hj,EhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMPhj)Eubah}(h]h ]h"]h$]h&]uh1j1hj Eubeh}(h]h ]h"]h$]h&]uh1jhj(EhMUhj Eubah}(h]h ]h"]h$]h&]uh1j hjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_free (C function)c.__audit_freehNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h+void __audit_free (struct task_struct *tsk)h]j)}(h*void __audit_free(struct task_struct *tsk)h](j )}(hvoidh]hvoid}(hjmEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjiEhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMubj2)}(h h]h }(hj|EhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiEhhhj{EhMubj{)}(h __audit_freeh]j)}(h __audit_freeh]h __audit_free}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjiEhhhj{EhMubj)}(h(struct task_struct *tsk)h]j)}(hstruct task_struct *tskh](j)}(hjAh]hstruct}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEubh)}(hhh]j)}(h task_structh]h task_struct}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjEmodnameN classnameNj] j` )}jc ]jf )}jY jEsbc.__audit_freeasbuh1hhjEubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEubj)}(hjh]h*}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(htskh]htsk}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubah}(h]h ]h"]h$]h&]jjuh1jhjiEhhhj{EhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjeEhhhj{EhMubah}(h]j`Eah ](jjeh"]h$]h&]jj)jhuh1jhj{EhMhjbEhhubj)}(hhh]h)}(hfree a per-task audit contexth]hfree a per-task audit context}(hj-FhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhj*Fhhubah}(h]h ]h"]h$]h&]uh1jhjbEhhhj{EhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjEFjjEFjjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``struct task_struct *tsk`` task whose audit context block to free **Description** Called from copy_process, do_exit, and the io_uring codeh](h)}(h**Parameters**h]j)}(hjOFh]h Parameters}(hjQFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMFubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjIFubj )}(hhh]j)}(hC``struct task_struct *tsk`` task whose audit context block to free h](j)}(h``struct task_struct *tsk``h]j)}(hjnFh]hstruct task_struct *tsk}(hjpFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlFubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjhFubj2)}(hhh]h)}(h&task whose audit context block to freeh]h&task whose audit context block to free}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMhjFubah}(h]h ]h"]h$]h&]uh1j1hjhFubeh}(h]h ]h"]h$]h&]uh1jhjFhMhjeFubah}(h]h ]h"]h$]h&]uh1j hjIFubh)}(h**Description**h]j)}(hjFh]h Description}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjIFubh)}(h8Called from copy_process, do_exit, and the io_uring codeh]h8Called from copy_process, do_exit, and the io_uring code}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjIFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_return_fixup (C function)c.audit_return_fixuphNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hKvoid audit_return_fixup (struct audit_context *ctx, int success, long code)h]j)}(hJvoid audit_return_fixup(struct audit_context *ctx, int success, long code)h](j )}(hvoidh]hvoid}(hjFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjFhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM0ubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFhhhjFhM0ubj{)}(haudit_return_fixuph]j)}(haudit_return_fixuph]haudit_return_fixup}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Gubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjFhhhjFhM0ubj)}(h3(struct audit_context *ctx, int success, long code)h](j)}(hstruct audit_context *ctxh](j)}(hjAh]hstruct}(hj+GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Gubj2)}(h h]h }(hj8GhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'Gubh)}(hhh]j)}(h audit_contexth]h audit_context}(hjIGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFGubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjKGmodnameN classnameNj] j` )}jc ]jf )}jY jGsbc.audit_return_fixupasbuh1hhj'Gubj2)}(h h]h }(hjiGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'Gubj)}(hjh]h*}(hjwGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Gubj)}(hctxh]hctx}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Gubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj#Gubj)}(h int successh](j )}(hinth]hint}(hjGhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjGubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubj)}(hsuccessh]hsuccess}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj#Gubj)}(h long codeh](j )}(hlongh]hlong}(hjGhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjGubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubj)}(hcodeh]hcode}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj#Gubeh}(h]h ]h"]h$]h&]jjuh1jhjFhhhjFhM0ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjFhhhjFhM0ubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhjFhM0hjFhhubj)}(hhh]h)}(h+fixup the return codes in the audit_contexth]h+fixup the return codes in the audit_context}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM0hjHhhubah}(h]h ]h"]h$]h&]uh1jhjFhhhjFhM0ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj0Hjj0Hjjjuh1jhhhj:.hNhNubj)}(hX\**Parameters** ``struct audit_context *ctx`` the audit_context ``int success`` true/false value to indicate if the operation succeeded or not ``long code`` operation return code **Description** We need to fixup the return code in the audit logs if the actual return codes are later going to be fixed by the arch specific signal handlers.h](h)}(h**Parameters**h]j)}(hj:Hh]h Parameters}(hjtrue/false value to indicate if the operation succeeded or noth]h>true/false value to indicate if the operation succeeded or not}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhM2hjHubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjHhM2hjPHubj)}(h$``long code`` operation return code h](j)}(h ``long code``h]j)}(hjHh]h long code}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM3hjHubj2)}(hhh]h)}(hoperation return codeh]hoperation return code}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhM3hjHubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjHhM3hjPHubeh}(h]h ]h"]h$]h&]uh1j hj4Hubh)}(h**Description**h]j)}(hjIh]h Description}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM5hj4Hubh)}(hWe need to fixup the return code in the audit logs if the actual return codes are later going to be fixed by the arch specific signal handlers.h]hWe need to fixup the return code in the audit logs if the actual return codes are later going to be fixed by the arch specific signal handlers.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM4hj4Hubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  __audit_uring_entry (C function)c.__audit_uring_entryhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h void __audit_uring_entry (u8 op)h]j)}(hvoid __audit_uring_entry(u8 op)h](j )}(hvoidh]hvoid}(hjKIhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjGIhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMLubj2)}(h h]h }(hjZIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGIhhhjYIhMLubj{)}(h__audit_uring_entryh]j)}(h__audit_uring_entryh]h__audit_uring_entry}(hjlIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhIubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjGIhhhjYIhMLubj)}(h(u8 op)h]j)}(hu8 oph](h)}(hhh]j)}(hu8h]hu8}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjImodnameN classnameNj] j` )}jc ]jf )}jY jnIsbc.__audit_uring_entryasbuh1hhjIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hoph]hop}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjIubah}(h]h ]h"]h$]h&]jjuh1jhjGIhhhjYIhMLubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjCIhhhjYIhMLubah}(h]j>Iah ](jjeh"]h$]h&]jj)jhuh1jhjYIhMLhj@Ihhubj)}(hhh]h)}(h4prepare the kernel task's audit context for io_uringh]h6prepare the kernel task’s audit context for io_uring}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMLhjIhhubah}(h]h ]h"]h$]h&]uh1jhj@IhhhjYIhMLubeh}(h]h ](jfunctioneh"]h$]h&]jjjjIjjIjjjuh1jhhhj:.hNhNubj)}(hX **Parameters** ``u8 op`` the io_uring opcode **Description** This is similar to audit_syscall_entry() but is intended for use by io_uring operations. This function should only ever be called from audit_uring_entry() as we rely on the audit context checking present in that function.h](h)}(h**Parameters**h]j)}(hjJh]h Parameters}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMPhjIubj )}(hhh]j)}(h``u8 op`` the io_uring opcode h](j)}(h ``u8 op``h]j)}(hj$Jh]hu8 op}(hj&JhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"Jubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMMhjJubj2)}(hhh]h)}(hthe io_uring opcodeh]hthe io_uring opcode}(hj=JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9JhMMhj:Jubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhj9JhMMhjJubah}(h]h ]h"]h$]h&]uh1j hjIubh)}(h**Description**h]j)}(hj_Jh]h Description}(hjaJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]Jubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMOhjIubh)}(hThis is similar to audit_syscall_entry() but is intended for use by io_uring operations. This function should only ever be called from audit_uring_entry() as we rely on the audit context checking present in that function.h]hThis is similar to audit_syscall_entry() but is intended for use by io_uring operations. This function should only ever be called from audit_uring_entry() as we rely on the audit context checking present in that function.}(hjuJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMNhjIubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_uring_exit (C function)c.__audit_uring_exithNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h0void __audit_uring_exit (int success, long code)h]j)}(h/void __audit_uring_exit(int success, long code)h](j )}(hvoidh]hvoid}(hjJhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMoubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJhhhjJhMoubj{)}(h__audit_uring_exith]j)}(h__audit_uring_exith]h__audit_uring_exit}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjJhhhjJhMoubj)}(h(int success, long code)h](j)}(h int successh](j )}(hinth]hint}(hjJhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJubj)}(hsuccessh]hsuccess}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubj)}(h long codeh](j )}(hlongh]hlong}(hjKhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjKubj2)}(h h]h }(hj$KhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubj)}(hcodeh]hcode}(hj2KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubeh}(h]h ]h"]h$]h&]jjuh1jhjJhhhjJhMoubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjJhhhjJhMoubah}(h]jJah ](jjeh"]h$]h&]jj)jhuh1jhjJhMohjJhhubj)}(hhh]h)}(h6wrap up the kernel task's audit context after io_uringh]h8wrap up the kernel task’s audit context after io_uring}(hj\KhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMohjYKhhubah}(h]h ]h"]h$]h&]uh1jhjJhhhjJhMoubeh}(h]h ](jfunctioneh"]h$]h&]jjjjtKjjtKjjjuh1jhhhj:.hNhNubj)}(hXv**Parameters** ``int success`` true/false value to indicate if the operation succeeded or not ``long code`` operation return code **Description** This is similar to audit_syscall_exit() but is intended for use by io_uring operations. This function should only ever be called from audit_uring_exit() as we rely on the audit context checking present in that function.h](h)}(h**Parameters**h]j)}(hj~Kh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|Kubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMshjxKubj )}(hhh](j)}(hO``int success`` true/false value to indicate if the operation succeeded or not h](j)}(h``int success``h]j)}(hjKh]h int success}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMphjKubj2)}(hhh]h)}(h>true/false value to indicate if the operation succeeded or noth]h>true/false value to indicate if the operation succeeded or not}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMphjKubah}(h]h ]h"]h$]h&]uh1j1hjKubeh}(h]h ]h"]h$]h&]uh1jhjKhMphjKubj)}(h$``long code`` operation return code h](j)}(h ``long code``h]j)}(hjKh]h long code}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMqhjKubj2)}(hhh]h)}(hoperation return codeh]hoperation return code}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMqhjKubah}(h]h ]h"]h$]h&]uh1j1hjKubeh}(h]h ]h"]h$]h&]uh1jhjKhMqhjKubeh}(h]h ]h"]h$]h&]uh1j hjxKubh)}(h**Description**h]j)}(hjLh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMshjxKubh)}(hThis is similar to audit_syscall_exit() but is intended for use by io_uring operations. This function should only ever be called from audit_uring_exit() as we rely on the audit context checking present in that function.h]hThis is similar to audit_syscall_exit() but is intended for use by io_uring operations. This function should only ever be called from audit_uring_exit() as we rely on the audit context checking present in that function.}(hj'LhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMrhjxKubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "__audit_syscall_entry (C function)c.__audit_syscall_entryhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hnvoid __audit_syscall_entry (int major, unsigned long a1, unsigned long a2, unsigned long a3, unsigned long a4)h]j)}(hmvoid __audit_syscall_entry(int major, unsigned long a1, unsigned long a2, unsigned long a3, unsigned long a4)h](j )}(hvoidh]hvoid}(hjVLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjRLhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMubj2)}(h h]h }(hjeLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRLhhhjdLhMubj{)}(h__audit_syscall_entryh]j)}(h__audit_syscall_entryh]h__audit_syscall_entry}(hjwLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsLubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjRLhhhjdLhMubj)}(hS(int major, unsigned long a1, unsigned long a2, unsigned long a3, unsigned long a4)h](j)}(h int majorh](j )}(hinth]hint}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hmajorh]hmajor}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjLubj)}(hunsigned long a1h](j )}(hunsignedh]hunsigned}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj )}(hlongh]hlong}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(ha1h]ha1}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjLubj)}(hunsigned long a2h](j )}(hunsignedh]hunsigned}(hjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjMubj2)}(h h]h }(hj'MhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj )}(hlongh]hlong}(hj5MhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjMubj2)}(h h]h }(hjCMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj)}(ha2h]ha2}(hjQMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjLubj)}(hunsigned long a3h](j )}(hunsignedh]hunsigned}(hjjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfMubj2)}(h h]h }(hjxMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfMubj )}(hlongh]hlong}(hjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfMubj)}(ha3h]ha3}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfMubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjLubj)}(hunsigned long a4h](j )}(hunsignedh]hunsigned}(hjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj )}(hlongh]hlong}(hjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj)}(ha4h]ha4}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjLubeh}(h]h ]h"]h$]h&]jjuh1jhjRLhhhjdLhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjNLhhhjdLhMubah}(h]jILah ](jjeh"]h$]h&]jj)jhuh1jhjdLhMhjKLhhubj)}(hhh]h)}(h(fill in an audit record at syscall entryh]h(fill in an audit record at syscall entry}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjNhhubah}(h]h ]h"]h$]h&]uh1jhjKLhhhjdLhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj5Njj5Njjjuh1jhhhj:.hNhNubj)}(hX**Parameters** ``int major`` major syscall type (function) ``unsigned long a1`` additional syscall register 1 ``unsigned long a2`` additional syscall register 2 ``unsigned long a3`` additional syscall register 3 ``unsigned long a4`` additional syscall register 4 **Description** Fill in audit context at syscall entry. This only happens if the audit context was created when the task was created and the state or filters demand the audit context be built. If the state from the per-task filter or from the per-syscall filter is AUDIT_STATE_RECORD, then the record will be written at syscall exit time (otherwise, it will only be written if another part of the kernel requests that it be written).h](h)}(h**Parameters**h]j)}(hj?Nh]h Parameters}(hjANhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=Nubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhj9Nubj )}(hhh](j)}(h,``int major`` major syscall type (function) h](j)}(h ``int major``h]j)}(hj^Nh]h int major}(hj`NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\Nubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjXNubj2)}(hhh]h)}(hmajor syscall type (function)h]hmajor syscall type (function)}(hjwNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjsNhMhjtNubah}(h]h ]h"]h$]h&]uh1j1hjXNubeh}(h]h ]h"]h$]h&]uh1jhjsNhMhjUNubj)}(h3``unsigned long a1`` additional syscall register 1 h](j)}(h``unsigned long a1``h]j)}(hjNh]hunsigned long a1}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjNubj2)}(hhh]h)}(hadditional syscall register 1h]hadditional syscall register 1}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMhjNubah}(h]h ]h"]h$]h&]uh1j1hjNubeh}(h]h ]h"]h$]h&]uh1jhjNhMhjUNubj)}(h3``unsigned long a2`` additional syscall register 2 h](j)}(h``unsigned long a2``h]j)}(hjNh]hunsigned long a2}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjNubj2)}(hhh]h)}(hadditional syscall register 2h]hadditional syscall register 2}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMhjNubah}(h]h ]h"]h$]h&]uh1j1hjNubeh}(h]h ]h"]h$]h&]uh1jhjNhMhjUNubj)}(h3``unsigned long a3`` additional syscall register 3 h](j)}(h``unsigned long a3``h]j)}(hj Oh]hunsigned long a3}(hj OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjOubj2)}(hhh]h)}(hadditional syscall register 3h]hadditional syscall register 3}(hj"OhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjOubah}(h]h ]h"]h$]h&]uh1j1hjOubeh}(h]h ]h"]h$]h&]uh1jhjOhMhjUNubj)}(h3``unsigned long a4`` additional syscall register 4 h](j)}(h``unsigned long a4``h]j)}(hjBOh]hunsigned long a4}(hjDOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@Oubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjah"]h$]h&]uh1j1hjOhhhjOhMubj{)}(h__audit_syscall_exith]j)}(h__audit_syscall_exith]h__audit_syscall_exit}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjOhhhjOhMubj)}(h(int success, long return_code)h](j)}(h int successh](j )}(hinth]hint}(hjOhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjOubj2)}(h h]h }(hj PhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOubj)}(hsuccessh]hsuccess}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubj)}(hlong return_codeh](j )}(hlongh]hlong}(hj4PhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj0Pubj2)}(h h]h }(hjBPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0Pubj)}(h return_codeh]h return_code}(hjPPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0Pubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjOubeh}(h]h ]h"]h$]h&]jjuh1jhjOhhhjOhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjOhhhjOhMubah}(h]jOah ](jjeh"]h$]h&]jj)jhuh1jhjOhMhjOhhubj)}(hhh]h)}(h,deallocate audit context after a system callh]h,deallocate audit context after a system call}(hjzPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjwPhhubah}(h]h ]h"]h$]h&]uh1jhjOhhhjOhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjPjjPjjjuh1jhhhj:.hNhNubj)}(hX**Parameters** ``int success`` success value of the syscall ``long return_code`` return value of the syscall **Description** Tear down after system call. If the audit context has been marked as auditable (either because of the AUDIT_STATE_RECORD state from filtering, or because some other part of the kernel wrote an audit message), then write out the syscall information. In call cases, free the names stored from getname().h](h)}(h**Parameters**h]j)}(hjPh]h Parameters}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjPubj )}(hhh](j)}(h-``int success`` success value of the syscall h](j)}(h``int success``h]j)}(hjPh]h int success}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjPubj2)}(hhh]h)}(hsuccess value of the syscallh]hsuccess value of the syscall}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhMhjPubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhjPhMhjPubj)}(h1``long return_code`` return value of the syscall h](j)}(h``long return_code``h]j)}(hjPh]hlong return_code}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjPubj2)}(hhh]h)}(hreturn value of the syscallh]hreturn value of the syscall}(hj QhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj QhMhj Qubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhj QhMhjPubeh}(h]h ]h"]h$]h&]uh1j hjPubh)}(h**Description**h]j)}(hj/Qh]h Description}(hj1QhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-Qubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjPubh)}(hX/Tear down after system call. If the audit context has been marked as auditable (either because of the AUDIT_STATE_RECORD state from filtering, or because some other part of the kernel wrote an audit message), then write out the syscall information. In call cases, free the names stored from getname().h]hX/Tear down after system call. If the audit context has been marked as auditable (either because of the AUDIT_STATE_RECORD state from filtering, or because some other part of the kernel wrote an audit message), then write out the syscall information. In call cases, free the names stored from getname().}(hjEQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_getname (C function)c.__audit_getnamehNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h,void __audit_getname (struct filename *name)h]j)}(h+void __audit_getname(struct filename *name)h](j )}(hvoidh]hvoid}(hjtQhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjpQhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM}ubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpQhhhjQhM}ubj{)}(h__audit_getnameh]j)}(h__audit_getnameh]h__audit_getname}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjpQhhhjQhM}ubj)}(h(struct filename *name)h]j)}(hstruct filename *nameh](j)}(hjAh]hstruct}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubh)}(hhh]j)}(hfilenameh]hfilename}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjQmodnameN classnameNj] j` )}jc ]jf )}jY jQsbc.__audit_getnameasbuh1hhjQubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hjh]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(hnameh]hname}(hj RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubah}(h]h ]h"]h$]h&]jjuh1jhjpQhhhjQhM}ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjlQhhhjQhM}ubah}(h]jgQah ](jjeh"]h$]h&]jj)jhuh1jhjQhM}hjiQhhubj)}(hhh]h)}(hadd a name to the listh]hadd a name to the list}(hj4RhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM}hj1Rhhubah}(h]h ]h"]h$]h&]uh1jhjiQhhhjQhM}ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjLRjjLRjjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``struct filename *name`` name to add **Description** Add a name to the list of audit names for this context. Called from fs/namei.c:getname().h](h)}(h**Parameters**h]j)}(hjVRh]h Parameters}(hjXRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTRubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjPRubj )}(hhh]j)}(h&``struct filename *name`` name to add h](j)}(h``struct filename *name``h]j)}(hjuRh]hstruct filename *name}(hjwRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsRubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM~hjoRubj2)}(hhh]h)}(h name to addh]h name to add}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhM~hjRubah}(h]h ]h"]h$]h&]uh1j1hjoRubeh}(h]h ]h"]h$]h&]uh1jhjRhM~hjlRubah}(h]h ]h"]h$]h&]uh1j hjPRubh)}(h**Description**h]j)}(hjRh]h Description}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjPRubh)}(hYAdd a name to the list of audit names for this context. Called from fs/namei.c:getname().h]hYAdd a name to the list of audit names for this context. Called from fs/namei.c:getname().}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjPRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_inode (C function)c.__audit_inodehNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h[void __audit_inode (struct filename *name, const struct dentry *dentry, unsigned int flags)h]j)}(hZvoid __audit_inode(struct filename *name, const struct dentry *dentry, unsigned int flags)h](j )}(hvoidh]hvoid}(hjRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjRhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRhhhjShMubj{)}(h __audit_inodeh]j)}(h __audit_inodeh]h __audit_inode}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjRhhhjShMubj)}(hH(struct filename *name, const struct dentry *dentry, unsigned int flags)h](j)}(hstruct filename *nameh](j)}(hjAh]hstruct}(hj2ShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.Subj2)}(h h]h }(hj?ShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.Subh)}(hhh]j)}(hfilenameh]hfilename}(hjPShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMSubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjRSmodnameN classnameNj] j` )}jc ]jf )}jY jSsbc.__audit_inodeasbuh1hhj.Subj2)}(h h]h }(hjpShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.Subj)}(hjh]h*}(hj~ShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.Subj)}(hnameh]hname}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.Subeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*Subj)}(hconst struct dentry *dentryh](j)}(hjh]hconst}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hjAh]hstruct}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubh)}(hhh]j)}(hdentryh]hdentry}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjSmodnameN classnameNj] j` )}jc ]jlSc.__audit_inodeasbuh1hhjSubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hjh]h*}(hj ThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj)}(hdentryh]hdentry}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*Subj)}(hunsigned int flagsh](j )}(hunsignedh]hunsigned}(hj/ThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+Tubj2)}(h h]h }(hj=ThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+Tubj )}(hinth]hint}(hjKThhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+Tubj2)}(h h]h }(hjYThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+Tubj)}(hflagsh]hflags}(hjgThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+Tubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj*Subeh}(h]h ]h"]h$]h&]jjuh1jhjRhhhjShMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjRhhhjShMubah}(h]jRah ](jjeh"]h$]h&]jj)jhuh1jhjShMhjRhhubj)}(hhh]h)}(h(store the inode and device from a lookuph]h(store the inode and device from a lookup}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjThhubah}(h]h ]h"]h$]h&]uh1jhjRhhhjShMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjTjjTjjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``struct filename *name`` name being audited ``const struct dentry *dentry`` dentry being audited ``unsigned int flags`` attributes for this particular entryh](h)}(h**Parameters**h]j)}(hjTh]h Parameters}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjTubj )}(hhh](j)}(h-``struct filename *name`` name being audited h](j)}(h``struct filename *name``h]j)}(hjTh]hstruct filename *name}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjTubj2)}(hhh]h)}(hname being auditedh]hname being audited}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThMhjTubah}(h]h ]h"]h$]h&]uh1j1hjTubeh}(h]h ]h"]h$]h&]uh1jhjThMhjTubj)}(h5``const struct dentry *dentry`` dentry being audited h](j)}(h``const struct dentry *dentry``h]j)}(hj Uh]hconst struct dentry *dentry}(hj UhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Uubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjUubj2)}(hhh]h)}(hdentry being auditedh]hdentry being audited}(hj$UhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj UhMhj!Uubah}(h]h ]h"]h$]h&]uh1j1hjUubeh}(h]h ]h"]h$]h&]uh1jhj UhMhjTubj)}(h;``unsigned int flags`` attributes for this particular entryh](j)}(h``unsigned int flags``h]j)}(hjDUh]hunsigned int flags}(hjFUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBUubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhj>Uubj2)}(hhh]h)}(h$attributes for this particular entryh]h$attributes for this particular entry}(hj]UhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMhjZUubah}(h]h ]h"]h$]h&]uh1j1hj>Uubeh}(h]h ]h"]h$]h&]uh1jhjYUhMhjTubeh}(h]h ]h"]h$]h&]uh1j hjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j auditsc_get_stamp (C function)c.auditsc_get_stamphNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hLint auditsc_get_stamp (struct audit_context *ctx, struct audit_stamp *stamp)h]j)}(hKint auditsc_get_stamp(struct audit_context *ctx, struct audit_stamp *stamp)h](j )}(hinth]hint}(hjUhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM ubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUhhhjUhM ubj{)}(hauditsc_get_stamph]j)}(hauditsc_get_stamph]hauditsc_get_stamp}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjUhhhjUhM ubj)}(h6(struct audit_context *ctx, struct audit_stamp *stamp)h](j)}(hstruct audit_context *ctxh](j)}(hjAh]hstruct}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubh)}(hhh]j)}(h audit_contexth]h audit_context}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjUmodnameN classnameNj] j` )}jc ]jf )}jY jUsbc.auditsc_get_stampasbuh1hhjUubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj)}(hjh]h*}(hj'VhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(hctxh]hctx}(hj4VhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubj)}(hstruct audit_stamp *stamph](j)}(hjAh]hstruct}(hjMVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIVubj2)}(h h]h }(hjZVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIVubh)}(hhh]j)}(h audit_stamph]h audit_stamp}(hjkVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhVubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmVmodnameN classnameNj] j` )}jc ]jVc.auditsc_get_stampasbuh1hhjIVubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIVubj)}(hjh]h*}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIVubj)}(hstamph]hstamp}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIVubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubeh}(h]h ]h"]h$]h&]jjuh1jhjUhhhjUhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjUhhhjUhM ubah}(h]jUah ](jjeh"]h$]h&]jj)jhuh1jhjUhM hjUhhubj)}(hhh]h)}(h(get local copies of audit_context valuesh]h(get local copies of audit_context values}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjVhhubah}(h]h ]h"]h$]h&]uh1jhjUhhhjUhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjVjjVjjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``struct audit_context *ctx`` audit_context for the task ``struct audit_stamp *stamp`` timestamp to record **Description** Also sets the context as auditable.h](h)}(h**Parameters**h]j)}(hjVh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjVubj )}(hhh](j)}(h9``struct audit_context *ctx`` audit_context for the task h](j)}(h``struct audit_context *ctx``h]j)}(hjWh]hstruct audit_context *ctx}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Wubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj Wubj2)}(hhh]h)}(haudit_context for the taskh]haudit_context for the task}(hj(WhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$WhM hj%Wubah}(h]h ]h"]h$]h&]uh1j1hj Wubeh}(h]h ]h"]h$]h&]uh1jhj$WhM hjWubj)}(h2``struct audit_stamp *stamp`` timestamp to record h](j)}(h``struct audit_stamp *stamp``h]j)}(hjHWh]hstruct audit_stamp *stamp}(hjJWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFWubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjBWubj2)}(hhh]h)}(htimestamp to recordh]htimestamp to record}(hjaWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]WhM hj^Wubah}(h]h ]h"]h$]h&]uh1j1hjBWubeh}(h]h ]h"]h$]h&]uh1jhj]WhM hjWubeh}(h]h ]h"]h$]h&]uh1j hjVubh)}(h**Description**h]j)}(hjWh]h Description}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjVubh)}(h#Also sets the context as auditable.h]h#Also sets the context as auditable.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjVubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_mq_open (C function)c.__audit_mq_openhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hDvoid __audit_mq_open (int oflag, umode_t mode, struct mq_attr *attr)h]j)}(hCvoid __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr)h](j )}(hvoidh]hvoid}(hjWhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjWhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM ubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWhhhjWhM ubj{)}(h__audit_mq_openh]j)}(h__audit_mq_openh]h__audit_mq_open}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjWhhhjWhM ubj)}(h/(int oflag, umode_t mode, struct mq_attr *attr)h](j)}(h int oflagh](j )}(hinth]hint}(hjXhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjXubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubj)}(hoflagh]hoflag}(hj!XhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjWubj)}(h umode_t modeh](h)}(hhh]j)}(humode_th]humode_t}(hj=XhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:Xubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj?XmodnameN classnameNj] j` )}jc ]jf )}jY jWsbc.__audit_mq_openasbuh1hhj6Xubj2)}(h h]h }(hj]XhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6Xubj)}(hmodeh]hmode}(hjkXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6Xubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjWubj)}(hstruct mq_attr *attrh](j)}(hjAh]hstruct}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubh)}(hhh]j)}(hmq_attrh]hmq_attr}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjXmodnameN classnameNj] j` )}jc ]jYXc.__audit_mq_openasbuh1hhjXubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubj)}(hjh]h*}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(hattrh]hattr}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjWubeh}(h]h ]h"]h$]h&]jjuh1jhjWhhhjWhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjWhhhjWhM ubah}(h]jWah ](jjeh"]h$]h&]jj)jhuh1jhjWhM hjWhhubj)}(hhh]h)}(h%record audit data for a POSIX MQ openh]h%record audit data for a POSIX MQ open}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjYhhubah}(h]h ]h"]h$]h&]uh1jhjWhhhjWhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjYjjYjjjuh1jhhhj:.hNhNubj)}(ht**Parameters** ``int oflag`` open flag ``umode_t mode`` mode bits ``struct mq_attr *attr`` queue attributesh](h)}(h**Parameters**h]j)}(hj'Yh]h Parameters}(hj)YhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%Yubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj!Yubj )}(hhh](j)}(h``int oflag`` open flag h](j)}(h ``int oflag``h]j)}(hjFYh]h int oflag}(hjHYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDYubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj@Yubj2)}(hhh]h)}(h open flagh]h open flag}(hj_YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[YhM hj\Yubah}(h]h ]h"]h$]h&]uh1j1hj@Yubeh}(h]h ]h"]h$]h&]uh1jhj[YhM hj=Yubj)}(h``umode_t mode`` mode bits h](j)}(h``umode_t mode``h]j)}(hjYh]h umode_t mode}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}Yubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjyYubj2)}(hhh]h)}(h mode bitsh]h mode bits}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhM hjYubah}(h]h ]h"]h$]h&]uh1j1hjyYubeh}(h]h ]h"]h$]h&]uh1jhjYhM hj=Yubj)}(h)``struct mq_attr *attr`` queue attributesh](j)}(h``struct mq_attr *attr``h]j)}(hjYh]hstruct mq_attr *attr}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjYubj2)}(hhh]h)}(hqueue attributesh]hqueue attributes}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjYubah}(h]h ]h"]h$]h&]uh1j1hjYubeh}(h]h ]h"]h$]h&]uh1jhjYhM hj=Yubeh}(h]h ]h"]h$]h&]uh1j hj!Yubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  __audit_mq_sendrecv (C function)c.__audit_mq_sendrecvhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hsvoid __audit_mq_sendrecv (mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec64 *abs_timeout)h]j)}(hrvoid __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec64 *abs_timeout)h](j )}(hvoidh]hvoid}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM ubj2)}(h h]h }(hj!ZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZhhhj ZhM ubj{)}(h__audit_mq_sendrecvh]j)}(h__audit_mq_sendrecvh]h__audit_mq_sendrecv}(hj3ZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/Zubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjZhhhj ZhM ubj)}(hZ(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec64 *abs_timeout)h](j)}(h mqd_t mqdesh](h)}(hhh]j)}(hmqd_th]hmqd_t}(hjRZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOZubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjTZmodnameN classnameNj] j` )}jc ]jf )}jY j5Zsbc.__audit_mq_sendrecvasbuh1hhjKZubj2)}(h h]h }(hjrZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKZubj)}(hmqdesh]hmqdes}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjGZubj)}(hsize_t msg_lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjZmodnameN classnameNj] j` )}jc ]jnZc.__audit_mq_sendrecvasbuh1hhjZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hmsg_lenh]hmsg_len}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjGZubj)}(hunsigned int msg_prioh](j )}(hunsignedh]hunsigned}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj )}(hinth]hint}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZubj2)}(h h]h }(hj [hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hmsg_prioh]hmsg_prio}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjGZubj)}(h$const struct timespec64 *abs_timeouth](j)}(hjh]hconst}(hj2[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.[ubj2)}(h h]h }(hj?[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.[ubj)}(hjAh]hstruct}(hjM[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.[ubj2)}(h h]h }(hjZ[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.[ubh)}(hhh]j)}(h timespec64h]h timespec64}(hjk[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh[ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjm[modnameN classnameNj] j` )}jc ]jnZc.__audit_mq_sendrecvasbuh1hhj.[ubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.[ubj)}(hjh]h*}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.[ubj)}(h abs_timeouth]h abs_timeout}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.[ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjGZubeh}(h]h ]h"]h$]h&]jjuh1jhjZhhhj ZhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj Zhhhj ZhM ubah}(h]jZah ](jjeh"]h$]h&]jj)jhuh1jhj ZhM hjZhhubj)}(hhh]h)}(h3record audit data for a POSIX MQ timed send/receiveh]h3record audit data for a POSIX MQ timed send/receive}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj[hhubah}(h]h ]h"]h$]h&]uh1jhjZhhhj ZhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[jj[jjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``mqd_t mqdes`` MQ descriptor ``size_t msg_len`` Message length ``unsigned int msg_prio`` Message priority ``const struct timespec64 *abs_timeout`` Message timeout in absolute timeh](h)}(h**Parameters**h]j)}(hj[h]h Parameters}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj[ubj )}(hhh](j)}(h``mqd_t mqdes`` MQ descriptor h](j)}(h``mqd_t mqdes``h]j)}(hj\h]h mqd_t mqdes}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj \ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj \ubj2)}(hhh]h)}(h MQ descriptorh]h MQ descriptor}(hj(\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$\hM hj%\ubah}(h]h ]h"]h$]h&]uh1j1hj \ubeh}(h]h ]h"]h$]h&]uh1jhj$\hM hj\ubj)}(h"``size_t msg_len`` Message length h](j)}(h``size_t msg_len``h]j)}(hjH\h]hsize_t msg_len}(hjJ\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF\ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjB\ubj2)}(hhh]h)}(hMessage lengthh]hMessage length}(hja\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]\hM hj^\ubah}(h]h ]h"]h$]h&]uh1j1hjB\ubeh}(h]h ]h"]h$]h&]uh1jhj]\hM hj\ubj)}(h+``unsigned int msg_prio`` Message priority h](j)}(h``unsigned int msg_prio``h]j)}(hj\h]hunsigned int msg_prio}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj{\ubj2)}(hhh]h)}(hMessage priorityh]hMessage priority}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM hj\ubah}(h]h ]h"]h$]h&]uh1j1hj{\ubeh}(h]h ]h"]h$]h&]uh1jhj\hM hj\ubj)}(hI``const struct timespec64 *abs_timeout`` Message timeout in absolute timeh](j)}(h(``const struct timespec64 *abs_timeout``h]j)}(hj\h]h$const struct timespec64 *abs_timeout}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj\ubj2)}(hhh]h)}(h Message timeout in absolute timeh]h Message timeout in absolute time}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj\ubah}(h]h ]h"]h$]h&]uh1j1hj\ubeh}(h]h ]h"]h$]h&]uh1jhj\hM hj\ubeh}(h]h ]h"]h$]h&]uh1j hj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_mq_notify (C function)c.__audit_mq_notifyhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hIvoid __audit_mq_notify (mqd_t mqdes, const struct sigevent *notification)h]j)}(hHvoid __audit_mq_notify(mqd_t mqdes, const struct sigevent *notification)h](j )}(hvoidh]hvoid}(hj]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM ubj2)}(h h]h }(hj#]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]hhhj"]hM ubj{)}(h__audit_mq_notifyh]j)}(h__audit_mq_notifyh]h__audit_mq_notify}(hj5]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1]ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj]hhhj"]hM ubj)}(h2(mqd_t mqdes, const struct sigevent *notification)h](j)}(h mqd_t mqdesh](h)}(hhh]j)}(hmqd_th]hmqd_t}(hjT]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ]ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjV]modnameN classnameNj] j` )}jc ]jf )}jY j7]sbc.__audit_mq_notifyasbuh1hhjM]ubj2)}(h h]h }(hjt]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjM]ubj)}(hmqdesh]hmqdes}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjI]ubj)}(h#const struct sigevent *notificationh](j)}(hjh]hconst}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hjAh]hstruct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubh)}(hhh]j)}(hsigeventh]hsigevent}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj]modnameN classnameNj] j` )}jc ]jp]c.__audit_mq_notifyasbuh1hhj]ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(h notificationh]h notification}(hj ^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjI]ubeh}(h]h ]h"]h$]h&]jjuh1jhj]hhhj"]hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj ]hhhj"]hM ubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1jhj"]hM hj ]hhubj)}(hhh]h)}(h'record audit data for a POSIX MQ notifyh]h'record audit data for a POSIX MQ notify}(hj7^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj4^hhubah}(h]h ]h"]h$]h&]uh1jhj ]hhhj"]hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjO^jjO^jjjuh1jhhhj:.hNhNubj)}(hm**Parameters** ``mqd_t mqdes`` MQ descriptor ``const struct sigevent *notification`` Notification eventh](h)}(h**Parameters**h]j)}(hjY^h]h Parameters}(hj[^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW^ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjS^ubj )}(hhh](j)}(h``mqd_t mqdes`` MQ descriptor h](j)}(h``mqd_t mqdes``h]j)}(hjx^h]h mqd_t mqdes}(hjz^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv^ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjr^ubj2)}(hhh]h)}(h MQ descriptorh]h MQ descriptor}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM hj^ubah}(h]h ]h"]h$]h&]uh1j1hjr^ubeh}(h]h ]h"]h$]h&]uh1jhj^hM hjo^ubj)}(h:``const struct sigevent *notification`` Notification eventh](j)}(h'``const struct sigevent *notification``h]j)}(hj^h]h#const struct sigevent *notification}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj^ubj2)}(hhh]h)}(hNotification eventh]hNotification event}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj^ubah}(h]h ]h"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]uh1jhj^hM hjo^ubeh}(h]h ]h"]h$]h&]uh1j hjS^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "__audit_mq_getsetattr (C function)c.__audit_mq_getsetattrhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h@void __audit_mq_getsetattr (mqd_t mqdes, struct mq_attr *mqstat)h]j)}(h?void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat)h](j )}(hvoidh]hvoid}(hj _hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj_hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM ubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_hhhj_hM ubj{)}(h__audit_mq_getsetattrh]j)}(h__audit_mq_getsetattrh]h__audit_mq_getsetattr}(hj,_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(_ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj_hhhj_hM ubj)}(h%(mqd_t mqdes, struct mq_attr *mqstat)h](j)}(h mqd_t mqdesh](h)}(hhh]j)}(hmqd_th]hmqd_t}(hjK_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH_ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjM_modnameN classnameNj] j` )}jc ]jf )}jY j._sbc.__audit_mq_getsetattrasbuh1hhjD_ubj2)}(h h]h }(hjk_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjD_ubj)}(hmqdesh]hmqdes}(hjy_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@_ubj)}(hstruct mq_attr *mqstath](j)}(hjAh]hstruct}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubh)}(hhh]j)}(hmq_attrh]hmq_attr}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj_modnameN classnameNj] j` )}jc ]jg_c.__audit_mq_getsetattrasbuh1hhj_ubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubj)}(hjh]h*}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hmqstath]hmqstat}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@_ubeh}(h]h ]h"]h$]h&]jjuh1jhj_hhhj_hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj_hhhj_hM ubah}(h]j^ah ](jjeh"]h$]h&]jj)jhuh1jhj_hM hj_hhubj)}(hhh]h)}(h2record audit data for a POSIX MQ get/set attributeh]h2record audit data for a POSIX MQ get/set attribute}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj`hhubah}(h]h ]h"]h$]h&]uh1jhj_hhhj_hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+`jj+`jjjuh1jhhhj:.hNhNubj)}(hV**Parameters** ``mqd_t mqdes`` MQ descriptor ``struct mq_attr *mqstat`` MQ flagsh](h)}(h**Parameters**h]j)}(hj5`h]h Parameters}(hj7`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3`ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj/`ubj )}(hhh](j)}(h``mqd_t mqdes`` MQ descriptor h](j)}(h``mqd_t mqdes``h]j)}(hjT`h]h mqd_t mqdes}(hjV`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR`ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjN`ubj2)}(hhh]h)}(h MQ descriptorh]h MQ descriptor}(hjm`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhji`hM hjj`ubah}(h]h ]h"]h$]h&]uh1j1hjN`ubeh}(h]h ]h"]h$]h&]uh1jhji`hM hjK`ubj)}(h#``struct mq_attr *mqstat`` MQ flagsh](j)}(h``struct mq_attr *mqstat``h]j)}(hj`h]hstruct mq_attr *mqstat}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj`ubj2)}(hhh]h)}(hMQ flagsh]hMQ flags}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj`ubah}(h]h ]h"]h$]h&]uh1j1hj`ubeh}(h]h ]h"]h$]h&]uh1jhj`hM hjK`ubeh}(h]h ]h"]h$]h&]uh1j hj/`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_ipc_obj (C function)c.__audit_ipc_objhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h1void __audit_ipc_obj (struct kern_ipc_perm *ipcp)h]j)}(h0void __audit_ipc_obj(struct kern_ipc_perm *ipcp)h](j )}(hvoidh]hvoid}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj`hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`hhhj`hM ubj{)}(h__audit_ipc_objh]j)}(h__audit_ipc_objh]h__audit_ipc_obj}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj`hhhj`hM ubj)}(h(struct kern_ipc_perm *ipcp)h]j)}(hstruct kern_ipc_perm *ipcph](j)}(hjAh]hstruct}(hj$ahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj aubj2)}(h h]h }(hj1ahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj aubh)}(hhh]j)}(h kern_ipc_permh]h kern_ipc_perm}(hjBahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?aubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjDamodnameN classnameNj] j` )}jc ]jf )}jY j asbc.__audit_ipc_objasbuh1hhj aubj2)}(h h]h }(hjbahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj aubj)}(hjh]h*}(hjpahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj aubj)}(hipcph]hipcp}(hj}ahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj aubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjaubah}(h]h ]h"]h$]h&]jjuh1jhj`hhhj`hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj`hhhj`hM ubah}(h]j`ah ](jjeh"]h$]h&]jj)jhuh1jhj`hM hj`hhubj)}(hhh]h)}(h record audit data for ipc objecth]h record audit data for ipc object}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjahhubah}(h]h ]h"]h$]h&]uh1jhj`hhhj`hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjajjajjjuh1jhhhj:.hNhNubj)}(h@**Parameters** ``struct kern_ipc_perm *ipcp`` ipc permissionsh](h)}(h**Parameters**h]j)}(hjah]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjaubj )}(hhh]j)}(h.``struct kern_ipc_perm *ipcp`` ipc permissionsh](j)}(h``struct kern_ipc_perm *ipcp``h]j)}(hjah]hstruct kern_ipc_perm *ipcp}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjaubj2)}(hhh]h)}(hipc permissionsh]hipc permissions}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjaubah}(h]h ]h"]h$]h&]uh1j1hjaubeh}(h]h ]h"]h$]h&]uh1jhjahM hjaubah}(h]h ]h"]h$]h&]uh1j hjaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !__audit_ipc_set_perm (C function)c.__audit_ipc_set_permhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hTvoid __audit_ipc_set_perm (unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode)h]j)}(hSvoid __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode)h](j )}(hvoidh]hvoid}(hjBbhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>bhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM ubj2)}(h h]h }(hjQbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>bhhhjPbhM ubj{)}(h__audit_ipc_set_permh]j)}(h__audit_ipc_set_permh]h__audit_ipc_set_perm}(hjcbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_bubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj>bhhhjPbhM ubj)}(h:(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode)h](j)}(hunsigned long qbytesh](j )}(hunsignedh]hunsigned}(hjbhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj{bubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{bubj )}(hlongh]hlong}(hjbhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj{bubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{bubj)}(hqbytesh]hqbytes}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{bubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwbubj)}(h uid_t uidh](h)}(hhh]j)}(huid_th]huid_t}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjbmodnameN classnameNj] j` )}jc ]jf )}jY jebsbc.__audit_ipc_set_permasbuh1hhjbubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbubj)}(huidh]huid}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwbubj)}(h gid_t gidh](h)}(hhh]j)}(hgid_th]hgid_t}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjcmodnameN classnameNj] j` )}jc ]jbc.__audit_ipc_set_permasbuh1hhjcubj2)}(h h]h }(hj;chhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hgidh]hgid}(hjIchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwbubj)}(h umode_t modeh](h)}(hhh]j)}(humode_th]humode_t}(hjechhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbcubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjgcmodnameN classnameNj] j` )}jc ]jbc.__audit_ipc_set_permasbuh1hhj^cubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^cubj)}(hmodeh]hmode}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^cubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjwbubeh}(h]h ]h"]h$]h&]jjuh1jhj>bhhhjPbhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj:bhhhjPbhM ubah}(h]j5bah ](jjeh"]h$]h&]jj)jhuh1jhjPbhM hj7bhhubj)}(hhh]h)}(h)record audit data for new ipc permissionsh]h)record audit data for new ipc permissions}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjchhubah}(h]h ]h"]h$]h&]uh1jhj7bhhhjPbhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjcjjcjjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``unsigned long qbytes`` msgq bytes ``uid_t uid`` msgq user id ``gid_t gid`` msgq group id ``umode_t mode`` msgq mode (permissions) **Description** Called only after audit_ipc_obj().h](h)}(h**Parameters**h]j)}(hjch]h Parameters}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjcubj )}(hhh](j)}(h$``unsigned long qbytes`` msgq bytes h](j)}(h``unsigned long qbytes``h]j)}(hjch]hunsigned long qbytes}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjcubj2)}(hhh]h)}(h msgq bytesh]h msgq bytes}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhM hjdubah}(h]h ]h"]h$]h&]uh1j1hjcubeh}(h]h ]h"]h$]h&]uh1jhjdhM hjcubj)}(h``uid_t uid`` msgq user id h](j)}(h ``uid_t uid``h]j)}(hj5dh]h uid_t uid}(hj7dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3dubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj/dubj2)}(hhh]h)}(h msgq user idh]h msgq user id}(hjNdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJdhM hjKdubah}(h]h ]h"]h$]h&]uh1j1hj/dubeh}(h]h ]h"]h$]h&]uh1jhjJdhM hjcubj)}(h``gid_t gid`` msgq group id h](j)}(h ``gid_t gid``h]j)}(hjndh]h gid_t gid}(hjpdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjldubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjhdubj2)}(hhh]h)}(h msgq group idh]h msgq group id}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhM hjdubah}(h]h ]h"]h$]h&]uh1j1hjhdubeh}(h]h ]h"]h$]h&]uh1jhjdhM hjcubj)}(h)``umode_t mode`` msgq mode (permissions) h](j)}(h``umode_t mode``h]j)}(hjdh]h umode_t mode}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjdubj2)}(hhh]h)}(hmsgq mode (permissions)h]hmsgq mode (permissions)}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhM hjdubah}(h]h ]h"]h$]h&]uh1j1hjdubeh}(h]h ]h"]h$]h&]uh1jhjdhM hjcubeh}(h]h ]h"]h$]h&]uh1j hjcubh)}(h**Description**h]j)}(hjdh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjcubh)}(h"Called only after audit_ipc_obj().h]h"Called only after audit_ipc_obj().}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjcubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_socketcall (C function)c.__audit_socketcallhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h7int __audit_socketcall (int nargs, unsigned long *args)h]j)}(h6int __audit_socketcall(int nargs, unsigned long *args)h](j )}(hinth]hint}(hj'ehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#ehhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM2 ubj2)}(h h]h }(hj6ehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#ehhhj5ehM2 ubj{)}(h__audit_socketcallh]j)}(h__audit_socketcallh]h__audit_socketcall}(hjHehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDeubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj#ehhhj5ehM2 ubj)}(h (int nargs, unsigned long *args)h](j)}(h int nargsh](j )}(hinth]hint}(hjdehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj`eubj2)}(h h]h }(hjrehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`eubj)}(hnargsh]hnargs}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`eubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\eubj)}(hunsigned long *argsh](j )}(hunsignedh]hunsigned}(hjehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjeubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjeubj )}(hlongh]hlong}(hjehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjeubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjeubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(hargsh]hargs}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\eubeh}(h]h ]h"]h$]h&]jjuh1jhj#ehhhj5ehM2 ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjehhhj5ehM2 ubah}(h]jeah ](jjeh"]h$]h&]jj)jhuh1jhj5ehM2 hjehhubj)}(hhh]h)}(h$record audit data for sys_socketcallh]h$record audit data for sys_socketcall}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM2 hjfhhubah}(h]h ]h"]h$]h&]uh1jhjehhhj5ehM2 ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj fjj fjjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``int nargs`` number of args, which should not be more than AUDITSC_ARGS. ``unsigned long *args`` args arrayh](h)}(h**Parameters**h]j)}(hj*fh]h Parameters}(hj,fhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(fubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM6 hj$fubj )}(hhh](j)}(hJ``int nargs`` number of args, which should not be more than AUDITSC_ARGS. h](j)}(h ``int nargs``h]j)}(hjIfh]h int nargs}(hjKfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGfubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM3 hjCfubj2)}(hhh]h)}(h;number of args, which should not be more than AUDITSC_ARGS.h]h;number of args, which should not be more than AUDITSC_ARGS.}(hjbfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^fhM3 hj_fubah}(h]h ]h"]h$]h&]uh1j1hjCfubeh}(h]h ]h"]h$]h&]uh1jhj^fhM3 hj@fubj)}(h"``unsigned long *args`` args arrayh](j)}(h``unsigned long *args``h]j)}(hjfh]hunsigned long *args}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM5 hj|fubj2)}(hhh]h)}(h args arrayh]h args array}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM4 hjfubah}(h]h ]h"]h$]h&]uh1j1hj|fubeh}(h]h ]h"]h$]h&]uh1jhjfhM5 hj@fubeh}(h]h ]h"]h$]h&]uh1j hj$fubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_fd_pair (C function)c.__audit_fd_pairhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h'void __audit_fd_pair (int fd1, int fd2)h]j)}(h&void __audit_fd_pair(int fd1, int fd2)h](j )}(hvoidh]hvoid}(hjfhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMD ubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfhhhjfhMD ubj{)}(h__audit_fd_pairh]j)}(h__audit_fd_pairh]h__audit_fd_pair}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjfhhhjfhMD ubj)}(h(int fd1, int fd2)h](j)}(hint fd1h](j )}(hinth]hint}(hjghhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjgubj2)}(h h]h }(hj'ghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgubj)}(hfd1h]hfd1}(hj5ghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubj)}(hint fd2h](j )}(hinth]hint}(hjNghhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJgubj2)}(h h]h }(hj\ghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJgubj)}(hfd2h]hfd2}(hjjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubeh}(h]h ]h"]h$]h&]jjuh1jhjfhhhjfhMD ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjfhhhjfhMD ubah}(h]jfah ](jjeh"]h$]h&]jj)jhuh1jhjfhMD hjfhhubj)}(hhh]h)}(h)record audit data for pipe and socketpairh]h)record audit data for pipe and socketpair}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMD hjghhubah}(h]h ]h"]h$]h&]uh1jhjfhhhjfhMD ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjgjjgjjjuh1jhhhj:.hNhNubj)}(ha**Parameters** ``int fd1`` the first file descriptor ``int fd2`` the second file descriptorh](h)}(h**Parameters**h]j)}(hjgh]h Parameters}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMH hjgubj )}(hhh](j)}(h&``int fd1`` the first file descriptor h](j)}(h ``int fd1``h]j)}(hjgh]hint fd1}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chME hjgubj2)}(hhh]h)}(hthe first file descriptorh]hthe first file descriptor}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghME hjgubah}(h]h ]h"]h$]h&]uh1j1hjgubeh}(h]h ]h"]h$]h&]uh1jhjghME hjgubj)}(h&``int fd2`` the second file descriptorh](j)}(h ``int fd2``h]j)}(hjhh]hint fd2}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMG hjhubj2)}(hhh]h)}(hthe second file descriptorh]hthe second file descriptor}(hj'hhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMF hj$hubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhj#hhMG hjgubeh}(h]h ]h"]h$]h&]uh1j hjgubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_sockaddr (C function)c.__audit_sockaddrhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h'int __audit_sockaddr (int len, void *a)h]j)}(h&int __audit_sockaddr(int len, void *a)h](j )}(hinth]hint}(hjhhhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdhhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMR ubj2)}(h h]h }(hjwhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdhhhhjvhhMR ubj{)}(h__audit_sockaddrh]j)}(h__audit_sockaddrh]h__audit_sockaddr}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjdhhhhjvhhMR ubj)}(h(int len, void *a)h](j)}(hint lenh](j )}(hinth]hint}(hjhhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhubj)}(hlenh]hlen}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubj)}(hvoid *ah](j )}(hvoidh]hvoid}(hjhhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhubj)}(hjh]h*}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj)}(hjh]ha}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjhubeh}(h]h ]h"]h$]h&]jjuh1jhjdhhhhjvhhMR ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj`hhhhjvhhMR ubah}(h]j[hah ](jjeh"]h$]h&]jj)jhuh1jhjvhhMR hj]hhhubj)}(hhh]h)}(h7record audit data for sys_bind, sys_connect, sys_sendtoh]h7record audit data for sys_bind, sys_connect, sys_sendto}(hj,ihhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMR hj)ihhubah}(h]h ]h"]h$]h&]uh1jhj]hhhhjvhhMR ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjDijjDijjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``int len`` data length in user space ``void *a`` data address in kernel space **Description** Returns 0 for success or NULL context or < 0 on error.h](h)}(h**Parameters**h]j)}(hjNih]h Parameters}(hjPihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLiubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMV hjHiubj )}(hhh](j)}(h&``int len`` data length in user space h](j)}(h ``int len``h]j)}(hjmih]hint len}(hjoihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkiubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMS hjgiubj2)}(hhh]h)}(hdata length in user spaceh]hdata length in user space}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihMS hjiubah}(h]h ]h"]h$]h&]uh1j1hjgiubeh}(h]h ]h"]h$]h&]uh1jhjihMS hjdiubj)}(h)``void *a`` data address in kernel space h](j)}(h ``void *a``h]j)}(hjih]hvoid *a}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMT hjiubj2)}(hhh]h)}(hdata address in kernel spaceh]hdata address in kernel space}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihMT hjiubah}(h]h ]h"]h$]h&]uh1j1hjiubeh}(h]h ]h"]h$]h&]uh1jhjihMT hjdiubeh}(h]h ]h"]h$]h&]uh1j hjHiubh)}(h**Description**h]j)}(hjih]h Description}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMV hjHiubh)}(h6Returns 0 for success or NULL context or < 0 on error.h]h6Returns 0 for success or NULL context or < 0 on error.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMU hjHiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &audit_signal_info_syscall (C function)c.audit_signal_info_syscallhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h5int audit_signal_info_syscall (struct task_struct *t)h]j)}(h4int audit_signal_info_syscall(struct task_struct *t)h](j )}(hinth]hint}(hj&jhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj"jhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMv ubj2)}(h h]h }(hj5jhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"jhhhj4jhMv ubj{)}(haudit_signal_info_syscallh]j)}(haudit_signal_info_syscallh]haudit_signal_info_syscall}(hjGjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj"jhhhj4jhMv ubj)}(h(struct task_struct *t)h]j)}(hstruct task_struct *th](j)}(hjAh]hstruct}(hjcjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_jubj2)}(h h]h }(hjpjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_jubh)}(hhh]j)}(h task_structh]h task_struct}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~jubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjjmodnameN classnameNj] j` )}jc ]jf )}jY jIjsbc.audit_signal_info_syscallasbuh1hhj_jubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_jubj)}(hjh]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_jubj)}(hth]ht}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_jubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj[jubah}(h]h ]h"]h$]h&]jjuh1jhj"jhhhj4jhMv ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjjhhhj4jhMv ubah}(h]jjah ](jjeh"]h$]h&]jj)jhuh1jhj4jhMv hjjhhubj)}(hhh]h)}(hrecord signal info for syscallsh]hrecord signal info for syscalls}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMv hjjhhubah}(h]h ]h"]h$]h&]uh1jhjjhhhj4jhMv ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``struct task_struct *t`` task being signaled **Description** If the audit subsystem is being terminated, record the task (pid) and uid that is doing that.h](h)}(h**Parameters**h]j)}(hjkh]h Parameters}(hj khhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMz hjkubj )}(hhh]j)}(h.``struct task_struct *t`` task being signaled h](j)}(h``struct task_struct *t``h]j)}(hj'kh]hstruct task_struct *t}(hj)khhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%kubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMw hj!kubj2)}(hhh]h)}(htask being signaledh]htask being signaled}(hj@khhhNhNubah}(h]h ]h"]h$]h&]uh1hhjah"]h$]h&]uh1j1hjkhhhjkhM ubj{)}(h__audit_log_bprm_fcapsh]j)}(h__audit_log_bprm_fcapsh]h__audit_log_bprm_fcaps}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjkhhhjkhM ubj)}(hK(struct linux_binprm *bprm, const struct cred *new, const struct cred *old)h](j)}(hstruct linux_binprm *bprmh](j)}(hjAh]hstruct}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj2)}(h h]h }(hjkhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubh)}(hhh]j)}(h linux_binprmh]h linux_binprm}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlmodnameN classnameNj] j` )}jc ]jf )}jY jksbc.__audit_log_bprm_fcapsasbuh1hhjkubj2)}(h h]h }(hj"lhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubj)}(hjh]h*}(hj0lhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(hbprmh]hbprm}(hj=lhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjkubj)}(hconst struct cred *newh](j)}(hjh]hconst}(hjVlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRlubj2)}(h h]h }(hjclhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRlubj)}(hjAh]hstruct}(hjqlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRlubj2)}(h h]h }(hj~lhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRlubh)}(hhh]j)}(hcredh]hcred}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlmodnameN classnameNj] j` )}jc ]jlc.__audit_log_bprm_fcapsasbuh1hhjRlubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRlubj)}(hjh]h*}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRlubj)}(hnewh]hnew}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjkubj)}(hconst struct cred *oldh](j)}(hjh]hconst}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjAh]hstruct}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj2)}(h h]h }(hj mhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubh)}(hhh]j)}(hcredh]hcred}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmmodnameN classnameNj] j` )}jc ]jlc.__audit_log_bprm_fcapsasbuh1hhjlubj2)}(h h]h }(hj8mhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjh]h*}(hjFmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(holdh]hold}(hjSmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjkubeh}(h]h ]h"]h$]h&]jjuh1jhjkhhhjkhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjkhhhjkhM ubah}(h]jkah ](jjeh"]h$]h&]jj)jhuh1jhjkhM hjkhhubj)}(hhh]h)}(h9store information about a loading bprm and relevant fcapsh]h9store information about a loading bprm and relevant fcaps}(hj}mhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjzmhhubah}(h]h ]h"]h$]h&]uh1jhjkhhhjkhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjmjjmjjjuh1jhhhj:.hNhNubj)}(hXp**Parameters** ``struct linux_binprm *bprm`` pointer to the bprm being processed ``const struct cred *new`` the proposed new credentials ``const struct cred *old`` the old credentials **Description** Simply check if the proc already has the caps given by the file and if not store the priv escalation info for later auditing at the end of the syscall -Erich](h)}(h**Parameters**h]j)}(hjmh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjmubj )}(hhh](j)}(hB``struct linux_binprm *bprm`` pointer to the bprm being processed h](j)}(h``struct linux_binprm *bprm``h]j)}(hjmh]hstruct linux_binprm *bprm}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjmubj2)}(hhh]h)}(h#pointer to the bprm being processedh]h#pointer to the bprm being processed}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhM hjmubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjmhM hjmubj)}(h8``const struct cred *new`` the proposed new credentials h](j)}(h``const struct cred *new``h]j)}(hjmh]hconst struct cred *new}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjmubj2)}(hhh]h)}(hthe proposed new credentialsh]hthe proposed new credentials}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj nhM hj nubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhj nhM hjmubj)}(h/``const struct cred *old`` the old credentials h](j)}(h``const struct cred *old``h]j)}(hj0nh]hconst struct cred *old}(hj2nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.nubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj*nubj2)}(hhh]h)}(hthe old credentialsh]hthe old credentials}(hjInhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEnhM hjFnubah}(h]h ]h"]h$]h&]uh1j1hj*nubeh}(h]h ]h"]h$]h&]uh1jhjEnhM hjmubeh}(h]h ]h"]h$]h&]uh1j hjmubh)}(h**Description**h]j)}(hjknh]h Description}(hjmnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjinubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjmubh)}(hSimply check if the proc already has the caps given by the file and if not store the priv escalation info for later auditing at the end of the syscallh]hSimply check if the proc already has the caps given by the file and if not store the priv escalation info for later auditing at the end of the syscall}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjmubh)}(h-Erich]h-Eric}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __audit_log_capset (C function)c.__audit_log_capsethNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hHvoid __audit_log_capset (const struct cred *new, const struct cred *old)h]j)}(hGvoid __audit_log_capset(const struct cred *new, const struct cred *old)h](j )}(hvoidh]hvoid}(hjnhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnhhhjnhM ubj{)}(h__audit_log_capseth]j)}(h__audit_log_capseth]h__audit_log_capset}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnhhhjnhM ubj)}(h0(const struct cred *new, const struct cred *old)h](j)}(hconst struct cred *newh](j)}(hjh]hconst}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj2)}(h h]h }(hj ohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubj)}(hjAh]hstruct}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj2)}(h h]h }(hj$ohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubh)}(hhh]j)}(hcredh]hcred}(hj5ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2oubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7omodnameN classnameNj] j` )}jc ]jf )}jY jnsbc.__audit_log_capsetasbuh1hhjnubj2)}(h h]h }(hjUohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnubj)}(hjh]h*}(hjcohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(hnewh]hnew}(hjpohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnubj)}(hconst struct cred *oldh](j)}(hjh]hconst}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjoubj)}(hjAh]hstruct}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjoubh)}(hhh]j)}(hcredh]hcred}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjomodnameN classnameNj] j` )}jc ]jQoc.__audit_log_capsetasbuh1hhjoubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjoubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(holdh]hold}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnubeh}(h]h ]h"]h$]h&]jjuh1jhjnhhhjnhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjnhhhjnhM ubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1jhjnhM hjnhhubj)}(hhh]h)}(h;store information about the arguments to the capset syscallh]h;store information about the arguments to the capset syscall}(hj%phhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj"phhubah}(h]h ]h"]h$]h&]uh1jhjnhhhjnhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj=pjj=pjjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``const struct cred *new`` the new credentials ``const struct cred *old`` the old (current) credentials **Description** Record the arguments userspace sent to sys_capset for later printing by the audit system if applicableh](h)}(h**Parameters**h]j)}(hjGph]h Parameters}(hjIphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEpubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjApubj )}(hhh](j)}(h/``const struct cred *new`` the new credentials h](j)}(h``const struct cred *new``h]j)}(hjfph]hconst struct cred *new}(hjhphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdpubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hj`pubj2)}(hhh]h)}(hthe new credentialsh]hthe new credentials}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{phM hj|pubah}(h]h ]h"]h$]h&]uh1j1hj`pubeh}(h]h ]h"]h$]h&]uh1jhj{phM hj]pubj)}(h9``const struct cred *old`` the old (current) credentials h](j)}(h``const struct cred *old``h]j)}(hjph]hconst struct cred *old}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjpubj2)}(hhh]h)}(hthe old (current) credentialsh]hthe old (current) credentials}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphM hjpubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhjphM hj]pubeh}(h]h ]h"]h$]h&]uh1j hjApubh)}(h**Description**h]j)}(hjph]h Description}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjApubh)}(hfRecord the arguments userspace sent to sys_capset for later printing by the audit system if applicableh]hfRecord the arguments userspace sent to sys_capset for later printing by the audit system if applicable}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM hjApubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_core_dumps (C function)c.audit_core_dumpshNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h"void audit_core_dumps (long signr)h]j)}(h!void audit_core_dumps(long signr)h](j )}(hvoidh]hvoid}(hjqhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjqhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM\ ubj2)}(h h]h }(hj.qhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqhhhj-qhM\ ubj{)}(haudit_core_dumpsh]j)}(haudit_core_dumpsh]haudit_core_dumps}(hj@qhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjah"]h$]h&]uh1j1hjXqubj)}(hsignrh]hsignr}(hjxqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXqubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTqubah}(h]h ]h"]h$]h&]jjuh1jhjqhhhj-qhM\ ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjqhhhj-qhM\ ubah}(h]jqah ](jjeh"]h$]h&]jj)jhuh1jhj-qhM\ hjqhhubj)}(hhh]h)}(h6record information about processes that end abnormallyh]h6record information about processes that end abnormally}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM\ hjqhhubah}(h]h ]h"]h$]h&]uh1jhjqhhhj-qhM\ ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjqjjqjjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``long signr`` signal value **Description** If a process ends with a core dump, something fishy is going on and we should record the event for investigation.h](h)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM` hjqubj )}(hhh]j)}(h``long signr`` signal value h](j)}(h``long signr``h]j)}(hjqh]h long signr}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM] hjqubj2)}(hhh]h)}(h signal valueh]h signal value}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhM] hjqubah}(h]h ]h"]h$]h&]uh1j1hjqubeh}(h]h ]h"]h$]h&]uh1jhjqhM] hjqubah}(h]h ]h"]h$]h&]uh1j hjqubh)}(h**Description**h]j)}(hjrh]h Description}(hj rhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM_ hjqubh)}(hqIf a process ends with a core dump, something fishy is going on and we should record the event for investigation.h]hqIf a process ends with a core dump, something fishy is going on and we should record the event for investigation.}(hj4rhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chM^ hjqubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_seccomp (C function)c.audit_seccomphNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h@void audit_seccomp (unsigned long syscall, long signr, int code)h]j)}(h?void audit_seccomp(unsigned long syscall, long signr, int code)h](j )}(hvoidh]hvoid}(hjcrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj_rhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMu ubj2)}(h h]h }(hjrrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_rhhhjqrhMu ubj{)}(h audit_seccomph]j)}(h audit_seccomph]h audit_seccomp}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj_rhhhjqrhMu ubj)}(h-(unsigned long syscall, long signr, int code)h](j)}(hunsigned long syscallh](j )}(hunsignedh]hunsigned}(hjrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj )}(hlongh]hlong}(hjrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hsyscallh]hsyscall}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjrubj)}(h long signrh](j )}(hlongh]hlong}(hjrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hsignrh]hsignr}(hj shhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjrubj)}(hint codeh](j )}(hinth]hint}(hj&shhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj"subj2)}(h h]h }(hj4shhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"subj)}(hcodeh]hcode}(hjBshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"subeh}(h]h ]h"]h$]h&]noemphjjuh1jhjrubeh}(h]h ]h"]h$]h&]jjuh1jhj_rhhhjqrhMu ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj[rhhhjqrhMu ubah}(h]jVrah ](jjeh"]h$]h&]jj)jhuh1jhjqrhMu hjXrhhubj)}(hhh]h)}(h)record information about a seccomp actionh]h)record information about a seccomp action}(hjlshhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMu hjishhubah}(h]h ]h"]h$]h&]uh1jhjXrhhhjqrhMu ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjsjjsjjjuh1jhhhj:.hNhNubj)}(hX**Parameters** ``unsigned long syscall`` syscall number ``long signr`` signal value ``int code`` the seccomp action **Description** Record the information associated with a seccomp action. Event filtering for seccomp actions that are not to be logged is done in seccomp_log(). Therefore, this function forces auditing independent of the audit_enabled and dummy context state because seccomp actions should be logged even when audit is not in use.h](h)}(h**Parameters**h]j)}(hjsh]h Parameters}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMy hjsubj )}(hhh](j)}(h)``unsigned long syscall`` syscall number h](j)}(h``unsigned long syscall``h]j)}(hjsh]hunsigned long syscall}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMv hjsubj2)}(hhh]h)}(hsyscall numberh]hsyscall number}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshMv hjsubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjshMv hjsubj)}(h``long signr`` signal value h](j)}(h``long signr``h]j)}(hjsh]h long signr}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMw hjsubj2)}(hhh]h)}(h signal valueh]h signal value}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshMw hjsubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjshMw hjsubj)}(h ``int code`` the seccomp action h](j)}(h ``int code``h]j)}(hjth]hint code}(hj!thhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMx hjtubj2)}(hhh]h)}(hthe seccomp actionh]hthe seccomp action}(hj8thhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4thMx hj5tubah}(h]h ]h"]h$]h&]uh1j1hjtubeh}(h]h ]h"]h$]h&]uh1jhj4thMx hjsubeh}(h]h ]h"]h$]h&]uh1j hjsubh)}(h**Description**h]j)}(hjZth]h Description}(hj\thhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXtubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMz hjsubh)}(hX:Record the information associated with a seccomp action. Event filtering for seccomp actions that are not to be logged is done in seccomp_log(). Therefore, this function forces auditing independent of the audit_enabled and dummy context state because seccomp actions should be logged even when audit is not in use.h]hX:Record the information associated with a seccomp action. Event filtering for seccomp actions that are not to be logged is done in seccomp_log(). Therefore, this function forces auditing independent of the audit_enabled and dummy context state because seccomp actions should be logged even when audit is not in use.}(hjpthhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:295: ./kernel/auditsc.chMy hjsubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j audit_rule_change (C function)c.audit_rule_changehNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hDint audit_rule_change (int type, int seq, void *data, size_t datasz)h]j)}(hCint audit_rule_change(int type, int seq, void *data, size_t datasz)h](j )}(hinth]hint}(hjthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjthhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMgubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjthhhjthMgubj{)}(haudit_rule_changeh]j)}(haudit_rule_changeh]haudit_rule_change}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjthhhjthMgubj)}(h.(int type, int seq, void *data, size_t datasz)h](j)}(hint typeh](j )}(hinth]hint}(hjthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjtubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubj)}(htypeh]htype}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubj)}(hint seqh](j )}(hinth]hint}(hjuhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj uubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj uubj)}(hseqh]hseq}(hj-uhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj uubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubj)}(h void *datah](j )}(hvoidh]hvoid}(hjFuhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBuubj2)}(h h]h }(hjTuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBuubj)}(hjh]h*}(hjbuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBuubj)}(hdatah]hdata}(hjouhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBuubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubj)}(h size_t dataszh](h)}(hhh]j)}(hsize_th]hsize_t}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjumodnameN classnameNj] j` )}jc ]jf )}jY jtsbc.audit_rule_changeasbuh1hhjuubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjuubj)}(hdataszh]hdatasz}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubeh}(h]h ]h"]h$]h&]jjuh1jhjthhhjthMgubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjthhhjthMgubah}(h]jtah ](jjeh"]h$]h&]jj)jhuh1jhjthMghjthhubj)}(hhh]h)}(h-apply all rules to the specified message typeh]h-apply all rules to the specified message type}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMghjuhhubah}(h]h ]h"]h$]h&]uh1jhjthhhjthMgubeh}(h]h ](jfunctioneh"]h$]h&]jjjjujjujjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``int type`` audit message type ``int seq`` netlink audit message sequence (serial) number ``void *data`` payload data ``size_t datasz`` size of payload datah](h)}(h**Parameters**h]j)}(hjvh]h Parameters}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMkhjuubj )}(hhh](j)}(h ``int type`` audit message type h](j)}(h ``int type``h]j)}(hj$vh]hint type}(hj&vhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"vubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhhjvubj2)}(hhh]h)}(haudit message typeh]haudit message type}(hj=vhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9vhMhhj:vubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhj9vhMhhjvubj)}(h;``int seq`` netlink audit message sequence (serial) number h](j)}(h ``int seq``h]j)}(hj]vh]hint seq}(hj_vhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[vubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMihjWvubj2)}(hhh]h)}(h.netlink audit message sequence (serial) numberh]h.netlink audit message sequence (serial) number}(hjvvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrvhMihjsvubah}(h]h ]h"]h$]h&]uh1j1hjWvubeh}(h]h ]h"]h$]h&]uh1jhjrvhMihjvubj)}(h``void *data`` payload data h](j)}(h``void *data``h]j)}(hjvh]h void *data}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMjhjvubj2)}(hhh]h)}(h payload datah]h payload data}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhMjhjvubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjvhMjhjvubj)}(h&``size_t datasz`` size of payload datah](j)}(h``size_t datasz``h]j)}(hjvh]h size_t datasz}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMlhjvubj2)}(hhh]h)}(hsize of payload datah]hsize of payload data}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMkhjvubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjvhMlhjvubeh}(h]h ]h"]h$]h&]uh1j hjuubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "audit_list_rules_send (C function)c.audit_list_rules_sendhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(h@int audit_list_rules_send (struct sk_buff *request_skb, int seq)h]j)}(h?int audit_list_rules_send(struct sk_buff *request_skb, int seq)h](j )}(hinth]hint}(hj)whhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj%whhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMubj2)}(h h]h }(hj8whhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%whhhj7whMubj{)}(haudit_list_rules_sendh]j)}(haudit_list_rules_sendh]haudit_list_rules_send}(hjJwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFwubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj%whhhj7whMubj)}(h&(struct sk_buff *request_skb, int seq)h](j)}(hstruct sk_buff *request_skbh](j)}(hjAh]hstruct}(hjfwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbwubj2)}(h h]h }(hjswhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbwubh)}(hhh]j)}(hsk_buffh]hsk_buff}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjwmodnameN classnameNj] j` )}jc ]jf )}jY jLwsbc.audit_list_rules_sendasbuh1hhjbwubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbwubj)}(hjh]h*}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbwubj)}(h request_skbh]h request_skb}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj^wubj)}(hint seqh](j )}(hinth]hint}(hjwhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjwubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubj)}(hseqh]hseq}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj^wubeh}(h]h ]h"]h$]h&]jjuh1jhj%whhhj7whMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj!whhhj7whMubah}(h]jwah ](jjeh"]h$]h&]jj)jhuh1jhj7whMhjwhhubj)}(hhh]h)}(hlist the audit rulesh]hlist the audit rules}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhjxhhubah}(h]h ]h"]h$]h&]uh1jhjwhhhj7whMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj6xjj6xjjjuh1jhhhj:.hNhNubj)}(h**Parameters** ``struct sk_buff *request_skb`` skb of request we are replying to (used to target the reply) ``int seq`` netlink audit message sequence (serial) numberh](h)}(h**Parameters**h]j)}(hj@xh]h Parameters}(hjBxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>xubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhj:xubj )}(hhh](j)}(h]``struct sk_buff *request_skb`` skb of request we are replying to (used to target the reply) h](j)}(h``struct sk_buff *request_skb``h]j)}(hj_xh]hstruct sk_buff *request_skb}(hjaxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]xubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhjYxubj2)}(hhh]h)}(hah"]h$]h&]uh1j1hjxhhhjyhMubj{)}(h parent_lenh]j)}(h parent_lenh]h parent_len}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjxhhhjyhMubj)}(h(const char *path)h]j)}(hconst char *pathh](j)}(hjh]hconst}(hj/yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+yubj2)}(h h]h }(hjah"]h$]h&]uh1j1hj+yubj )}(hcharh]hchar}(hjJyhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+yubj2)}(h h]h }(hjXyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+yubj)}(hjh]h*}(hjfyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+yubj)}(hpathh]hpath}(hjsyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+yubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'yubah}(h]h ]h"]h$]h&]jjuh1jhjxhhhjyhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjxhhhjyhMubah}(h]jxah ](jjeh"]h$]h&]jj)jhuh1jhjyhMhjxhhubj)}(hhh]h)}(h3find the length of the parent portion of a pathnameh]h3find the length of the parent portion of a pathname}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhjyhhubah}(h]h ]h"]h$]h&]uh1jhjxhhhjyhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjyjjyjjjuh1jhhhj:.hNhNubj)}(hL**Parameters** ``const char *path`` pathname of which to determine lengthh](h)}(h**Parameters**h]j)}(hjyh]h Parameters}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhjyubj )}(hhh]j)}(h:``const char *path`` pathname of which to determine lengthh](j)}(h``const char *path``h]j)}(hjyh]hconst char *path}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhjyubj2)}(hhh]h)}(h%pathname of which to determine lengthh]h%pathname of which to determine length}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhjyubah}(h]h ]h"]h$]h&]uh1j1hjyubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjyubah}(h]h ]h"]h$]h&]uh1j hjyubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %audit_compare_dname_path (C function)c.audit_compare_dname_pathhNtauh1hhj:.hhhNhNubj)}(hhh](j)}(hXint audit_compare_dname_path (const struct qstr *dname, const char *path, int parentlen)h]j)}(hWint audit_compare_dname_path(const struct qstr *dname, const char *path, int parentlen)h](j )}(hinth]hint}(hj8zhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj4zhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMubj2)}(h h]h }(hjGzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4zhhhjFzhMubj{)}(haudit_compare_dname_pathh]j)}(haudit_compare_dname_pathh]haudit_compare_dname_path}(hjYzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUzubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj4zhhhjFzhMubj)}(h;(const struct qstr *dname, const char *path, int parentlen)h](j)}(hconst struct qstr *dnameh](j)}(hjh]hconst}(hjuzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqzubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqzubj)}(hjAh]hstruct}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqzubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqzubh)}(hhh]j)}(hqstrh]hqstr}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjzmodnameN classnameNj] j` )}jc ]jf )}jY j[zsbc.audit_compare_dname_pathasbuh1hhjqzubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqzubj)}(hjh]h*}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqzubj)}(hdnameh]hdname}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqzubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjmzubj)}(hconst char *pathh](j)}(hjh]hconst}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjzubj )}(hcharh]hchar}(hj{hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjzubj2)}(h h]h }(hj+{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjzubj)}(hjh]h*}(hj9{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubj)}(hpathh]hpath}(hjF{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjmzubj)}(h int parentlenh](j )}(hinth]hint}(hj_{hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[{ubj2)}(h h]h }(hjm{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[{ubj)}(h parentlenh]h parentlen}(hj{{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjmzubeh}(h]h ]h"]h$]h&]jjuh1jhj4zhhhjFzhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj0zhhhjFzhMubah}(h]j+zah ](jjeh"]h$]h&]jj)jhuh1jhjFzhMhj-zhhubj)}(hhh]h)}(h[compare given dentry name with last component in given path. Return of 0 indicates a match.h]h[compare given dentry name with last component in given path. Return of 0 indicates a match.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhj{hhubah}(h]h ]h"]h$]h&]uh1jhj-zhhhjFzhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj{jj{jjjuh1jhhhj:.hNhNubj)}(hX **Parameters** ``const struct qstr *dname`` dentry name that we're comparing ``const char *path`` full pathname that we're comparing ``int parentlen`` length of the parent if known. Passing in AUDIT_NAME_FULL here indicates that we must compute this value.h](h)}(h**Parameters**h]j)}(hj{h]h Parameters}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhj{ubj )}(hhh](j)}(h>``const struct qstr *dname`` dentry name that we're comparing h](j)}(h``const struct qstr *dname``h]j)}(hj{h]hconst struct qstr *dname}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhj{ubj2)}(hhh]h)}(h dentry name that we're comparingh]h"dentry name that we’re comparing}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMhj{ubah}(h]h ]h"]h$]h&]uh1j1hj{ubeh}(h]h ]h"]h$]h&]uh1jhj{hMhj{ubj)}(h8``const char *path`` full pathname that we're comparing h](j)}(h``const char *path``h]j)}(hj|h]hconst char *path}(hj!|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhj|ubj2)}(hhh]h)}(h"full pathname that we're comparingh]h$full pathname that we’re comparing}(hj8|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4|hMhj5|ubah}(h]h ]h"]h$]h&]uh1j1hj|ubeh}(h]h ]h"]h$]h&]uh1jhj4|hMhj{ubj)}(h{``int parentlen`` length of the parent if known. Passing in AUDIT_NAME_FULL here indicates that we must compute this value.h](j)}(h``int parentlen``h]j)}(hjX|h]h int parentlen}(hjZ|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV|ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:298: ./kernel/auditfilter.chMhjR|ubj2)}(hhh]h)}(hilength of the parent if known. Passing in AUDIT_NAME_FULL here indicates that we must compute this value.h]hilength of the parent if known. Passing in AUDIT_NAME_FULL here indicates that we must compute this value.}(hjq|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjm|hMhjn|ubah}(h]h ]h"]h$]h&]uh1j1hjR|ubeh}(h]h ]h"]h$]h&]uh1jhjm|hMhj{ubeh}(h]h ]h"]h$]h&]uh1j hj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:.hhhNhNubeh}(h]audit-interfacesah ]h"]audit interfacesah$]h&]uh1hhhhhhhhM"ubh)}(hhh](h)}(hAccounting Frameworkh]hAccounting Framework}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hhhhhM.ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j sys_acct (C function) c.sys_accthNtauh1hhj|hhhNhNubj)}(hhh](j)}(h(long sys_acct (const char __user * name)h]j)}(h&long sys_acct(const char __user *name)h](j )}(hlongh]hlong}(hj|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj|hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chMubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|hhhj|hMubj{)}(hsys_accth]j)}(hsys_accth]hsys_acct}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj|hhhj|hMubj)}(h(const char __user *name)h]j)}(hconst char __user *nameh](j)}(hjh]hconst}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj )}(hcharh]hchar}(hj"}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hj0}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubh__user}(hj}hhhNhNubj2)}(h h]h }(hjB}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj)}(hjh]h*}(hjP}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj)}(hnameh]hname}(hj]}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|ubah}(h]h ]h"]h$]h&]jjuh1jhj|hhhj|hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj|hhhj|hMubah}(h]j|ah ](jjeh"]h$]h&]jj)jhuh1jhj|hMhj|hhubj)}(hhh]h)}(h!enable/disable process accountingh]h!enable/disable process accounting}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chMhj}hhubah}(h]h ]h"]h$]h&]uh1jhj|hhhj|hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj}jj}jjjuh1jhhhj|hNhNubj)}(hX**Parameters** ``const char __user * name`` file name for accounting records or NULL to shutdown accounting **Description** sys_acct() is the only system call needed to implement process accounting. It takes the name of the file where accounting records should be written. If the filename is NULL, accounting will be shutdown. **Return** 0 for success or negative errno values for failure.h](h)}(h**Parameters**h]j)}(hj}h]h Parameters}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chMhj}ubj )}(hhh]j)}(h]``const char __user * name`` file name for accounting records or NULL to shutdown accounting h](j)}(h``const char __user * name``h]j)}(hj}h]hconst char __user * name}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chMhj}ubj2)}(hhh]h)}(h?file name for accounting records or NULL to shutdown accountingh]h?file name for accounting records or NULL to shutdown accounting}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hMhj}ubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhj}hMhj}ubah}(h]h ]h"]h$]h&]uh1j hj}ubh)}(h**Description**h]j)}(hj~h]h Description}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chMhj}ubh)}(hsys_acct() is the only system call needed to implement process accounting. It takes the name of the file where accounting records should be written. If the filename is NULL, accounting will be shutdown.h]hsys_acct() is the only system call needed to implement process accounting. It takes the name of the file where accounting records should be written. If the filename is NULL, accounting will be shutdown.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chMhj}ubh)}(h **Return**h]j)}(hj*~h]hReturn}(hj,~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(~ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chM"hj}ubh)}(h30 for success or negative errno values for failure.h]h30 for success or negative errno values for failure.}(hj@~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chM#hj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj|hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j acct_collect (C function)c.acct_collecthNtauh1hhj|hhhNhNubj)}(hhh](j)}(h1void acct_collect (long exitcode, int group_dead)h]j)}(h0void acct_collect(long exitcode, int group_dead)h](j )}(hvoidh]hvoid}(hjo~hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjk~hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chM)ubj2)}(h h]h }(hj~~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjk~hhhj}~hM)ubj{)}(h acct_collecth]j)}(h acct_collecth]h acct_collect}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjk~hhhj}~hM)ubj)}(h(long exitcode, int group_dead)h](j)}(h long exitcodeh](j )}(hlongh]hlong}(hj~hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~ubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubj)}(hexitcodeh]hexitcode}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~ubj)}(hint group_deadh](j )}(hinth]hint}(hj~hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~ubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubj)}(h group_deadh]h group_dead}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~ubeh}(h]h ]h"]h$]h&]jjuh1jhjk~hhhj}~hM)ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjg~hhhj}~hM)ubah}(h]jb~ah ](jjeh"]h$]h&]jj)jhuh1jhj}~hM)hjd~hhubj)}(hhh]h)}(h0collect accounting information into pacct_structh]h0collect accounting information into pacct_struct}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chM)hj$hhubah}(h]h ]h"]h$]h&]uh1jhjd~hhhj}~hM)ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj?jj?jjjuh1jhhhj|hNhNubj)}(h~**Parameters** ``long exitcode`` task exit code ``int group_dead`` not 0, if this thread is the last one in the process.h](h)}(h**Parameters**h]j)}(hjIh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chM-hjCubj )}(hhh](j)}(h!``long exitcode`` task exit code h](j)}(h``long exitcode``h]j)}(hjhh]h long exitcode}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chM*hjbubj2)}(hhh]h)}(htask exit codeh]htask exit code}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hM*hj~ubah}(h]h ]h"]h$]h&]uh1j1hjbubeh}(h]h ]h"]h$]h&]uh1jhj}hM*hj_ubj)}(hH``int group_dead`` not 0, if this thread is the last one in the process.h](j)}(h``int group_dead``h]j)}(hjh]hint group_dead}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chM,hjubj2)}(hhh]h)}(h5not 0, if this thread is the last one in the process.h]h5not 0, if this thread is the last one in the process.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chM+hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM,hj_ubeh}(h]h ]h"]h$]h&]uh1j hjCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj|hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j acct_process (C function)c.acct_processhNtauh1hhj|hhhNhNubj)}(hhh](j)}(hvoid acct_process (void)h]j)}(hvoid acct_process(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chMbubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj hMbubj{)}(h acct_processh]j)}(h acct_processh]h acct_process}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj hMbubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj8hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj0ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj hMbubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj hMbubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hMbhjhhubj)}(hhh]h)}(h.handles process accounting for an exiting taskh]h.handles process accounting for an exiting task}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chMbhj_hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hMbubeh}(h]h ](jfunctioneh"]h$]h&]jjjjzjjzjjjuh1jhhhj|hNhNubj)}(h'**Parameters** ``void`` no argumentsh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chMfhj~ubj )}(hhh]j)}(h``void`` no argumentsh](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chMhhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:304: ./kernel/acct.chKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhhjubah}(h]h ]h"]h$]h&]uh1j hj~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj|hhhNhNubeh}(h]accounting-frameworkah ]h"]accounting frameworkah$]h&]uh1hhhhhhhhM.ubh)}(hhh](h)}(h Block Devicesh]h Block Devices}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM4ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bio_vec (C struct) c.bio_vechNtauh1hhjhhhNhNubj)}(hhh](j)}(hbio_vech]j)}(hstruct bio_vech](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj#hKubj{)}(hbio_vech]j)}(hjh]hbio_vec}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj#hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj#hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj#hKhj hhubj)}(hhh]h)}(h/a contiguous range of physical memory addressesh]h/a contiguous range of physical memory addresses}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKhjUhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj#hKubeh}(h]h ](jstructeh"]h$]h&]jjjjpjjpjjjuh1jhhhjhNhNubj)}(hXX**Definition**:: struct bio_vec { struct page *bv_page; unsigned int bv_len; unsigned int bv_offset; }; **Members** ``bv_page`` First page associated with the address range. ``bv_len`` Number of bytes in the address range. ``bv_offset`` Start of the address range relative to the start of **bv_page**.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubh:}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKhjtubj7C)}(hlstruct bio_vec { struct page *bv_page; unsigned int bv_len; unsigned int bv_offset; };h]hlstruct bio_vec { struct page *bv_page; unsigned int bv_len; unsigned int bv_offset; };}hjsbah}(h]h ]h"]h$]h&]jjuh1j6ChY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKhjtubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK hjtubj )}(hhh](j)}(h:``bv_page`` First page associated with the address range. h](j)}(h ``bv_page``h]j)}(hjŁh]hbv_page}(hjǁhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÁubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKhjubj2)}(hhh]h)}(h-First page associated with the address range.h]h-First page associated with the address range.}(hjށhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjځhKhjہubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjځhKhjubj)}(h1``bv_len`` Number of bytes in the address range. h](j)}(h ``bv_len``h]j)}(hjh]hbv_len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKhjubj2)}(hhh]h)}(h%Number of bytes in the address range.h]h%Number of bytes in the address range.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hN``bv_offset`` Start of the address range relative to the start of **bv_page**.h](j)}(h ``bv_offset``h]j)}(hj7h]h bv_offset}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKhj1ubj2)}(hhh]h)}(h@Start of the address range relative to the start of **bv_page**.h](h4Start of the address range relative to the start of }(hjPhhhNhNubj)}(h **bv_page**h]hbv_page}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKhjMubah}(h]h ]h"]h$]h&]uh1j1hj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhKhjubeh}(h]h ]h"]h$]h&]uh1j hjtubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKhjhhubh)}(htAll pages within a bio_vec starting from **bv_page** are contiguous and can simply be iterated (see bvec_advance()).h](h)All pages within a bio_vec starting from }(hjhhhNhNubj)}(h **bv_page**h]hbv_page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh@ are contiguous and can simply be iterated (see bvec_advance()).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bvec_set_page (C function)c.bvec_set_pagehNtauh1hhjhhhNhNubj)}(hhh](j)}(havoid bvec_set_page (struct bio_vec *bv, struct page *page, unsigned int len, unsigned int offset)h]j)}(h`void bvec_set_page(struct bio_vec *bv, struct page *page, unsigned int len, unsigned int offset)h](j )}(hvoidh]hvoid}(hj܂hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj؂hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK#ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj؂hhhjhK#ubj{)}(h bvec_set_pageh]j)}(h bvec_set_pageh]h bvec_set_page}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj؂hhhjhK#ubj)}(hN(struct bio_vec *bv, struct page *page, unsigned int len, unsigned int offset)h](j)}(hstruct bio_vec *bvh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbio_vech]hbio_vec}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj9modnameN classnameNj] j` )}jc ]jf )}jY jsbc.bvec_set_pageasbuh1hhjubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbvh]hbv}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct page *pageh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jSc.bvec_set_pageasbuh1hhjubj2)}(h h]h }(hjǃhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjՃhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int lenh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj%hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int offseth](j )}(hunsignedh]hunsigned}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj )}(hinth]hint}(hjhhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj)}(hoffseth]hoffset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj؂hhhjhK#ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjԂhhhjhK#ubah}(h]jςah ](jjeh"]h$]h&]jj)jhuh1jhjhK#hjтhhubj)}(hhh]h)}(h)initialize a bvec based off a struct pageh]h)initialize a bvec based off a struct page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK#hjhhubah}(h]h ]h"]h$]h&]uh1jhjтhhhjhK#ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjƄjjƄjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct bio_vec *bv`` bvec to initialize ``struct page *page`` page the bvec should point to ``unsigned int len`` length of the bvec ``unsigned int offset`` offset into the pageh](h)}(h**Parameters**h]j)}(hjЄh]h Parameters}(hj҄hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj΄ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK'hjʄubj )}(hhh](j)}(h*``struct bio_vec *bv`` bvec to initialize h](j)}(h``struct bio_vec *bv``h]j)}(hjh]hstruct bio_vec *bv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK$hjubj2)}(hhh]h)}(hbvec to initializeh]hbvec to initialize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK$hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK$hjubj)}(h4``struct page *page`` page the bvec should point to h](j)}(h``struct page *page``h]j)}(hj(h]hstruct page *page}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK%hj"ubj2)}(hhh]h)}(hpage the bvec should point toh]hpage the bvec should point to}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK%hj>ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hK%hjubj)}(h(``unsigned int len`` length of the bvec h](j)}(h``unsigned int len``h]j)}(hjah]hunsigned int len}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK&hj[ubj2)}(hhh]h)}(hlength of the bvech]hlength of the bvec}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhK&hjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhK&hjubj)}(h,``unsigned int offset`` offset into the pageh](j)}(h``unsigned int offset``h]j)}(hjh]hunsigned int offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK(hjubj2)}(hhh]h)}(hoffset into the pageh]hoffset into the page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK'hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK(hjubeh}(h]h ]h"]h$]h&]uh1j hjʄubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bvec_set_folio (C function)c.bvec_set_foliohNtauh1hhjhhhNhNubj)}(hhh](j)}(hXvoid bvec_set_folio (struct bio_vec *bv, struct folio *folio, size_t len, size_t offset)h]j)}(hWvoid bvec_set_folio(struct bio_vec *bv, struct folio *folio, size_t len, size_t offset)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK2ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhK2ubj{)}(hbvec_set_folioh]j)}(hbvec_set_folioh]hbvec_set_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhK2ubj)}(hD(struct bio_vec *bv, struct folio *folio, size_t len, size_t offset)h](j)}(hstruct bio_vec *bvh](j)}(hjAh]hstruct}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubh)}(hhh]j)}(hbio_vech]hbio_vec}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjQmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.bvec_set_folioasbuh1hhj-ubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hbvh]hbv}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubj)}(hstruct folio *folioh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjÆmodnameN classnameNj] j` )}jc ]jkc.bvec_set_folioasbuh1hhjubj2)}(h h]h }(hj߆hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jkc.bvec_set_folioasbuh1hhjubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)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&] refdomainjreftypejY reftargetj`modnameN classnameNj] j` )}jc ]jkc.bvec_set_folioasbuh1hhjWubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjWubj)}(hoffseth]hoffset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhK2ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK2ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK2hjhhubj)}(hhh]h)}(h*initialize a bvec based off a struct folioh]h*initialize a bvec based off a struct folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK2hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK2ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj̇jj̇jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct bio_vec *bv`` bvec to initialize ``struct folio *folio`` folio the bvec should point to ``size_t len`` length of the bvec ``size_t offset`` offset into the folioh](h)}(h**Parameters**h]j)}(hjևh]h Parameters}(hj؇hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԇubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK6hjЇubj )}(hhh](j)}(h*``struct bio_vec *bv`` bvec to initialize h](j)}(h``struct bio_vec *bv``h]j)}(hjh]hstruct bio_vec *bv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK3hjubj2)}(hhh]h)}(hbvec to initializeh]hbvec to initialize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK3hj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hK3hjubj)}(h7``struct folio *folio`` folio the bvec should point to h](j)}(h``struct folio *folio``h]j)}(hj.h]hstruct folio *folio}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK4hj(ubj2)}(hhh]h)}(hfolio the bvec should point toh]hfolio the bvec should point to}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChK4hjDubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhjChK4hjubj)}(h"``size_t len`` length of the bvec h](j)}(h``size_t len``h]j)}(hjgh]h size_t len}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK5hjaubj2)}(hhh]h)}(hlength of the bvech]hlength of the bvec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hK5hj}ubah}(h]h ]h"]h$]h&]uh1j1hjaubeh}(h]h ]h"]h$]h&]uh1jhj|hK5hjubj)}(h'``size_t offset`` offset into the folioh](j)}(h``size_t offset``h]j)}(hjh]h size_t offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK7hjubj2)}(hhh]h)}(hoffset into the folioh]hoffset into the folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhK6hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK7hjubeh}(h]h ]h"]h$]h&]uh1j hjЇubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bvec_set_virt (C function)c.bvec_set_virthNtauh1hhjhhhNhNubj)}(hhh](j)}(hFvoid bvec_set_virt (struct bio_vec *bv, void *vaddr, unsigned int len)h]j)}(hEvoid bvec_set_virt(struct bio_vec *bv, void *vaddr, unsigned int len)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKBubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKBubj{)}(h bvec_set_virth]j)}(h bvec_set_virth]h bvec_set_virt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKBubj)}(h3(struct bio_vec *bv, void *vaddr, unsigned int len)h](j)}(hstruct bio_vec *bvh](j)}(hjAh]hstruct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj2)}(h h]h }(hjDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubh)}(hhh]j)}(hbio_vech]hbio_vec}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjWmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.bvec_set_virtasbuh1hhj3ubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj)}(hbvh]hbv}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj/ubj)}(h void *vaddrh](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjʼnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hvaddrh]hvaddr}(hj҉hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj/ubj)}(hunsigned int lenh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hlenh]hlen}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj/ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKBubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKBubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKBhjhhubj)}(hhh]h)}(h,initialize a bvec based on a virtual addressh]h,initialize a bvec based on a virtual address}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKBhjJhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKBubeh}(h]h ](jfunctioneh"]h$]h&]jjjjejjejjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct bio_vec *bv`` bvec to initialize ``void *vaddr`` virtual address to set the bvec to ``unsigned int len`` length of the bvech](h)}(h**Parameters**h]j)}(hjoh]h Parameters}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKFhjiubj )}(hhh](j)}(h*``struct bio_vec *bv`` bvec to initialize h](j)}(h``struct bio_vec *bv``h]j)}(hjh]hstruct bio_vec *bv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKChjubj2)}(hhh]h)}(hbvec to initializeh]hbvec to initialize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKChjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKChjubj)}(h3``void *vaddr`` virtual address to set the bvec to h](j)}(h``void *vaddr``h]j)}(hjNJh]h void *vaddr}(hjɊhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjŊubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKDhjubj2)}(hhh]h)}(h"virtual address to set the bvec toh]h"virtual address to set the bvec to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj܊hKDhj݊ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj܊hKDhjubj)}(h'``unsigned int len`` length of the bvech](j)}(h``unsigned int len``h]j)}(hjh]hunsigned int len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKFhjubj2)}(hhh]h)}(hlength of the bvech]hlength of the bvec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKEhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKFhjubeh}(h]h ]h"]h$]h&]uh1j hjiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bvec_folio (C function) c.bvec_foliohNtauh1hhjhhhNhNubj)}(hhh](j)}(h4struct folio * bvec_folio (const struct bio_vec *bv)h]j)}(h2struct folio *bvec_folio(const struct bio_vec *bv)h](j)}(hjAh]hstruct}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKNubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVhhhjghKNubh)}(hhh]j)}(hfolioh]hfolio}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj{modnameN classnameNj] j` )}jc ]jf )}jY bvec_foliosb c.bvec_folioasbuh1hhjVhhhjghKNubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVhhhjghKNubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVhhhjghKNubj{)}(h bvec_folioh]j)}(hjh]h bvec_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjVhhhjghKNubj)}(h(const struct bio_vec *bv)h]j)}(hconst struct bio_vec *bvh](j)}(hjh]hconst}(hjԋhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЋubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjЋubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЋubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjЋubh)}(hhh]j)}(hbio_vech]hbio_vec}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.bvec_folioasbuh1hhjЋubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjЋubj)}(hjh]h*}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЋubj)}(hbvh]hbv}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЋubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj̋ubah}(h]h ]h"]h$]h&]jjuh1jhjVhhhjghKNubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjRhhhjghKNubah}(h]jMah ](jjeh"]h$]h&]jj)jhuh1jhjghKNhjOhhubj)}(hhh]h)}(h.Return the first folio referenced by this bvech]h.Return the first folio referenced by this bvec}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKNhjmhhubah}(h]h ]h"]h$]h&]uh1jhjOhhhjghKNubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const struct bio_vec *bv`` bvec to access **Description** A bvec can contain non-folio memory, so this should only be called by the creator of the bvec; drivers have no business looking at the owner of the memory. It may not even be the right interface for the caller to use as a bvec can span multiple folios. You may be better off using something like bio_for_each_folio_all() which iterates over all folios.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKRhjubj )}(hhh]j)}(h,``const struct bio_vec *bv`` bvec to access h](j)}(h``const struct bio_vec *bv``h]j)}(hjh]hconst struct bio_vec *bv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKOhjubj2)}(hhh]h)}(hbvec to accessh]hbvec to access}(hjʌhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjƌhKOhjnjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjƌhKOhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKQhjubh)}(hXbA bvec can contain non-folio memory, so this should only be called by the creator of the bvec; drivers have no business looking at the owner of the memory. It may not even be the right interface for the caller to use as a bvec can span multiple folios. You may be better off using something like bio_for_each_folio_all() which iterates over all folios.h]hXbA bvec can contain non-folio memory, so this should only be called by the creator of the bvec; drivers have no business looking at the owner of the memory. It may not even be the right interface for the caller to use as a bvec can span multiple folios. You may be better off using something like bio_for_each_folio_all() which iterates over all folios.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhKPhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bvec_kmap_local (C function)c.bvec_kmap_localhNtauh1hhjhhhNhNubj)}(hhh](j)}(h-void * bvec_kmap_local (struct bio_vec *bvec)h]j)}(h+void *bvec_kmap_local(struct bio_vec *bvec)h](j )}(hvoidh]hvoid}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj-hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-hhhj?hMubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhj?hMubj{)}(hbvec_kmap_localh]j)}(hbvec_kmap_localh]hbvec_kmap_local}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj-hhhj?hMubj)}(h(struct bio_vec *bvec)h]j)}(hstruct bio_vec *bvech](j)}(hjAh]hstruct}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubh)}(hhh]j)}(hbio_vech]hbio_vec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jasbc.bvec_kmap_localasbuh1hhjwubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubj)}(hjh]h*}(hjǍhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hbvech]hbvec}(hjԍhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjsubah}(h]h ]h"]h$]h&]jjuh1jhj-hhhj?hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj)hhhj?hMubah}(h]j$ah ](jjeh"]h$]h&]jj)jhuh1jhj?hMhj&hhubj)}(hhh]h)}(h0map a bvec into the kernel virtual address spaceh]h0map a bvec into the kernel virtual address space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhj&hhhj?hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct bio_vec *bvec`` bvec to map **Description** Must be called on single-page bvecs only. Call kunmap_local on the returned address to unmap.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMhjubj )}(hhh]j)}(h%``struct bio_vec *bvec`` bvec to map h](j)}(h``struct bio_vec *bvec``h]j)}(hj?h]hstruct bio_vec *bvec}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMhj9ubj2)}(hhh]h)}(h bvec to maph]h bvec to map}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThMhjUubah}(h]h ]h"]h$]h&]uh1j1hj9ubeh}(h]h ]h"]h$]h&]uh1jhjThMhj6ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjzh]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMhjubh)}(h^Must be called on single-page bvecs only. Call kunmap_local on the returned address to unmap.h]h^Must be called on single-page bvecs only. Call kunmap_local on the returned address to unmap.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memcpy_from_bvec (C function)c.memcpy_from_bvechNtauh1hhjhhhNhNubj)}(hhh](j)}(h6void memcpy_from_bvec (char *to, struct bio_vec *bvec)h]j)}(h5void memcpy_from_bvec(char *to, struct bio_vec *bvec)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM#ubj2)}(h h]h }(hjΎhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj͎hM#ubj{)}(hmemcpy_from_bvech]j)}(hmemcpy_from_bvech]hmemcpy_from_bvec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj܎ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj͎hM#ubj)}(h (char *to, struct bio_vec *bvec)h](j)}(hchar *toh](j )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(htoh]hto}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct bio_vec *bvech](j)}(hjAh]hstruct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubh)}(hhh]j)}(hbio_vech]hbio_vec}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj^modnameN classnameNj] j` )}jc ]jf )}jY jsbc.memcpy_from_bvecasbuh1hhj:ubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hbvech]hbvec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj͎hM#ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj͎hM#ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj͎hM#hjhhubj)}(hhh]h)}(hcopy data from a bvech]hcopy data from a bvec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM#hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj͎hM#ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjُjjُjjjuh1jhhhjhNhNubj)}(h**Parameters** ``char *to`` Kernel virtual address to copy to. ``struct bio_vec *bvec`` bvec to copy from **Description** Must be called on single-page bvecs only.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM'hjݏubj )}(hhh](j)}(h0``char *to`` Kernel virtual address to copy to. h](j)}(h ``char *to``h]j)}(hjh]hchar *to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM$hjubj2)}(hhh]h)}(h"Kernel virtual address to copy to.h]h"Kernel virtual address to copy to.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM$hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM$hjubj)}(h+``struct bio_vec *bvec`` bvec to copy from h](j)}(h``struct bio_vec *bvec``h]j)}(hj;h]hstruct bio_vec *bvec}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM%hj5ubj2)}(hhh]h)}(hbvec to copy fromh]hbvec to copy from}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhM%hjQubah}(h]h ]h"]h$]h&]uh1j1hj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhM%hjubeh}(h]h ]h"]h$]h&]uh1j hjݏubh)}(h**Description**h]j)}(hjvh]h Description}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM'hjݏubh)}(h)Must be called on single-page bvecs only.h]h)Must be called on single-page bvecs only.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM&hjݏubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memcpy_to_bvec (C function)c.memcpy_to_bvechNtauh1hhjhhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjhhhjɐhM/ubj{)}(hmemcpy_to_bvech]j)}(hmemcpy_to_bvech]hmemcpy_to_bvec}(hjܐhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjؐubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjɐhM/ubj)}(h((struct bio_vec *bvec, const char *from)h](j)}(hstruct bio_vec *bvech](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbio_vech]hbio_vec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jސsbc.memcpy_to_bvecasbuh1hhjubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbvech]hbvec}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *fromh](j)}(hjh]hconst}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(hfromh]hfrom}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjɐhM/ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjɐhM/ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjɐhM/hjhhubj)}(hhh]h)}(hcopy data to a bvech]hcopy data to a bvec}(hjؑhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM/hjՑhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjɐhM/ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct bio_vec *bvec`` bvec to copy to ``const char *from`` Kernel virtual address to copy from. **Description** Must be called on single-page bvecs only.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM3hjubj )}(hhh](j)}(h)``struct bio_vec *bvec`` bvec to copy to h](j)}(h``struct bio_vec *bvec``h]j)}(hjh]hstruct bio_vec *bvec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM0hjubj2)}(hhh]h)}(hbvec to copy toh]hbvec to copy to}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hM0hj/ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj.hM0hjubj)}(h:``const char *from`` Kernel virtual address to copy from. h](j)}(h``const char *from``h]j)}(hjRh]hconst char *from}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM1hjLubj2)}(hhh]h)}(h$Kernel virtual address to copy from.h]h$Kernel virtual address to copy from.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghM1hjhubah}(h]h ]h"]h$]h&]uh1j1hjLubeh}(h]h ]h"]h$]h&]uh1jhjghM1hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM3hjubh)}(h)Must be called on single-page bvecs only.h]h)Must be called on single-page bvecs only.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM2hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j memzero_bvec (C function)c.memzero_bvechNtauh1hhjhhhNhNubj)}(hhh](j)}(h(void memzero_bvec (struct bio_vec *bvec)h]j)}(h'void memzero_bvec(struct bio_vec *bvec)h](j )}(hvoidh]hvoid}(hjҒhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjΒhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM;ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjΒhhhjhM;ubj{)}(h memzero_bvech]j)}(h memzero_bvech]h memzero_bvec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjΒhhhjhM;ubj)}(h(struct bio_vec *bvec)h]j)}(hstruct bio_vec *bvech](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hbio_vech]hbio_vec}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj/modnameN classnameNj] j` )}jc ]jf )}jY jsbc.memzero_bvecasbuh1hhj ubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hbvech]hbvec}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjΒhhhjhM;ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjʒhhhjhM;ubah}(h]jŒah ](jjeh"]h$]h&]jj)jhuh1jhjhM;hjǒhhubj)}(hhh]h)}(hzero all data in a bvech]hzero all data in a bvec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM;hjhhubah}(h]h ]h"]h$]h&]uh1jhjǒhhhjhM;ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hs**Parameters** ``struct bio_vec *bvec`` bvec to zero **Description** Must be called on single-page bvecs only.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM?hjubj )}(hhh]j)}(h&``struct bio_vec *bvec`` bvec to zero h](j)}(h``struct bio_vec *bvec``h]j)}(hjӓh]hstruct bio_vec *bvec}(hjՓhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjѓubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM<hj͓ubj2)}(hhh]h)}(h bvec to zeroh]h bvec to zero}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM<hjubah}(h]h ]h"]h$]h&]uh1j1hj͓ubeh}(h]h ]h"]h$]h&]uh1jhjhM<hjʓubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM>hjubh)}(h)Must be called on single-page bvecs only.h]h)Must be called on single-page bvecs only.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhM=hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bvec_virt (C function) c.bvec_virthNtauh1hhjhhhNhNubj)}(hhh](j)}(h'void * bvec_virt (struct bio_vec *bvec)h]j)}(h%void *bvec_virt(struct bio_vec *bvec)h](j )}(hvoidh]hvoid}(hjShhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjOhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMFubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOhhhjahMFubj)}(hjh]h*}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhhjahMFubj{)}(h bvec_virth]j)}(h bvec_virth]h bvec_virt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjOhhhjahMFubj)}(h(struct bio_vec *bvec)h]j)}(hstruct bio_vec *bvech](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbio_vech]hbio_vec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.bvec_virtasbuh1hhjubj2)}(h h]h }(hj۔hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbvech]hbvec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjOhhhjahMFubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjKhhhjahMFubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhjahMFhjHhhubj)}(hhh]h)}(h%return the virtual address for a bvech]h%return the virtual address for a bvec}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMFhjhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjahMFubeh}(h]h ](jfunctioneh"]h$]h&]jjjj8jj8jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct bio_vec *bvec`` bvec to return the virtual address for **Note** the caller must ensure that **bvec->bv_page** is not a highmem page.h](h)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMJhj<ubj )}(hhh]j)}(h@``struct bio_vec *bvec`` bvec to return the virtual address for h](j)}(h``struct bio_vec *bvec``h]j)}(hjah]hstruct bio_vec *bvec}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMGhj[ubj2)}(hhh]h)}(h&bvec to return the virtual address forh]h&bvec to return the virtual address for}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhMGhjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMGhjXubah}(h]h ]h"]h$]h&]uh1j hj<ubh)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMIhj<ubh)}(hDthe caller must ensure that **bvec->bv_page** is not a highmem page.h](hthe caller must ensure that }(hjhhhNhNubj)}(h**bvec->bv_page**h]h bvec->bv_page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is not a highmem page.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMIhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bvec_phys (C function) c.bvec_physhNtauh1hhjhhhNhNubj)}(hhh](j)}(h2phys_addr_t bvec_phys (const struct bio_vec *bvec)h]j)}(h1phys_addr_t bvec_phys(const struct bio_vec *bvec)h](h)}(hhh]j)}(h phys_addr_th]h phys_addr_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY bvec_physsb c.bvec_physasbuh1hhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMRubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMRubj{)}(h bvec_physh]j)}(hjh]h bvec_phys}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMRubj)}(h(const struct bio_vec *bvec)h]j)}(hconst struct bio_vec *bvech](j)}(hjh]hconst}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubj)}(hjAh]hstruct}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubh)}(hhh]j)}(hbio_vech]hbio_vec}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.bvec_physasbuh1hhjAubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(hbvech]hbvec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj=ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMRubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMRubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMRhjhhubj)}(hhh]h)}(h&return the physical address for a bvech]h&return the physical address for a bvec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMRhjޖhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMRubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const struct bio_vec *bvec`` bvec to return the physical address forh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMVhjubj )}(hhh]j)}(hF``const struct bio_vec *bvec`` bvec to return the physical address forh](j)}(h``const struct bio_vec *bvec``h]j)}(hj"h]hconst struct bio_vec *bvec}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMXhjubj2)}(hhh]h)}(h'bvec to return the physical address forh]h'bvec to return the physical address for}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:310: ./include/linux/bvec.hhMShj8ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj7hMXhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bio_advance (C function) c.bio_advancehNtauh1hhjhhhNhNubj)}(hhh](j)}(h7void bio_advance (struct bio *bio, unsigned int nbytes)h]j)}(h6void bio_advance(struct bio *bio, unsigned int nbytes)h](j )}(hvoidh]hvoid}(hj|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjxhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxhhhjhKubj{)}(h bio_advanceh]j)}(h bio_advanceh]h bio_advance}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjxhhhjhKubj)}(h&(struct bio *bio, unsigned int nbytes)h](j)}(hstruct bio *bioh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjƗhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbioh]hbio}(hjחhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԗubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjٗmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.bio_advanceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbioh]hbio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int nbytesh](j )}(hunsignedh]hunsigned}(hj+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj'ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'ubj )}(hinth]hint}(hjGhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj'ubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'ubj)}(hnbytesh]hnbytes}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjxhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjthhhjhKubah}(h]joah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjqhhubj)}(hhh]h)}(h0increment/complete a bio by some number of bytesh]h0increment/complete a bio by some number of bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjqhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct bio *bio`` bio to advance ``unsigned int nbytes`` number of bytes to complete **Description** This updates bi_sector, bi_size and bi_idx; if the number of bytes to complete doesn't align with a bvec boundary, then bv_len and bv_offset will be updated on the last bvec as well. **bio** will then represent the remaining, uncompleted portion of the io.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhKhjubj )}(hhh](j)}(h#``struct bio *bio`` bio to advance h](j)}(h``struct bio *bio``h]j)}(hjΘh]hstruct bio *bio}(hjИhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̘ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhKhjȘubj2)}(hhh]h)}(hbio to advanceh]hbio to advance}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjȘubeh}(h]h ]h"]h$]h&]uh1jhjhKhjŘubj)}(h4``unsigned int nbytes`` number of bytes to complete h](j)}(h``unsigned int nbytes``h]j)}(hjh]hunsigned int nbytes}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhKhjubj2)}(hhh]h)}(hnumber of bytes to completeh]hnumber of bytes to complete}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjŘubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjBh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhKhjubh)}(hThis updates bi_sector, bi_size and bi_idx; if the number of bytes to complete doesn't align with a bvec boundary, then bv_len and bv_offset will be updated on the last bvec as well.h]hThis updates bi_sector, bi_size and bi_idx; if the number of bytes to complete doesn’t align with a bvec boundary, then bv_len and bv_offset will be updated on the last bvec as well.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhKhjubh)}(hI**bio** will then represent the remaining, uncompleted portion of the io.h](j)}(h**bio**h]hbio}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubhB will then represent the remaining, uncompleted portion of the io.}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j folio_iter (C struct) c.folio_iterhNtauh1hhjhhhNhNubj)}(hhh](j)}(h folio_iterh]j)}(hstruct folio_iterh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(h folio_iterh]j)}(hjh]h folio_iter}(hjęhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h(State for iterating all folios in a bio.h]h(State for iterating all folios in a bio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXY**Definition**:: struct folio_iter { struct folio *folio; size_t offset; size_t length; }; **Members** ``folio`` The current folio we're iterating. NULL after the last folio. ``offset`` The byte offset within the current folio. ``length`` The number of bytes in this iteration (will not cross folio boundary).h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjubj7C)}(hUstruct folio_iter { struct folio *folio; size_t offset; size_t length; };h]hUstruct folio_iter { struct folio *folio; size_t offset; size_t length; };}hj#sbah}(h]h ]h"]h$]h&]jjuh1j6ChX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhM hjubh)}(h **Members**h]j)}(hj4h]hMembers}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjubj )}(hhh](j)}(hI``folio`` The current folio we're iterating. NULL after the last folio. h](j)}(h ``folio``h]j)}(hjSh]hfolio}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjMubj2)}(hhh]h)}(h>The current folio we're iterating. NULL after the last folio.h]h@The current folio we’re iterating. NULL after the last folio.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMhjiubah}(h]h ]h"]h$]h&]uh1j1hjMubeh}(h]h ]h"]h$]h&]uh1jhjhhMhjJubj)}(h5``offset`` The byte offset within the current folio. h](j)}(h ``offset``h]j)}(hjh]hoffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjubj2)}(hhh]h)}(h)The byte offset within the current folio.h]h)The byte offset within the current folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjJubj)}(hQ``length`` The number of bytes in this iteration (will not cross folio boundary).h](j)}(h ``length``h]j)}(hjŚh]hlength}(hjǚhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÚubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjubj2)}(hhh]h)}(hFThe number of bytes in this iteration (will not cross folio boundary).h]hFThe number of bytes in this iteration (will not cross folio boundary).}(hjޚhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjښhMhjۚubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjښhMhjJubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  bio_for_each_folio_all (C macro)c.bio_for_each_folio_allhNtauh1hhjhhhNhNubj)}(hhh](j)}(hbio_for_each_folio_allh]j)}(hbio_for_each_folio_allh]j{)}(hbio_for_each_folio_allh]j)}(hjh]hbio_for_each_folio_all}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhM5ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj5hM5ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj5hM5hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj5hM5ubeh}(h]h ](jmacroeh"]h$]h&]jjjjNjjNjjjuh1jhhhjhNhNubh)}(h$``bio_for_each_folio_all (fi, bio)``h]j)}(hjTh]h bio_for_each_folio_all (fi, bio)}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhM7hjhhubj)}(h"Iterate over each folio in a bio. h]h)}(h!Iterate over each folio in a bio.h]h!Iterate over each folio in a bio.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhM5hjjubah}(h]h ]h"]h$]h&]uh1jhj|hM5hjhhubj)}(hr**Parameters** ``fi`` struct folio_iter which is updated for each folio. ``bio`` struct bio to iterate over.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhM9hjubj )}(hhh](j)}(h:``fi`` struct folio_iter which is updated for each folio. h](j)}(h``fi``h]j)}(hjh]hfi}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhM6hjubj2)}(hhh]h)}(h2struct folio_iter which is updated for each folio.h]h2struct folio_iter which is updated for each folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM6hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM6hjubj)}(h#``bio`` struct bio to iterate over.h](j)}(h``bio``h]j)}(hjh]hbio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjߛubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhM8hjۛubj2)}(hhh]h)}(hstruct bio to iterate over.h]hstruct bio to iterate over.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhM7hjubah}(h]h ]h"]h$]h&]uh1j1hjۛubeh}(h]h ]h"]h$]h&]uh1jhjhM8hjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bio_next_split (C function)c.bio_next_splithNtauh1hhjhhhNhNubj)}(hhh](j)}(hYstruct bio * bio_next_split (struct bio *bio, int sectors, gfp_t gfp, struct bio_set *bs)h]j)}(hWstruct bio *bio_next_split(struct bio *bio, int sectors, gfp_t gfp, struct bio_set *bs)h](j)}(hjAh]hstruct}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMEubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7hhhjHhMEubh)}(hhh]j)}(hbioh]hbio}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj\modnameN classnameNj] j` )}jc ]jf )}jY bio_next_splitsbc.bio_next_splitasbuh1hhj7hhhjHhMEubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7hhhjHhMEubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7hhhjHhMEubj{)}(hbio_next_splith]j)}(hjxh]hbio_next_split}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj7hhhjHhMEubj)}(h=(struct bio *bio, int sectors, gfp_t gfp, struct bio_set *bs)h](j)}(hstruct bio *bioh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjœhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbioh]hbio}(hjӜhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjМubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj՜modnameN classnameNj] j` )}jc ]jvc.bio_next_splitasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbioh]hbio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int sectorsh](j )}(hinth]hint}(hj%hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!ubj)}(hsectorsh]hsectors}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj_modnameN classnameNj] j` )}jc ]jvc.bio_next_splitasbuh1hhjVubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct bio_set *bsh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbio_seth]hbio_set}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jvc.bio_next_splitasbuh1hhjubj2)}(h h]h }(hjޝhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbsh]hbs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj7hhhjHhMEubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj3hhhjHhMEubah}(h]j.ah ](jjeh"]h$]h&]jj)jhuh1jhjHhMEhj0hhubj)}(hhh]h)}(h7get next **sectors** from a bio, splitting if necessaryh](h get next }(hj#hhhNhNubj)}(h **sectors**h]hsectors}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh# from a bio, splitting if necessary}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMEhj hhubah}(h]h ]h"]h$]h&]uh1jhj0hhhjHhMEubeh}(h]h ](jfunctioneh"]h$]h&]jjjjMjjMjjjuh1jhhhjhNhNubj)}(hXU**Parameters** ``struct bio *bio`` bio to split ``int sectors`` number of sectors to split from the front of **bio** ``gfp_t gfp`` gfp mask ``struct bio_set *bs`` bio set to allocate from **Return** a bio representing the next **sectors** of **bio** - if the bio is smaller than **sectors**, returns the original bio unchanged.h](h)}(h**Parameters**h]j)}(hjWh]h Parameters}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMIhjQubj )}(hhh](j)}(h!``struct bio *bio`` bio to split h](j)}(h``struct bio *bio``h]j)}(hjvh]hstruct bio *bio}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMFhjpubj2)}(hhh]h)}(h bio to splith]h bio to split}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMFhjubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhjhMFhjmubj)}(hE``int sectors`` number of sectors to split from the front of **bio** h](j)}(h``int sectors``h]j)}(hjh]h int sectors}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMGhjubj2)}(hhh]h)}(h4number of sectors to split from the front of **bio**h](h-number of sectors to split from the front of }(hjȞhhhNhNubj)}(h**bio**h]hbio}(hjОhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȞubeh}(h]h ]h"]h$]h&]uh1hhjĞhMGhjŞubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjĞhMGhjmubj)}(h``gfp_t gfp`` gfp mask h](j)}(h ``gfp_t gfp``h]j)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMHhjubj2)}(hhh]h)}(hgfp maskh]hgfp mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMHhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMHhjmubj)}(h0``struct bio_set *bs`` bio set to allocate from h](j)}(h``struct bio_set *bs``h]j)}(hj/h]hstruct bio_set *bs}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMIhj)ubj2)}(hhh]h)}(hbio set to allocate fromh]hbio set to allocate from}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMIhjEubah}(h]h ]h"]h$]h&]uh1j1hj)ubeh}(h]h ]h"]h$]h&]uh1jhjDhMIhjmubeh}(h]h ]h"]h$]h&]uh1j hjQubh)}(h **Return**h]j)}(hjjh]hReturn}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMKhjQubh)}(ha bio representing the next **sectors** of **bio** - if the bio is smaller than **sectors**, returns the original bio unchanged.h](ha bio representing the next }(hjhhhNhNubj)}(h **sectors**h]hsectors}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh of }(hjhhhNhNubj)}(h**bio**h]hbio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh - if the bio is smaller than }(hjhhhNhNubj)}(h **sectors**h]hsectors}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh%, returns the original bio unchanged.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMKhjQubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bio_endio_status (C function)c.bio_endio_statushNtauh1hhjhhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjhhhjhMvubj{)}(hbio_endio_statush]j)}(hbio_endio_statush]hbio_endio_status}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMvubj)}(h&(struct bio *bio, blk_status_t status)h](j)}(hstruct bio *bioh](j)}(hjAh]hstruct}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbioh]hbio}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjBmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.bio_endio_statusasbuh1hhjubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbioh]hbio}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hblk_status_t statush](h)}(hhh]j)}(h blk_status_th]h blk_status_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j\c.bio_endio_statusasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hstatush]hstatus}(hjàhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMvubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjݟhhhjhMvubah}(h]j؟ah ](jjeh"]h$]h&]jj)jhuh1jhjhMvhjڟhhubj)}(hhh]h)}(h'end I/O on a bio with a specific statush]h'end I/O on a bio with a specific status}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMvhjhhubah}(h]h ]h"]h$]h&]uh1jhjڟhhhjhMvubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct bio *bio`` bio ``blk_status_t status`` status to set **Description** Set **bio->bi_status** to **status** and call bio_endio().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMzhj ubj )}(hhh](j)}(h``struct bio *bio`` bio h](j)}(h``struct bio *bio``h]j)}(hj.h]hstruct bio *bio}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMwhj(ubj2)}(hhh]h)}(hbioh]hbio}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMwhjDubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhjChMwhj%ubj)}(h&``blk_status_t status`` status to set h](j)}(h``blk_status_t status``h]j)}(hjgh]hblk_status_t status}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMxhjaubj2)}(hhh]h)}(h status to seth]h status to set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hMxhj}ubah}(h]h ]h"]h$]h&]uh1j1hjaubeh}(h]h ]h"]h$]h&]uh1jhj|hMxhj%ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMzhj ubh)}(h:Set **bio->bi_status** to **status** and call bio_endio().h](hSet }(hjhhhNhNubj)}(h**bio->bi_status**h]hbio->bi_status}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to }(hjhhhNhNubj)}(h **status**h]hstatus}(hjҡhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and call bio_endio().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMyhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #bio_iov_bounce_nr_vecs (C function)c.bio_iov_bounce_nr_vecshNtauh1hhjhhhNhNubj)}(hhh](j)}(hKunsigned short bio_iov_bounce_nr_vecs (struct iov_iter *iter, blk_opf_t op)h]j)}(hJunsigned short bio_iov_bounce_nr_vecs(struct iov_iter *iter, blk_opf_t op)h](j )}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj )}(hshorth]hshort}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhMubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hbio_iov_bounce_nr_vecsh]j)}(hbio_iov_bounce_nr_vecsh]hbio_iov_bounce_nr_vecs}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h%(struct iov_iter *iter, blk_opf_t op)h](j)}(hstruct iov_iter *iterh](j)}(hjAh]hstruct}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubh)}(hhh]j)}(hiov_iterh]hiov_iter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jJsbc.bio_iov_bounce_nr_vecsasbuh1hhj`ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hiterh]hiter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubj)}(h blk_opf_t oph](h)}(hhh]j)}(h blk_opf_th]h blk_opf_t}(hj٢hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֢ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjۢmodnameN classnameNj] j` )}jc ]jc.bio_iov_bounce_nr_vecsasbuh1hhjҢubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjҢubj)}(hoph]hop}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjҢubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h*calculate number of bvecs for a bounce bioh]h*calculate number of bvecs for a bounce bio}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhj,hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjGjjGjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct iov_iter *iter`` iter to bounce from ``blk_opf_t op`` REQ_OP_* for the bio **Description** Calculates how many bvecs are needed for the next bio to bounce from/to **iter**.h](h)}(h**Parameters**h]j)}(hjQh]h Parameters}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjKubj )}(hhh](j)}(h.``struct iov_iter *iter`` iter to bounce from h](j)}(h``struct iov_iter *iter``h]j)}(hjph]hstruct iov_iter *iter}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjjubj2)}(hhh]h)}(hiter to bounce fromh]hiter to bounce from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjgubj)}(h&``blk_opf_t op`` REQ_OP_* for the bio h](j)}(h``blk_opf_t op``h]j)}(hjh]h blk_opf_t op}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjubj2)}(hhh]h)}(hREQ_OP_* for the bioh]hREQ_OP_* for the bio}(hj£hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjgubeh}(h]h ]h"]h$]h&]uh1j hjKubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjKubh)}(hQCalculates how many bvecs are needed for the next bio to bounce from/to **iter**.h](hHCalculates how many bvecs are needed for the next bio to bounce from/to }(hjhhhNhNubj)}(h**iter**h]hiter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjKubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bio_add_max_vecs (C function)c.bio_add_max_vecshNtauh1hhjhhhNhNubj)}(hhh](j)}(h=unsigned int bio_add_max_vecs (void *kaddr, unsigned int len)h]j)}(hah"]h$]h&]uh1j1hj7hhhjIhMubj )}(hinth]hint}(hjXhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj7hhhjIhMubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7hhhjIhMubj{)}(hbio_add_max_vecsh]j)}(hbio_add_max_vecsh]hbio_add_max_vecs}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj7hhhjIhMubj)}(h(void *kaddr, unsigned int len)h](j)}(h void *kaddrh](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hkaddrh]hkaddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int lenh](j )}(hunsignedh]hunsigned}(hj֤hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjҤubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjҤubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjҤubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjҤubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjҤubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj7hhhjIhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj3hhhjIhMubah}(h]j.ah ](jjeh"]h$]h&]jj)jhuh1jhjIhMhj0hhubj)}(hhh]h)}(h.number of bio_vecs needed to add data to a bioh]h.number of bio_vecs needed to add data to a bio}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhj5hhubah}(h]h ]h"]h$]h&]uh1jhj0hhhjIhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjPjjPjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``void *kaddr`` kernel virtual address to add ``unsigned int len`` length in bytes to add **Description** Calculate how many bio_vecs need to be allocated to add the kernel virtual address range in [**kaddr**:**len**] in the worse case.h](h)}(h**Parameters**h]j)}(hjZh]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjTubj )}(hhh](j)}(h.``void *kaddr`` kernel virtual address to add h](j)}(h``void *kaddr``h]j)}(hjyh]h void *kaddr}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjsubj2)}(hhh]h)}(hkernel virtual address to addh]hkernel virtual address to add}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjhMhjpubj)}(h,``unsigned int len`` length in bytes to add h](j)}(h``unsigned int len``h]j)}(hjh]hunsigned int len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjubj2)}(hhh]h)}(hlength in bytes to addh]hlength in bytes to add}(hj˥hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjǥhMhjȥubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjǥhMhjpubeh}(h]h ]h"]h$]h&]uh1j hjTubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjTubh)}(hCalculate how many bio_vecs need to be allocated to add the kernel virtual address range in [**kaddr**:**len**] in the worse case.h](h]Calculate how many bio_vecs need to be allocated to add the kernel virtual address range in [}(hjhhhNhNubj)}(h **kaddr**h]hkaddr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubj)}(h**len**h]hlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh] in the worse case.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bio_is_zone_append (C function)c.bio_is_zone_appendhNtauh1hhjhhhNhNubj)}(hhh](j)}(h)bool bio_is_zone_append (struct bio *bio)h]j)}(h(bool bio_is_zone_append(struct bio *bio)h](j )}(hj8h]hbool}(hjVhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjRhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRhhhjchMubj{)}(hbio_is_zone_appendh]j)}(hbio_is_zone_appendh]hbio_is_zone_append}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjRhhhjchMubj)}(h(struct bio *bio)h]j)}(hstruct bio *bioh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbioh]hbio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jxsbc.bio_is_zone_appendasbuh1hhjubj2)}(h h]h }(hjЦhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjަhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbioh]hbio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjRhhhjchMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjNhhhjchMubah}(h]jIah ](jjeh"]h$]h&]jj)jhuh1jhjchMhjKhhubj)}(hhh]h)}(his this a zone append bio?h]his this a zone append bio?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjKhhhjchMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj-jj-jjjuh1jhhhjhNhNubj)}(hXD**Parameters** ``struct bio *bio`` bio to check **Description** Check if **bio** is a zone append operation. Core block layer code and end_io handlers must use this instead of an open coded REQ_OP_ZONE_APPEND check because the block layer can rewrite REQ_OP_ZONE_APPEND to REQ_OP_WRITE if it is not natively supported.h](h)}(h**Parameters**h]j)}(hj7h]h Parameters}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhj1ubj )}(hhh]j)}(h!``struct bio *bio`` bio to check h](j)}(h``struct bio *bio``h]j)}(hjVh]hstruct bio *bio}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhjPubj2)}(hhh]h)}(h bio to checkh]h bio to check}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMhjlubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhjkhMhjMubah}(h]h ]h"]h$]h&]uh1j hj1ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhj1ubh)}(hCheck if **bio** is a zone append operation. Core block layer code and end_io handlers must use this instead of an open coded REQ_OP_ZONE_APPEND check because the block layer can rewrite REQ_OP_ZONE_APPEND to REQ_OP_WRITE if it is not natively supported.h](h Check if }(hjhhhNhNubj)}(h**bio**h]hbio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is a zone append operation. Core block layer code and end_io handlers must use this instead of an open coded REQ_OP_ZONE_APPEND check because the block layer can rewrite REQ_OP_ZONE_APPEND to REQ_OP_WRITE if it is not natively supported.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:311: ./include/linux/bio.hhMhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_queue_flag_set (C function)c.blk_queue_flag_sethNtauh1hhjhhhNhNubj)}(hhh](j)}(hDvoid blk_queue_flag_set (unsigned int flag, struct request_queue *q)h]j)}(hCvoid blk_queue_flag_set(unsigned int flag, struct request_queue *q)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKMubj{)}(hblk_queue_flag_seth]j)}(hblk_queue_flag_seth]hblk_queue_flag_set}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKMubj)}(h,(unsigned int flag, struct request_queue *q)h](j)}(hunsigned int flagh](j )}(hunsignedh]hunsigned}(hj%hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!ubj )}(hinth]hint}(hjAhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!ubj2)}(h h]h }(hjOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!ubj)}(hflagh]hflag}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubh)}(hhh]j)}(h request_queueh]h request_queue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j sbc.blk_queue_flag_setasbuh1hhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hjh]h*}(hj¨hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hjfh]hq}(hjϨhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKMubah}(h]jۧah ](jjeh"]h$]h&]jj)jhuh1jhjhKMhjݧhhubj)}(hhh]h)}(hatomically set a queue flagh]hatomically set a queue flag}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKMhjhhubah}(h]h ]h"]h$]h&]uh1jhjݧhhhjhKMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hc**Parameters** ``unsigned int flag`` flag to be set ``struct request_queue *q`` request queueh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKQhjubj )}(hhh](j)}(h%``unsigned int flag`` flag to be set h](j)}(h``unsigned int flag``h]j)}(hj9h]hunsigned int flag}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKNhj3ubj2)}(hhh]h)}(hflag to be seth]hflag to be set}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhKNhjOubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhjNhKNhj0ubj)}(h)``struct request_queue *q`` request queueh](j)}(h``struct request_queue *q``h]j)}(hjrh]hstruct request_queue *q}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKPhjlubj2)}(hhh]h)}(h request queueh]h request queue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKOhjubah}(h]h ]h"]h$]h&]uh1j1hjlubeh}(h]h ]h"]h$]h&]uh1jhjhKPhj0ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !blk_queue_flag_clear (C function)c.blk_queue_flag_clearhNtauh1hhjhhhNhNubj)}(hhh](j)}(hFvoid blk_queue_flag_clear (unsigned int flag, struct request_queue *q)h]j)}(hEvoid blk_queue_flag_clear(unsigned int flag, struct request_queue *q)h](j )}(hvoidh]hvoid}(hj̩hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjȩhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKXubj2)}(h h]h }(hj۩hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjȩhhhjکhKXubj{)}(hblk_queue_flag_clearh]j)}(hblk_queue_flag_clearh]hblk_queue_flag_clear}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjȩhhhjکhKXubj)}(h,(unsigned int flag, struct request_queue *q)h](j)}(hunsigned int flagh](j )}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hj%hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hflagh]hflag}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubh)}(hhh]j)}(h request_queueh]h request_queue}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjzmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_queue_flag_clearasbuh1hhjVubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj)}(hjfh]hq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjȩhhhjکhKXubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjĩhhhjکhKXubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjکhKXhjhhubj)}(hhh]h)}(hatomically clear a queue flagh]hatomically clear a queue flag}(hjܪhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKXhj٪hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjکhKXubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hg**Parameters** ``unsigned int flag`` flag to be cleared ``struct request_queue *q`` request queueh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chK\hjubj )}(hhh](j)}(h)``unsigned int flag`` flag to be cleared h](j)}(h``unsigned int flag``h]j)}(hjh]hunsigned int flag}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKYhjubj2)}(hhh]h)}(hflag to be clearedh]hflag to be cleared}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hKYhj3ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj2hKYhjubj)}(h)``struct request_queue *q`` request queueh](j)}(h``struct request_queue *q``h]j)}(hjVh]hstruct request_queue *q}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chK[hjPubj2)}(hhh]h)}(h request queueh]h request queue}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKZhjlubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhjkhK[hjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_op_str (C function) c.blk_op_strhNtauh1hhjhhhNhNubj)}(hhh](j)}(h(const char * blk_op_str (enum req_op op)h]j)}(h&const char *blk_op_str(enum req_op op)h](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKvubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKvubj )}(hcharh]hchar}(hj̫hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhKvubj2)}(h h]h }(hjګhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKvubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKvubj{)}(h blk_op_strh]j)}(h blk_op_strh]h blk_op_str}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKvubj)}(h(enum req_op op)h]j)}(henum req_op oph](j)}(hj:h]henum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hreq_oph]hreq_op}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj5modnameN classnameNj] j` )}jc ]jf )}jY jsb c.blk_op_strasbuh1hhjubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hoph]hop}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKvubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKvubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKvhjhhubj)}(hhh]h)}(h6Return the string "name" for an operation REQ_OP_name.h]h:Return the string “name” for an operation REQ_OP_name.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKvhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKvubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``enum req_op op`` a request operation. **Description** Convert a request operation REQ_OP_name into the string "name". Useful for debugging and tracing BIOs and requests. For an invalid request operation code, the string "UNKNOWN" is returned.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKzhjubj )}(hhh]j)}(h(``enum req_op op`` a request operation. h](j)}(h``enum req_op op``h]j)}(hj̬h]henum req_op op}(hjάhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjʬubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKwhjƬubj2)}(hhh]h)}(ha request operation.h]ha request operation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKwhjubah}(h]h ]h"]h$]h&]uh1j1hjƬubeh}(h]h ]h"]h$]h&]uh1jhjhKwhjìubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKyhjubh)}(hConvert a request operation REQ_OP_name into the string "name". Useful for debugging and tracing BIOs and requests. For an invalid request operation code, the string "UNKNOWN" is returned.h]hConvert a request operation REQ_OP_name into the string “name”. Useful for debugging and tracing BIOs and requests. For an invalid request operation code, the string “UNKNOWN” is returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKxhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_sync_queue (C function)c.blk_sync_queuehNtauh1hhjhhhNhNubj)}(hhh](j)}(h-void blk_sync_queue (struct request_queue *q)h]j)}(h,void blk_sync_queue(struct request_queue *q)h](j )}(hvoidh]hvoid}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHhhhjZhKubj{)}(hblk_sync_queueh]j)}(hblk_sync_queueh]hblk_sync_queue}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjHhhhjZhKubj)}(h(struct request_queue *q)h]j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h request_queueh]h request_queue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY josbc.blk_sync_queueasbuh1hhjubj2)}(h h]h }(hjǭhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjխhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjfh]hq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjHhhhjZhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjDhhhjZhKubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1jhjZhKhjAhhubj)}(hhh]h)}(h'cancel any pending callbacks on a queueh]h'cancel any pending callbacks on a queue}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjZhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj#jj#jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct request_queue *q`` the queue **Description** The block layer may perform asynchronous callback activity on a queue, such as calling the unplug function after a timeout. A block device may call blk_sync_queue to ensure that any such activity is cancelled, thus allowing it to release resources that the callbacks might use. The caller must already have made sure that its ->submit_bio will not re-add plugging prior to calling this function. This function does not cancel any asynchronous activity arising out of elevator or throttling code. That would require elevator_exit() and blkcg_exit_queue() to be called with queue lock initialized.h](h)}(h**Parameters**h]j)}(hj-h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKhj'ubj )}(hhh]j)}(h&``struct request_queue *q`` the queue h](j)}(h``struct request_queue *q``h]j)}(hjLh]hstruct request_queue *q}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKhjFubj2)}(hhh]h)}(h the queueh]h the queue}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahKhjbubah}(h]h ]h"]h$]h&]uh1j1hjFubeh}(h]h ]h"]h$]h&]uh1jhjahKhjCubah}(h]h ]h"]h$]h&]uh1j hj'ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKhj'ubj)}(hXTThe block layer may perform asynchronous callback activity on a queue, such as calling the unplug function after a timeout. A block device may call blk_sync_queue to ensure that any such activity is cancelled, thus allowing it to release resources that the callbacks might use. The caller must already have made sure that its ->submit_bio will not re-add plugging prior to calling this function. This function does not cancel any asynchronous activity arising out of elevator or throttling code. That would require elevator_exit() and blkcg_exit_queue() to be called with queue lock initialized.h](h)}(hXThe block layer may perform asynchronous callback activity on a queue, such as calling the unplug function after a timeout. A block device may call blk_sync_queue to ensure that any such activity is cancelled, thus allowing it to release resources that the callbacks might use. The caller must already have made sure that its ->submit_bio will not re-add plugging prior to calling this function.h]hXThe block layer may perform asynchronous callback activity on a queue, such as calling the unplug function after a timeout. A block device may call blk_sync_queue to ensure that any such activity is cancelled, thus allowing it to release resources that the callbacks might use. The caller must already have made sure that its ->submit_bio will not re-add plugging prior to calling this function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chKhjubh)}(hThis function does not cancel any asynchronous activity arising out of elevator or throttling code. That would require elevator_exit() and blkcg_exit_queue() to be called with queue lock initialized.h]hThis function does not cancel any asynchronous activity arising out of elevator or throttling code. That would require elevator_exit() and blkcg_exit_queue() to be called with queue lock initialized.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_set_pm_only (C function)c.blk_set_pm_onlyhNtauh1hhjhhhNhNubj)}(hhh](j)}(h.void blk_set_pm_only (struct request_queue *q)h]j)}(h-void blk_set_pm_only(struct request_queue *q)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hblk_set_pm_onlyh]j)}(hblk_set_pm_onlyh]hblk_set_pm_only}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct request_queue *q)h]j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h request_queueh]h request_queue}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjBmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_set_pm_onlyasbuh1hhjubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjfh]hq}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjݮhhhjhMubah}(h]jخah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjڮhhubj)}(hhh]h)}(hincrement pm_only counterh]hincrement pm_only counter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjڮhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hC**Parameters** ``struct request_queue *q`` request queue pointerh](h)}(h**Parameters**h]j)}(hjƯh]h Parameters}(hjȯhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjįubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubj )}(hhh]j)}(h1``struct request_queue *q`` request queue pointerh](j)}(h``struct request_queue *q``h]j)}(hjh]hstruct request_queue *q}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhj߯ubj2)}(hhh]h)}(hrequest queue pointerh]hrequest queue pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubah}(h]h ]h"]h$]h&]uh1j1hj߯ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjܯubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_put_queue (C function)c.blk_put_queuehNtauh1hhjhhhNhNubj)}(hhh](j)}(h,void blk_put_queue (struct request_queue *q)h]j)}(h+void blk_put_queue(struct request_queue *q)h](j )}(hvoidh]hvoid}(hj?hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj;hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM9ubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;hhhjMhM9ubj{)}(h blk_put_queueh]j)}(h blk_put_queueh]h blk_put_queue}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj;hhhjMhM9ubj)}(h(struct request_queue *q)h]j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubh)}(hhh]j)}(h request_queueh]h request_queue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jbsbc.blk_put_queueasbuh1hhjxubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubj)}(hjh]h*}(hjȰhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(hjfh]hq}(hjհhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubah}(h]h ]h"]h$]h&]jjuh1jhj;hhhjMhM9ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj7hhhjMhM9ubah}(h]j2ah ](jjeh"]h$]h&]jj)jhuh1jhjMhM9hj4hhubj)}(hhh]h)}(h$decrement the request_queue refcounth]h$decrement the request_queue refcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM9hjhhubah}(h]h ]h"]h$]h&]uh1jhj4hhhjMhM9ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct request_queue *q`` the request_queue structure to decrement the refcount for **Description** Decrements the refcount of the request_queue and free it when the refcount reaches 0.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM=hjubj )}(hhh]j)}(hV``struct request_queue *q`` the request_queue structure to decrement the refcount for h](j)}(h``struct request_queue *q``h]j)}(hj?h]hstruct request_queue *q}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM:hj9ubj2)}(hhh]h)}(h9the request_queue structure to decrement the refcount forh]h9the request_queue structure to decrement the refcount for}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThM:hjUubah}(h]h ]h"]h$]h&]uh1j1hj9ubeh}(h]h ]h"]h$]h&]uh1jhjThM:hj6ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjzh]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM<hjubh)}(hUDecrements the refcount of the request_queue and free it when the refcount reaches 0.h]hUDecrements the refcount of the request_queue and free it when the refcount reaches 0.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM;hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_get_queue (C function)c.blk_get_queuehNtauh1hhjhhhNhNubj)}(hhh](j)}(h,bool blk_get_queue (struct request_queue *q)h]j)}(h+bool blk_get_queue(struct request_queue *q)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM ubj2)}(h h]h }(hjͱhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj̱hM ubj{)}(h blk_get_queueh]j)}(h blk_get_queueh]h blk_get_queue}(hj߱hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj۱ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj̱hM ubj)}(h(struct request_queue *q)h]j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h request_queueh]h request_queue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_get_queueasbuh1hhjubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjfh]hq}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj̱hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj̱hM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj̱hM hjhhubj)}(hhh]h)}(h$increment the request_queue refcounth]h$increment the request_queue refcount}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM hjzhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj̱hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct request_queue *q`` the request_queue structure to increment the refcount for **Description** Increment the refcount of the request_queue kobject. **Context** Any context.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubj )}(hhh]j)}(hV``struct request_queue *q`` the request_queue structure to increment the refcount for h](j)}(h``struct request_queue *q``h]j)}(hjh]hstruct request_queue *q}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM hjubj2)}(hhh]h)}(h9the request_queue structure to increment the refcount forh]h9the request_queue structure to increment the refcount for}(hjײhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjӲhM hjԲubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjӲhM hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubh)}(h4Increment the refcount of the request_queue kobject.h]h4Increment the refcount of the request_queue kobject.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM hjubh)}(h **Context**h]j)}(hj h]hContext}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubh)}(h Any context.h]h Any context.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j submit_bio_noacct (C function)c.submit_bio_noaccthNtauh1hhjhhhNhNubj)}(hhh](j)}(h(void submit_bio_noacct (struct bio *bio)h]j)}(h'void submit_bio_noacct(struct bio *bio)h](j )}(hvoidh]hvoid}(hjehhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjahhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM)ubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjahhhjshM)ubj{)}(hsubmit_bio_noaccth]j)}(hsubmit_bio_noaccth]hsubmit_bio_noacct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjahhhjshM)ubj)}(h(struct bio *bio)h]j)}(hstruct bio *bioh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbioh]hbio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj³modnameN classnameNj] j` )}jc ]jf )}jY jsbc.submit_bio_noacctasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbioh]hbio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjahhhjshM)ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]hhhjshM)ubah}(h]jXah ](jjeh"]h$]h&]jj)jhuh1jhjshM)hjZhhubj)}(hhh]h)}(h1re-submit a bio to the block device layer for I/Oh]h1re-submit a bio to the block device layer for I/O}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM)hj"hhubah}(h]h ]h"]h$]h&]uh1jhjZhhhjshM)ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj=jj=jjjuh1jhhhjhNhNubj)}(hX^**Parameters** ``struct bio *bio`` The bio describing the location in memory and on the device. **Description** This is a version of submit_bio() that shall only be used for I/O that is resubmitted to lower level drivers by stacking block drivers. All file systems and other upper level users of the block layer should use submit_bio() instead.h](h)}(h**Parameters**h]j)}(hjGh]h Parameters}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM-hjAubj )}(hhh]j)}(hQ``struct bio *bio`` The bio describing the location in memory and on the device. h](j)}(h``struct bio *bio``h]j)}(hjfh]hstruct bio *bio}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chM*hj`ubj2)}(hhh]h)}(hah"]h$]h&]uh1j1hjhhhjhMubj{)}(h submit_bioh]j)}(h submit_bioh]h submit_bio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct bio *bio)h]j)}(hstruct bio *bioh](j)}(hjAh]hstruct}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbioh]hbio}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjCmodnameN classnameNj] j` )}jc ]jf )}jY j sb c.submit_bioasbuh1hhjubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbioh]hbio}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj޴hhhjhMubah}(h]jٴah ](jjeh"]h$]h&]jj)jhuh1jhjhMhj۴hhubj)}(hhh]h)}(h.submit a bio to the block device layer for I/Oh]h.submit a bio to the block device layer for I/O}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj۴hhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXD**Parameters** ``struct bio *bio`` The :c:type:`struct bio ` which describes the I/O **Description** submit_bio() is used to submit I/O requests to block devices. It is passed a fully set up :c:type:`struct bio ` that describes the I/O that needs to be done. The bio will be sent to the device described by the bi_bdev field. The success/failure status of the request, along with notification of completion, is delivered asynchronously through the ->bi_end_io() callback in **bio**. The bio must NOT be touched by the caller until ->bi_end_io() has been called.h](h)}(h**Parameters**h]j)}(hjȵh]h Parameters}(hjʵhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƵubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjµubj )}(hhh]j)}(hK``struct bio *bio`` The :c:type:`struct bio ` which describes the I/O h](j)}(h``struct bio *bio``h]j)}(hjh]hstruct bio *bio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubj2)}(hhh]h)}(h6The :c:type:`struct bio ` which describes the I/Oh](hThe }(hjhhhNhNubh)}(h:c:type:`struct bio `h]j)}(hj h]h struct bio}(hj hhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjbiouh1hhjhMhjubh which describes the I/O}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj޵ubah}(h]h ]h"]h$]h&]uh1j hjµubh)}(h**Description**h]j)}(hjEh]h Description}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjµubh)}(hsubmit_bio() is used to submit I/O requests to block devices. It is passed a fully set up :c:type:`struct bio ` that describes the I/O that needs to be done. The bio will be sent to the device described by the bi_bdev field.h](h[submit_bio() is used to submit I/O requests to block devices. It is passed a fully set up }(hj[hhhNhNubh)}(h:c:type:`struct bio `h]j)}(hjeh]h struct bio}(hjghhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjbiouh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhj[ubhr that describes the I/O that needs to be done. The bio will be sent to the device described by the bi_bdev field.}(hj[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjµubh)}(hThe success/failure status of the request, along with notification of completion, is delivered asynchronously through the ->bi_end_io() callback in **bio**. The bio must NOT be touched by the caller until ->bi_end_io() has been called.h](hThe success/failure status of the request, along with notification of completion, is delivered asynchronously through the ->bi_end_io() callback in }(hjhhhNhNubj)}(h**bio**h]hbio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhQ. The bio must NOT be touched by the caller until ->bi_end_io() has been called.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjµubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bio_poll (C function) c.bio_pollhNtauh1hhjhhhNhNubj)}(hhh](j)}(hMint bio_poll (struct bio *bio, struct io_comp_batch *iob, unsigned int flags)h]j)}(hLint bio_poll(struct bio *bio, struct io_comp_batch *iob, unsigned int flags)h](j )}(hinth]hint}(hjζhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjʶhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMubj2)}(h h]h }(hjݶhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjʶhhhjܶhMubj{)}(hbio_pollh]j)}(hbio_pollh]hbio_poll}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjʶhhhjܶhMubj)}(h@(struct bio *bio, struct io_comp_batch *iob, unsigned int flags)h](j)}(hstruct bio *bioh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbioh]hbio}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj+modnameN classnameNj] j` )}jc ]jf )}jY jsb c.bio_pollasbuh1hhjubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbioh]hbio}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct io_comp_batch *iobh](j)}(hjAh]hstruct}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyubh)}(hhh]j)}(h io_comp_batchh]h io_comp_batch}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jE c.bio_pollasbuh1hhjyubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyubj)}(hjh]h*}(hjǷhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(hiobh]hiob}(hjԷhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int flagsh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hflagsh]hflags}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjʶhhhjܶhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjƶhhhjܶhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjܶhMhjöhhubj)}(hhh]h)}(hpoll for BIO completionsh]hpoll for BIO completions}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjLhhubah}(h]h ]h"]h$]h&]uh1jhjöhhhjܶhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjgjjgjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct bio *bio`` bio to poll for ``struct io_comp_batch *iob`` batches of IO ``unsigned int flags`` BLK_POLL_* flags that control the behavior **Description** Poll for completions on queue associated with the bio. Returns number of completed entries found. **Note** the caller must either be the context that submitted **bio**, or be in a RCU critical section to prevent freeing of **bio**.h](h)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjkubj )}(hhh](j)}(h$``struct bio *bio`` bio to poll for h](j)}(h``struct bio *bio``h]j)}(hjh]hstruct bio *bio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubj2)}(hhh]h)}(hbio to poll forh]hbio to poll for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h,``struct io_comp_batch *iob`` batches of IO h](j)}(h``struct io_comp_batch *iob``h]j)}(hjɸh]hstruct io_comp_batch *iob}(hj˸hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjǸubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjøubj2)}(hhh]h)}(h batches of IOh]h batches of IO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj޸hMhj߸ubah}(h]h ]h"]h$]h&]uh1j1hjøubeh}(h]h ]h"]h$]h&]uh1jhj޸hMhjubj)}(hB``unsigned int flags`` BLK_POLL_* flags that control the behavior h](j)}(h``unsigned int flags``h]j)}(hjh]hunsigned int flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubj2)}(hhh]h)}(h*BLK_POLL_* flags that control the behaviorh]h*BLK_POLL_* flags that control the behavior}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjkubh)}(h**Description**h]j)}(hj=h]h Description}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjkubh)}(haPoll for completions on queue associated with the bio. Returns number of completed entries found.h]haPoll for completions on queue associated with the bio. Returns number of completed entries found.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjkubh)}(h**Note**h]j)}(hjdh]hNote}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjkubh)}(h|the caller must either be the context that submitted **bio**, or be in a RCU critical section to prevent freeing of **bio**.h](h5the caller must either be the context that submitted }(hjzhhhNhNubj)}(h**bio**h]hbio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubh8, or be in a RCU critical section to prevent freeing of }(hjzhhhNhNubj)}(h**bio**h]hbio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubh.}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bio_start_io_acct (C function)c.bio_start_io_accthNtauh1hhjhhhNhNubj)}(hhh](j)}(h1unsigned long bio_start_io_acct (struct bio *bio)h]j)}(h0unsigned long bio_start_io_acct(struct bio *bio)h](j )}(hunsignedh]hunsigned}(hj͹hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjɹhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMAubj2)}(h h]h }(hjܹhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjɹhhhj۹hMAubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjɹhhhj۹hMAubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjɹhhhj۹hMAubj{)}(hbio_start_io_accth]j)}(hbio_start_io_accth]hbio_start_io_acct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjɹhhhj۹hMAubj)}(h(struct bio *bio)h]j)}(hstruct bio *bioh](j)}(hjAh]hstruct}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"ubh)}(hhh]j)}(hbioh]hbio}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjFmodnameN classnameNj] j` )}jc ]jf )}jY j sbc.bio_start_io_acctasbuh1hhj"ubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"ubj)}(hjh]h*}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hbioh]hbio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjɹhhhj۹hMAubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjŹhhhj۹hMAubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj۹hMAhj¹hhubj)}(hhh]h)}(h*start I/O accounting for bio based driversh]h*start I/O accounting for bio based drivers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMAhjhhubah}(h]h ]h"]h$]h&]uh1jhj¹hhhj۹hMAubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct bio *bio`` bio to start account for **Description** Returns the start time that should be passed back to bio_end_io_acct().h](h)}(h**Parameters**h]j)}(hj˺h]h Parameters}(hjͺhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɺubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMEhjźubj )}(hhh]j)}(h-``struct bio *bio`` bio to start account for h](j)}(h``struct bio *bio``h]j)}(hjh]hstruct bio *bio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMBhjubj2)}(hhh]h)}(hbio to start account forh]hbio to start account for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMBhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMBhjubah}(h]h ]h"]h$]h&]uh1j hjźubh)}(h**Description**h]j)}(hj%h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMDhjźubh)}(hGReturns the start time that should be passed back to bio_end_io_acct().h]hGReturns the start time that should be passed back to bio_end_io_acct().}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMChjźubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_lld_busy (C function)c.blk_lld_busyhNtauh1hhjhhhNhNubj)}(hhh](j)}(h*int blk_lld_busy (struct request_queue *q)h]j)}(h)int blk_lld_busy(struct request_queue *q)h](j )}(hinth]hint}(hjjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMeubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfhhhjxhMeubj{)}(h blk_lld_busyh]j)}(h blk_lld_busyh]h blk_lld_busy}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjfhhhjxhMeubj)}(h(struct request_queue *q)h]j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h request_queueh]h request_queue}(hjŻhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj»ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjǻmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_lld_busyasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjfh]hq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjfhhhjxhMeubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjbhhhjxhMeubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1jhjxhMehj_hhubj)}(hhh]h)}(h:Check if underlying low-level drivers of a device are busyh]h:Check if underlying low-level drivers of a device are busy}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMehj&hhubah}(h]h ]h"]h$]h&]uh1jhj_hhhjxhMeubeh}(h]h ](jfunctioneh"]h$]h&]jjjjAjjAjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct request_queue *q`` the queue of the device being checked **Description** Check if underlying low-level drivers of a device are busy. If the drivers want to export their busy state, they must set own exporting function using blk_queue_lld_busy() first. Basically, this function is used only by request stacking drivers to stop dispatching requests to underlying devices when underlying devices are busy. This behavior helps more I/O merging on the queue of the request stacking driver and prevents I/O throughput regression on burst I/O load. **Return** 0 - Not busy (The request stacking driver should dispatch request) 1 - Busy (The request stacking driver should stop dispatching request)h](h)}(h**Parameters**h]j)}(hjKh]h Parameters}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMihjEubj )}(hhh]j)}(hB``struct request_queue *q`` the queue of the device being checked h](j)}(h``struct request_queue *q``h]j)}(hjjh]hstruct request_queue *q}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMfhjdubj2)}(hhh]h)}(h%the queue of the device being checkedh]h%the queue of the device being checked}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMfhjubah}(h]h ]h"]h$]h&]uh1j1hjdubeh}(h]h ]h"]h$]h&]uh1jhjhMfhjaubah}(h]h ]h"]h$]h&]uh1j hjEubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhhjEubj)}(hXCheck if underlying low-level drivers of a device are busy. If the drivers want to export their busy state, they must set own exporting function using blk_queue_lld_busy() first. Basically, this function is used only by request stacking drivers to stop dispatching requests to underlying devices when underlying devices are busy. This behavior helps more I/O merging on the queue of the request stacking driver and prevents I/O throughput regression on burst I/O load. h](h)}(hCheck if underlying low-level drivers of a device are busy. If the drivers want to export their busy state, they must set own exporting function using blk_queue_lld_busy() first.h]hCheck if underlying low-level drivers of a device are busy. If the drivers want to export their busy state, they must set own exporting function using blk_queue_lld_busy() first.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhhjubh)}(hX"Basically, this function is used only by request stacking drivers to stop dispatching requests to underlying devices when underlying devices are busy. This behavior helps more I/O merging on the queue of the request stacking driver and prevents I/O throughput regression on burst I/O load.h]hX"Basically, this function is used only by request stacking drivers to stop dispatching requests to underlying devices when underlying devices are busy. This behavior helps more I/O merging on the queue of the request stacking driver and prevents I/O throughput regression on burst I/O load.}(hjμhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMlhjubeh}(h]h ]h"]h$]h&]uh1jhjͼhMhhjEubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMrhjEubh)}(h0 - Not busy (The request stacking driver should dispatch request) 1 - Busy (The request stacking driver should stop dispatching request)h]h0 - Not busy (The request stacking driver should dispatch request) 1 - Busy (The request stacking driver should stop dispatching request)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMshjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_start_plug (C function)c.blk_start_plughNtauh1hhjhhhNhNubj)}(hhh](j)}(h+void blk_start_plug (struct blk_plug *plug)h]j)}(h*void blk_start_plug(struct blk_plug *plug)h](j )}(hvoidh]hvoid}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&hhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&hhhj8hMubj{)}(hblk_start_plugh]j)}(hblk_start_plugh]hblk_start_plug}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj&hhhj8hMubj)}(h(struct blk_plug *plug)h]j)}(hstruct blk_plug *plugh](j)}(hjAh]hstruct}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubh)}(hhh]j)}(hblk_plugh]hblk_plug}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jMsbc.blk_start_plugasbuh1hhjcubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hplugh]hplug}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubah}(h]h ]h"]h$]h&]jjuh1jhj&hhhj8hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj"hhhj8hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj8hMhjhhubj)}(hhh]h)}(h7initialize blk_plug and track it inside the task_structh]h7initialize blk_plug and track it inside the task_struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj8hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct blk_plug *plug`` The :c:type:`struct blk_plug ` that needs to be initialized **Description** blk_start_plug() indicates to the block layer an intent by the caller to submit multiple I/O requests in a batch. The block layer may use this hint to defer submitting I/Os from the caller until blk_finish_plug() is called. However, the block layer may choose to submit requests before a call to blk_finish_plug() if the number of queued I/Os exceeds ``BLK_MAX_REQUEST_COUNT``, or if the size of the I/O is larger than ``BLK_PLUG_FLUSH_SIZE``. The queued I/Os may also be submitted early if the task schedules (see below). Tracking blk_plug inside the task_struct will help with auto-flushing the pending I/O should the task end up blocking between blk_start_plug() and blk_finish_plug(). This is important from a performance perspective, but also ensures that we don't deadlock. For instance, if the task is blocking for a memory allocation, memory reclaim could end up wanting to free a page belonging to that request that is currently residing in our private plug. By flushing the pending I/O when the process goes to sleep, we avoid this kind of deadlock.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubj )}(hhh]j)}(h```struct blk_plug *plug`` The :c:type:`struct blk_plug ` that needs to be initialized h](j)}(h``struct blk_plug *plug``h]j)}(hj+h]hstruct blk_plug *plug}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhj%ubj2)}(hhh]h)}(hEThe :c:type:`struct blk_plug ` that needs to be initializedh](hThe }(hjDhhhNhNubh)}(h$:c:type:`struct blk_plug `h]j)}(hjNh]hstruct blk_plug}(hjPhhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjblk_pluguh1hhj@hMhjDubh that needs to be initialized}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj@hMhjAubah}(h]h ]h"]h$]h&]uh1j1hj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhj"ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubj)}(hX'blk_start_plug() indicates to the block layer an intent by the caller to submit multiple I/O requests in a batch. The block layer may use this hint to defer submitting I/Os from the caller until blk_finish_plug() is called. However, the block layer may choose to submit requests before a call to blk_finish_plug() if the number of queued I/Os exceeds ``BLK_MAX_REQUEST_COUNT``, or if the size of the I/O is larger than ``BLK_PLUG_FLUSH_SIZE``. The queued I/Os may also be submitted early if the task schedules (see below). Tracking blk_plug inside the task_struct will help with auto-flushing the pending I/O should the task end up blocking between blk_start_plug() and blk_finish_plug(). This is important from a performance perspective, but also ensures that we don't deadlock. For instance, if the task is blocking for a memory allocation, memory reclaim could end up wanting to free a page belonging to that request that is currently residing in our private plug. By flushing the pending I/O when the process goes to sleep, we avoid this kind of deadlock.h](h)}(hX blk_start_plug() indicates to the block layer an intent by the caller to submit multiple I/O requests in a batch. The block layer may use this hint to defer submitting I/Os from the caller until blk_finish_plug() is called. However, the block layer may choose to submit requests before a call to blk_finish_plug() if the number of queued I/Os exceeds ``BLK_MAX_REQUEST_COUNT``, or if the size of the I/O is larger than ``BLK_PLUG_FLUSH_SIZE``. The queued I/Os may also be submitted early if the task schedules (see below).h](hXablk_start_plug() indicates to the block layer an intent by the caller to submit multiple I/O requests in a batch. The block layer may use this hint to defer submitting I/Os from the caller until blk_finish_plug() is called. However, the block layer may choose to submit requests before a call to blk_finish_plug() if the number of queued I/Os exceeds }(hjhhhNhNubj)}(h``BLK_MAX_REQUEST_COUNT``h]hBLK_MAX_REQUEST_COUNT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+, or if the size of the I/O is larger than }(hjhhhNhNubj)}(h``BLK_PLUG_FLUSH_SIZE``h]hBLK_PLUG_FLUSH_SIZE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhQ. The queued I/Os may also be submitted early if the task schedules (see below).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubh)}(hXTracking blk_plug inside the task_struct will help with auto-flushing the pending I/O should the task end up blocking between blk_start_plug() and blk_finish_plug(). This is important from a performance perspective, but also ensures that we don't deadlock. For instance, if the task is blocking for a memory allocation, memory reclaim could end up wanting to free a page belonging to that request that is currently residing in our private plug. By flushing the pending I/O when the process goes to sleep, we avoid this kind of deadlock.h]hXTracking blk_plug inside the task_struct will help with auto-flushing the pending I/O should the task end up blocking between blk_start_plug() and blk_finish_plug(). This is important from a performance perspective, but also ensures that we don’t deadlock. For instance, if the task is blocking for a memory allocation, memory reclaim could end up wanting to free a page belonging to that request that is currently residing in our private plug. By flushing the pending I/O when the process goes to sleep, we avoid this kind of deadlock.}(hj־hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubeh}(h]h ]h"]h$]h&]uh1jhjվhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_finish_plug (C function)c.blk_finish_plughNtauh1hhjhhhNhNubj)}(hhh](j)}(h,void blk_finish_plug (struct blk_plug *plug)h]j)}(h+void blk_finish_plug(struct blk_plug *plug)h](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hblk_finish_plugh]j)}(hblk_finish_plugh]hblk_finish_plug}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct blk_plug *plug)h]j)}(hstruct blk_plug *plugh](j)}(hjAh]hstruct}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDubh)}(hhh]j)}(hblk_plugh]hblk_plug}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjhmodnameN classnameNj] j` )}jc ]jf )}jY j.sbc.blk_finish_plugasbuh1hhjDubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(hplugh]hplug}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h(mark the end of a batch of submitted I/Oh]h(mark the end of a batch of submitted I/O}(hj˿hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjȿhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct blk_plug *plug`` The :c:type:`struct blk_plug ` passed to blk_start_plug() **Description** Indicate that a batch of I/O submissions is complete. This function must be paired with an initial call to blk_start_plug(). The intent is to allow the block layer to optimize I/O submission. See the documentation for blk_start_plug() for more information.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubj )}(hhh]j)}(h^``struct blk_plug *plug`` The :c:type:`struct blk_plug ` passed to blk_start_plug() h](j)}(h``struct blk_plug *plug``h]j)}(hj h]hstruct blk_plug *plug}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubj2)}(hhh]h)}(hCThe :c:type:`struct blk_plug ` passed to blk_start_plug()h](hThe }(hj%hhhNhNubh)}(h$:c:type:`struct blk_plug `h]j)}(hj/h]hstruct blk_plug}(hj1hhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjblk_pluguh1hhj!hMhj%ubh passed to blk_start_plug()}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj!hMhj"ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj!hMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjjh]h Description}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubh)}(hXIndicate that a batch of I/O submissions is complete. This function must be paired with an initial call to blk_start_plug(). The intent is to allow the block layer to optimize I/O submission. See the documentation for blk_start_plug() for more information.h]hXIndicate that a batch of I/O submissions is complete. This function must be paired with an initial call to blk_start_plug(). The intent is to allow the block layer to optimize I/O submission. See the documentation for blk_start_plug() for more information.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:312: ./block/blk-core.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_queue_enter (C function)c.blk_queue_enterhNtauh1hhjhhhNhNubj)}(hhh](j)}(hGint blk_queue_enter (struct request_queue *q, blk_mq_req_flags_t flags)h]j)}(hFint blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:315: ./block/blk-core.chMWubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMWubj{)}(hblk_queue_enterh]j)}(hblk_queue_enterh]hblk_queue_enter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMWubj)}(h3(struct request_queue *q, blk_mq_req_flags_t flags)h](j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h request_queueh]h request_queue}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_queue_enterasbuh1hhjubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjfh]hq}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hblk_mq_req_flags_t flagsh](h)}(hhh]j)}(hblk_mq_req_flags_th]hblk_mq_req_flags_t}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjbmodnameN classnameNj] j` )}jc ]j&c.blk_queue_enterasbuh1hhjYubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMWubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMWubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMWhjhhubj)}(hhh]h)}(h"try to increase q->q_usage_counterh]h"try to increase q->q_usage_counter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:315: ./block/blk-core.chMWhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMWubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct request_queue *q`` request queue pointer ``blk_mq_req_flags_t flags`` BLK_MQ_REQ_NOWAIT and/or BLK_MQ_REQ_PMh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:315: ./block/blk-core.chM[hjubj )}(hhh](j)}(h2``struct request_queue *q`` request queue pointer h](j)}(h``struct request_queue *q``h]j)}(hjh]hstruct request_queue *q}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:315: ./block/blk-core.chMXhjubj2)}(hhh]h)}(hrequest queue pointerh]hrequest queue pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMXhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMXhjubj)}(hC``blk_mq_req_flags_t flags`` BLK_MQ_REQ_NOWAIT and/or BLK_MQ_REQ_PMh](j)}(h``blk_mq_req_flags_t flags``h]j)}(hj0h]hblk_mq_req_flags_t flags}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:315: ./block/blk-core.chMZhj*ubj2)}(hhh]h)}(h&BLK_MQ_REQ_NOWAIT and/or BLK_MQ_REQ_PMh]h&BLK_MQ_REQ_NOWAIT and/or BLK_MQ_REQ_PM}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:315: ./block/blk-core.chMYhjFubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhjEhMZhjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  blk_rq_map_user_iov (C function)c.blk_rq_map_user_iovhNtauh1hhjhhhNhNubj)}(hhh](j)}(hint blk_rq_map_user_iov (struct request_queue *q, struct request *rq, struct rq_map_data *map_data, const struct iov_iter *iter, gfp_t gfp_mask)h]j)}(hint blk_rq_map_user_iov(struct request_queue *q, struct request *rq, struct rq_map_data *map_data, const struct iov_iter *iter, gfp_t gfp_mask)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hblk_rq_map_user_iovh]j)}(hblk_rq_map_user_iovh]hblk_rq_map_user_iov}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hx(struct request_queue *q, struct request *rq, struct rq_map_data *map_data, const struct iov_iter *iter, gfp_t gfp_mask)h](j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h request_queueh]h request_queue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_rq_map_user_iovasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjfh]hq}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct request *rqh](j)}(hjAh]hstruct}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4ubh)}(hhh]j)}(hrequesth]hrequest}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjXmodnameN classnameNj] j` )}jc ]jc.blk_rq_map_user_iovasbuh1hhj4ubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(hrqh]hrq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct rq_map_data *map_datah](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h rq_map_datah]h rq_map_data}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.blk_rq_map_user_iovasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmap_datah]hmap_data}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst struct iov_iter *iterh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj%hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hiov_iterh]hiov_iter}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjSmodnameN classnameNj] j` )}jc ]jc.blk_rq_map_user_iovasbuh1hhjubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hiterh]hiter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.blk_rq_map_user_iovasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hgfp_maskh]hgfp_mask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h4map user data to a request, for passthrough requestsh]h4map user data to a request, for passthrough requests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX0**Parameters** ``struct request_queue *q`` request queue where request should be inserted ``struct request *rq`` request to map data to ``struct rq_map_data *map_data`` pointer to the rq_map_data holding pages (if necessary) ``const struct iov_iter *iter`` iovec iterator ``gfp_t gfp_mask`` memory allocation flags **Description** Data will be mapped directly for zero copy I/O, if possible. Otherwise a kernel bounce buffer is used. A matching blk_rq_unmap_user() must be issued at the end of I/O, while still in process context.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjubj )}(hhh](j)}(hK``struct request_queue *q`` request queue where request should be inserted h](j)}(h``struct request_queue *q``h]j)}(hj=h]hstruct request_queue *q}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhj7ubj2)}(hhh]h)}(h.request queue where request should be insertedh]h.request queue where request should be inserted}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhjSubah}(h]h ]h"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhMhj4ubj)}(h.``struct request *rq`` request to map data to h](j)}(h``struct request *rq``h]j)}(hjvh]hstruct request *rq}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjpubj2)}(hhh]h)}(hrequest to map data toh]hrequest to map data to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhjhMhj4ubj)}(hY``struct rq_map_data *map_data`` pointer to the rq_map_data holding pages (if necessary) h](j)}(h ``struct rq_map_data *map_data``h]j)}(hjh]hstruct rq_map_data *map_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjubj2)}(hhh]h)}(h7pointer to the rq_map_data holding pages (if necessary)h]h7pointer to the rq_map_data holding pages (if necessary)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj4ubj)}(h/``const struct iov_iter *iter`` iovec iterator h](j)}(h``const struct iov_iter *iter``h]j)}(hjh]hconst struct iov_iter *iter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjubj2)}(hhh]h)}(hiovec iteratorh]hiovec iterator}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj4ubj)}(h+``gfp_t gfp_mask`` memory allocation flags h](j)}(h``gfp_t gfp_mask``h]j)}(hj!h]hgfp_t gfp_mask}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjubj2)}(hhh]h)}(hmemory allocation flagsh]hmemory allocation flags}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj6hMhj4ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj\h]h Description}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjubj)}(hData will be mapped directly for zero copy I/O, if possible. Otherwise a kernel bounce buffer is used. A matching blk_rq_unmap_user() must be issued at the end of I/O, while still in process context.h](h)}(hfData will be mapped directly for zero copy I/O, if possible. Otherwise a kernel bounce buffer is used.h]hfData will be mapped directly for zero copy I/O, if possible. Otherwise a kernel bounce buffer is used.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjrubh)}(h`A matching blk_rq_unmap_user() must be issued at the end of I/O, while still in process context.h]h`A matching blk_rq_unmap_user() must be issued at the end of I/O, while still in process context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjrubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_rq_unmap_user (C function)c.blk_rq_unmap_userhNtauh1hhjhhhNhNubj)}(hhh](j)}(h'int blk_rq_unmap_user (struct bio *bio)h]j)}(h&int blk_rq_unmap_user(struct bio *bio)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chM^ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM^ubj{)}(hblk_rq_unmap_userh]j)}(hblk_rq_unmap_userh]hblk_rq_unmap_user}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM^ubj)}(h(struct bio *bio)h]j)}(hstruct bio *bioh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbioh]hbio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_rq_unmap_userasbuh1hhjubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbioh]hbio}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM^ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM^ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM^hjhhubj)}(hhh]h)}(hunmap a request with user datah]hunmap a request with user data}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chM^hjwhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM^ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct bio *bio`` start of bio list **Description** Unmap a rq previously mapped by blk_rq_map_user(). The caller must supply the original rq->bio from the blk_rq_map_user() return, since the I/O completion may have changed rq->bio.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMbhjubj )}(hhh]j)}(h&``struct bio *bio`` start of bio list h](j)}(h``struct bio *bio``h]j)}(hjh]hstruct bio *bio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chM_hjubj2)}(hhh]h)}(hstart of bio listh]hstart of bio list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM_hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM_hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMahjubj)}(hUnmap a rq previously mapped by blk_rq_map_user(). The caller must supply the original rq->bio from the blk_rq_map_user() return, since the I/O completion may have changed rq->bio.h]h)}(hUnmap a rq previously mapped by blk_rq_map_user(). The caller must supply the original rq->bio from the blk_rq_map_user() return, since the I/O completion may have changed rq->bio.h]hUnmap a rq previously mapped by blk_rq_map_user(). The caller must supply the original rq->bio from the blk_rq_map_user() return, since the I/O completion may have changed rq->bio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMahj ubah}(h]h ]h"]h$]h&]uh1jhjhMahjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_rq_map_kern (C function)c.blk_rq_map_kernhNtauh1hhjhhhNhNubj)}(hhh](j)}(hVint blk_rq_map_kern (struct request *rq, void *kbuf, unsigned int len, gfp_t gfp_mask)h]j)}(hUint blk_rq_map_kern(struct request *rq, void *kbuf, unsigned int len, gfp_t gfp_mask)h](j )}(hinth]hint}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjAhhhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAhhhjShMubj{)}(hblk_rq_map_kernh]j)}(hblk_rq_map_kernh]hblk_rq_map_kern}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjAhhhjShMubj)}(hB(struct request *rq, void *kbuf, unsigned int len, gfp_t gfp_mask)h](j)}(hstruct request *rqh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubh)}(hhh]j)}(hrequesth]hrequest}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jhsbc.blk_rq_map_kernasbuh1hhj~ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj)}(hrqh]hrq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjzubj)}(h void *kbufh](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hkbufh]hkbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjzubj)}(hunsigned int lenh](j )}(hunsignedh]hunsigned}(hj6hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj2ubj2)}(h h]h }(hjDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubj )}(hinth]hint}(hjRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj2ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubj)}(hlenh]hlen}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjzubj)}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.blk_rq_map_kernasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hgfp_maskh]hgfp_mask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjzubeh}(h]h ]h"]h$]h&]jjuh1jhjAhhhjShMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj=hhhjShMubah}(h]j8ah ](jjeh"]h$]h&]jj)jhuh1jhjShMhj:hhubj)}(hhh]h)}(h6map kernel data to a request, for passthrough requestsh]h6map kernel data to a request, for passthrough requests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj:hhhjShMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXW**Parameters** ``struct request *rq`` request to fill ``void *kbuf`` the kernel buffer ``unsigned int len`` length of user data ``gfp_t gfp_mask`` memory allocation flags **Description** Data will be mapped directly if possible. Otherwise a bounce buffer is used. Can be called multiple times to append multiple buffers.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjubj )}(hhh](j)}(h'``struct request *rq`` request to fill h](j)}(h``struct request *rq``h]j)}(hj!h]hstruct request *rq}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjubj2)}(hhh]h)}(hrequest to fillh]hrequest to fill}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj6hMhjubj)}(h!``void *kbuf`` the kernel buffer h](j)}(h``void *kbuf``h]j)}(hjZh]h void *kbuf}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjTubj2)}(hhh]h)}(hthe kernel bufferh]hthe kernel buffer}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohMhjpubah}(h]h ]h"]h$]h&]uh1j1hjTubeh}(h]h ]h"]h$]h&]uh1jhjohMhjubj)}(h)``unsigned int len`` length of user data h](j)}(h``unsigned int len``h]j)}(hjh]hunsigned int len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjubj2)}(hhh]h)}(hlength of user datah]hlength of user data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h+``gfp_t gfp_mask`` memory allocation flags h](j)}(h``gfp_t gfp_mask``h]j)}(hjh]hgfp_t gfp_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjubj2)}(hhh]h)}(hmemory allocation flagsh]hmemory allocation flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjubj)}(hData will be mapped directly if possible. Otherwise a bounce buffer is used. Can be called multiple times to append multiple buffers.h]h)}(hData will be mapped directly if possible. Otherwise a bounce buffer is used. Can be called multiple times to append multiple buffers.h]hData will be mapped directly if possible. Otherwise a bounce buffer is used. Can be called multiple times to append multiple buffers.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:318: ./block/blk-map.chMhjubah}(h]h ]h"]h$]h&]uh1jhj/hMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_register_queue (C function)c.blk_register_queuehNtauh1hhjhhhNhNubj)}(hhh](j)}(h-int blk_register_queue (struct gendisk *disk)h]j)}(h,int blk_register_queue(struct gendisk *disk)h](j )}(hinth]hint}(hjVhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjRhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:321: ./block/blk-sysfs.chMubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRhhhjdhMubj{)}(hblk_register_queueh]j)}(hblk_register_queueh]hblk_register_queue}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjRhhhjdhMubj)}(h(struct gendisk *disk)h]j)}(hstruct gendisk *diskh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hgendiskh]hgendisk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jysbc.blk_register_queueasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdiskh]hdisk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjRhhhjdhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjNhhhjdhMubah}(h]jIah ](jjeh"]h$]h&]jj)jhuh1jhjdhMhjKhhubj)}(hhh]h)}(h'register a block layer queue with sysfsh]h'register a block layer queue with sysfs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:321: ./block/blk-sysfs.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjKhhhjdhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj.jj.jjjuh1jhhhjhNhNubj)}(hk**Parameters** ``struct gendisk *disk`` Disk of which the request queue should be registered with sysfs.h](h)}(h**Parameters**h]j)}(hj8h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:321: ./block/blk-sysfs.chMhj2ubj )}(hhh]j)}(hY``struct gendisk *disk`` Disk of which the request queue should be registered with sysfs.h](j)}(h``struct gendisk *disk``h]j)}(hjWh]hstruct gendisk *disk}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:321: ./block/blk-sysfs.chMhjQubj2)}(hhh]h)}(h@Disk of which the request queue should be registered with sysfs.h]h@Disk of which the request queue should be registered with sysfs.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:321: ./block/blk-sysfs.chMhjmubah}(h]h ]h"]h$]h&]uh1j1hjQubeh}(h]h ]h"]h$]h&]uh1jhjlhMhjNubah}(h]h ]h"]h$]h&]uh1j hj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !blk_unregister_queue (C function)c.blk_unregister_queuehNtauh1hhjhhhNhNubj)}(hhh](j)}(h0void blk_unregister_queue (struct gendisk *disk)h]j)}(h/void blk_unregister_queue(struct gendisk *disk)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:321: ./block/blk-sysfs.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hblk_unregister_queueh]j)}(hblk_unregister_queueh]hblk_unregister_queue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct gendisk *disk)h]j)}(hstruct gendisk *diskh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hgendiskh]hgendisk}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_unregister_queueasbuh1hhjubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdiskh]hdisk}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h#counterpart of blk_register_queue()h]h#counterpart of blk_register_queue()}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:321: ./block/blk-sysfs.chMhjnhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct gendisk *disk`` Disk of which the request queue should be unregistered from sysfs. **Note** the caller is responsible for guaranteeing that this function is called after blk_register_queue() has finished.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:321: ./block/blk-sysfs.chM hjubj )}(hhh]j)}(h\``struct gendisk *disk`` Disk of which the request queue should be unregistered from sysfs. h](j)}(h``struct gendisk *disk``h]j)}(hjh]hstruct gendisk *disk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:321: ./block/blk-sysfs.chMhjubj2)}(hhh]h)}(hBDisk of which the request queue should be unregistered from sysfs.h]hBDisk of which the request queue should be unregistered from sysfs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:321: ./block/blk-sysfs.chM hjubh)}(hpthe caller is responsible for guaranteeing that this function is called after blk_register_queue() has finished.h]hpthe caller is responsible for guaranteeing that this function is called after blk_register_queue() has finished.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:321: ./block/blk-sysfs.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $blk_set_stacking_limits (C function)c.blk_set_stacking_limitshNtauh1hhjhhhNhNubj)}(hhh](j)}(h7void blk_set_stacking_limits (struct queue_limits *lim)h]j)}(h6void blk_set_stacking_limits(struct queue_limits *lim)h](j )}(hvoidh]hvoid}(hj2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chKubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.hhhj@hKubj{)}(hblk_set_stacking_limitsh]j)}(hblk_set_stacking_limitsh]hblk_set_stacking_limits}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj.hhhj@hKubj)}(h(struct queue_limits *lim)h]j)}(hstruct queue_limits *limh](j)}(hjAh]hstruct}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubh)}(hhh]j)}(h queue_limitsh]h queue_limits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jUsbc.blk_set_stacking_limitsasbuh1hhjkubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(hlimh]hlim}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubah}(h]h ]h"]h$]h&]jjuh1jhj.hhhj@hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj*hhhj@hKubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj@hKhj'hhubj)}(hhh]h)}(h'set default limits for stacking devicesh]h'set default limits for stacking devices}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhj'hhhj@hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct queue_limits *lim`` the queue_limits structure to reset **Description** Prepare queue limits for applying limits from underlying devices using blk_stack_limits().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chK#hjubj )}(hhh]j)}(hA``struct queue_limits *lim`` the queue_limits structure to reset h](j)}(h``struct queue_limits *lim``h]j)}(hj3h]hstruct queue_limits *lim}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chK hj-ubj2)}(hhh]h)}(h#the queue_limits structure to reseth]h#the queue_limits structure to reset}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhK hjIubah}(h]h ]h"]h$]h&]uh1j1hj-ubeh}(h]h ]h"]h$]h&]uh1jhjHhK hj*ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjnh]h Description}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chK"hjubh)}(hZPrepare queue limits for applying limits from underlying devices using blk_stack_limits().h]hZPrepare queue limits for applying limits from underlying devices using blk_stack_limits().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chK!hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'queue_limits_commit_update (C function)c.queue_limits_commit_updatehNtauh1hhjhhhNhNubj)}(hhh](j)}(hRint queue_limits_commit_update (struct request_queue *q, struct queue_limits *lim)h]j)}(hQint queue_limits_commit_update(struct request_queue *q, struct queue_limits *lim)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hqueue_limits_commit_updateh]j)}(hqueue_limits_commit_updateh]hqueue_limits_commit_update}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h3(struct request_queue *q, struct queue_limits *lim)h](j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h request_queueh]h request_queue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.queue_limits_commit_updateasbuh1hhjubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjfh]hq}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct queue_limits *limh](j)}(hjAh]hstruct}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubh)}(hhh]j)}(h queue_limitsh]h queue_limits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j*c.queue_limits_commit_updateasbuh1hhj]ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hlimh]hlim}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h'commit an atomic update of queue limitsh]h'commit an atomic update of queue limits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct request_queue *q`` queue to update ``struct queue_limits *lim`` limits to apply **Description** Apply the limits in **lim** that were obtained from queue_limits_start_update() and updated by the caller to **q**. The caller must have frozen the queue or ensure that there are no outstanding I/Os by other means. Returns 0 if successful, else a negative error code.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubj )}(hhh](j)}(h,``struct request_queue *q`` queue to update h](j)}(h``struct request_queue *q``h]j)}(hj#h]hstruct request_queue *q}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubj2)}(hhh]h)}(hqueue to updateh]hqueue to update}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj9ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj8hMhjubj)}(h-``struct queue_limits *lim`` limits to apply h](j)}(h``struct queue_limits *lim``h]j)}(hj\h]hstruct queue_limits *lim}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjVubj2)}(hhh]h)}(hlimits to applyh]hlimits to apply}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhMhjrubah}(h]h ]h"]h$]h&]uh1j1hjVubeh}(h]h ]h"]h$]h&]uh1jhjqhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubh)}(hApply the limits in **lim** that were obtained from queue_limits_start_update() and updated by the caller to **q**. The caller must have frozen the queue or ensure that there are no outstanding I/Os by other means.h](hApply the limits in }(hjhhhNhNubj)}(h**lim**h]hlim}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhR that were obtained from queue_limits_start_update() and updated by the caller to }(hjhhhNhNubj)}(h**q**h]hq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhe. The caller must have frozen the queue or ensure that there are no outstanding I/Os by other means.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubh)}(h4Returns 0 if successful, else a negative error code.h]h4Returns 0 if successful, else a negative error code.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j .queue_limits_commit_update_frozen (C function)#c.queue_limits_commit_update_frozenhNtauh1hhjhhhNhNubj)}(hhh](j)}(hYint queue_limits_commit_update_frozen (struct request_queue *q, struct queue_limits *lim)h]j)}(hXint queue_limits_commit_update_frozen(struct request_queue *q, struct queue_limits *lim)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chM>ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhM>ubj{)}(h!queue_limits_commit_update_frozenh]j)}(h!queue_limits_commit_update_frozenh]h!queue_limits_commit_update_frozen}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhM>ubj)}(h3(struct request_queue *q, struct queue_limits *lim)h](j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubh)}(hhh]j)}(h request_queueh]h request_queue}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlmodnameN classnameNj] j` )}jc ]jf )}jY j2sb#c.queue_limits_commit_update_frozenasbuh1hhjHubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hjfh]hq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubj)}(hstruct queue_limits *limh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h queue_limitsh]h queue_limits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j#c.queue_limits_commit_update_frozenasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlimh]hlim}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjDubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhjhM>ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM>ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM>hjhhubj)}(hhh]h)}(h'commit an atomic update of queue limitsh]h'commit an atomic update of queue limits}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chM>hj;hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM>ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjVjjVjjjuh1jhhhjhNhNubj)}(hXz**Parameters** ``struct request_queue *q`` queue to update ``struct queue_limits *lim`` limits to apply **Description** Apply the limits in **lim** that were obtained from queue_limits_start_update() and updated with the new values by the caller to **q**. Freezes the queue before the update and unfreezes it after. Returns 0 if successful, else a negative error code.h](h)}(h**Parameters**h]j)}(hj`h]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMBhjZubj )}(hhh](j)}(h,``struct request_queue *q`` queue to update h](j)}(h``struct request_queue *q``h]j)}(hjh]hstruct request_queue *q}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chM?hjyubj2)}(hhh]h)}(hqueue to updateh]hqueue to update}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM?hjubah}(h]h ]h"]h$]h&]uh1j1hjyubeh}(h]h ]h"]h$]h&]uh1jhjhM?hjvubj)}(h-``struct queue_limits *lim`` limits to apply h](j)}(h``struct queue_limits *lim``h]j)}(hjh]hstruct queue_limits *lim}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chM@hjubj2)}(hhh]h)}(hlimits to applyh]hlimits to apply}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM@hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM@hjvubeh}(h]h ]h"]h$]h&]uh1j hjZubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMBhjZubh)}(hApply the limits in **lim** that were obtained from queue_limits_start_update() and updated with the new values by the caller to **q**. Freezes the queue before the update and unfreezes it after.h](hApply the limits in }(hj hhhNhNubj)}(h**lim**h]hlim}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhf that were obtained from queue_limits_start_update() and updated with the new values by the caller to }(hj hhhNhNubj)}(h**q**h]hq}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh>. Freezes the queue before the update and unfreezes it after.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMAhjZubh)}(h4Returns 0 if successful, else a negative error code.h]h4Returns 0 if successful, else a negative error code.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMEhjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j queue_limits_set (C function)c.queue_limits_sethNtauh1hhjhhhNhNubj)}(hhh](j)}(hHint queue_limits_set (struct request_queue *q, struct queue_limits *lim)h]j)}(hGint queue_limits_set(struct request_queue *q, struct queue_limits *lim)h](j )}(hinth]hint}(hjkhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjghhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMWubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjghhhjyhMWubj{)}(hqueue_limits_seth]j)}(hqueue_limits_seth]hqueue_limits_set}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjghhhjyhMWubj)}(h3(struct request_queue *q, struct queue_limits *lim)h](j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h request_queueh]h request_queue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.queue_limits_setasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjfh]hq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct queue_limits *limh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h queue_limitsh]h queue_limits}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj9modnameN classnameNj] j` )}jc ]jc.queue_limits_setasbuh1hhjubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlimh]hlim}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjghhhjyhMWubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjchhhjyhMWubah}(h]j^ah ](jjeh"]h$]h&]jj)jhuh1jhjyhMWhj`hhubj)}(hhh]h)}(happly queue limits to queueh]happly queue limits to queue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMWhjhhubah}(h]h ]h"]h$]h&]uh1jhj`hhhjyhMWubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX]**Parameters** ``struct request_queue *q`` queue to update ``struct queue_limits *lim`` limits to apply **Description** Apply the limits in **lim** that were freshly initialized to **q**. To update existing limits use queue_limits_start_update() and queue_limits_commit_update() instead. Returns 0 if successful, else a negative error code.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chM[hjubj )}(hhh](j)}(h,``struct request_queue *q`` queue to update h](j)}(h``struct request_queue *q``h]j)}(hjh]hstruct request_queue *q}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMXhjubj2)}(hhh]h)}(hqueue to updateh]hqueue to update}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMXhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMXhjubj)}(h-``struct queue_limits *lim`` limits to apply h](j)}(h``struct queue_limits *lim``h]j)}(hjh]hstruct queue_limits *lim}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMYhjubj2)}(hhh]h)}(hlimits to applyh]hlimits to apply}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMYhj*ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj)hMYhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjOh]h Description}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chM[hjubh)}(hApply the limits in **lim** that were freshly initialized to **q**. To update existing limits use queue_limits_start_update() and queue_limits_commit_update() instead.h](hApply the limits in }(hjehhhNhNubj)}(h**lim**h]hlim}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubh" that were freshly initialized to }(hjehhhNhNubj)}(h**q**h]hq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubhe. To update existing limits use queue_limits_start_update() and queue_limits_commit_update() instead.}(hjehhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMZhjubh)}(h4Returns 0 if successful, else a negative error code.h]h4Returns 0 if successful, else a negative error code.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chM^hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_stack_limits (C function)c.blk_stack_limitshNtauh1hhjhhhNhNubj)}(hhh](j)}(hUint blk_stack_limits (struct queue_limits *t, struct queue_limits *b, sector_t start)h]j)}(hTint blk_stack_limits(struct queue_limits *t, struct queue_limits *b, sector_t start)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hblk_stack_limitsh]j)}(hblk_stack_limitsh]hblk_stack_limits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h@(struct queue_limits *t, struct queue_limits *b, sector_t start)h](j)}(hstruct queue_limits *th](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h queue_limitsh]h queue_limits}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj$modnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_stack_limitsasbuh1hhjubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjjh]ht}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct queue_limits *bh](j)}(hjAh]hstruct}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqubh)}(hhh]j)}(h queue_limitsh]h queue_limits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j>c.blk_stack_limitsasbuh1hhjqubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(hjLh]hb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsector_t starth](h)}(hhh]j)}(hsector_th]hsector_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j>c.blk_stack_limitsasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h'adjust queue_limits for stacked devicesh]h'adjust queue_limits for stacked devices}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhj:hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjUjjUjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct queue_limits *t`` the stacking driver limits (top device) ``struct queue_limits *b`` the underlying queue limits (bottom, component device) ``sector_t start`` first data sector within component device **Description** This function is used by stacking drivers like MD and DM to ensure that all component devices have compatible block sizes and alignments. The stacking driver must provide a queue_limits struct (top) and then iteratively call the stacking function for all component (bottom) devices. The stacking function will attempt to combine the values and ensure proper alignment. Returns 0 if the top and bottom queue_limits are compatible. The top device's block sizes and alignment offsets may be adjusted to ensure alignment with the bottom device. If no compatible sizes and alignments exist, -1 is returned and the resulting top queue_limits will have the misaligned flag set to indicate that the alignment_offset is undefined.h](h)}(h**Parameters**h]j)}(hj_h]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjYubj )}(hhh](j)}(hC``struct queue_limits *t`` the stacking driver limits (top device) h](j)}(h``struct queue_limits *t``h]j)}(hj~h]hstruct queue_limits *t}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjxubj2)}(hhh]h)}(h'the stacking driver limits (top device)h]h'the stacking driver limits (top device)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjxubeh}(h]h ]h"]h$]h&]uh1jhjhMhjuubj)}(hR``struct queue_limits *b`` the underlying queue limits (bottom, component device) h](j)}(h``struct queue_limits *b``h]j)}(hjh]hstruct queue_limits *b}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubj2)}(hhh]h)}(h6the underlying queue limits (bottom, component device)h]h6the underlying queue limits (bottom, component device)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjuubj)}(h=``sector_t start`` first data sector within component device h](j)}(h``sector_t start``h]j)}(hjh]hsector_t start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubj2)}(hhh]h)}(h)first data sector within component deviceh]h)first data sector within component device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjuubeh}(h]h ]h"]h$]h&]uh1j hjYubh)}(h**Description**h]j)}(hj+h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjYubj)}(hXThis function is used by stacking drivers like MD and DM to ensure that all component devices have compatible block sizes and alignments. The stacking driver must provide a queue_limits struct (top) and then iteratively call the stacking function for all component (bottom) devices. The stacking function will attempt to combine the values and ensure proper alignment. Returns 0 if the top and bottom queue_limits are compatible. The top device's block sizes and alignment offsets may be adjusted to ensure alignment with the bottom device. If no compatible sizes and alignments exist, -1 is returned and the resulting top queue_limits will have the misaligned flag set to indicate that the alignment_offset is undefined.h](h)}(hXrThis function is used by stacking drivers like MD and DM to ensure that all component devices have compatible block sizes and alignments. The stacking driver must provide a queue_limits struct (top) and then iteratively call the stacking function for all component (bottom) devices. The stacking function will attempt to combine the values and ensure proper alignment.h]hXrThis function is used by stacking drivers like MD and DM to ensure that all component devices have compatible block sizes and alignments. The stacking driver must provide a queue_limits struct (top) and then iteratively call the stacking function for all component (bottom) devices. The stacking function will attempt to combine the values and ensure proper alignment.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjAubh)}(hXaReturns 0 if the top and bottom queue_limits are compatible. The top device's block sizes and alignment offsets may be adjusted to ensure alignment with the bottom device. If no compatible sizes and alignments exist, -1 is returned and the resulting top queue_limits will have the misaligned flag set to indicate that the alignment_offset is undefined.h]hXcReturns 0 if the top and bottom queue_limits are compatible. The top device’s block sizes and alignment offsets may be adjusted to ensure alignment with the bottom device. If no compatible sizes and alignments exist, -1 is returned and the resulting top queue_limits will have the misaligned flag set to indicate that the alignment_offset is undefined.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjAubeh}(h]h ]h"]h$]h&]uh1jhjShMhjYubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $queue_limits_stack_bdev (C function)c.queue_limits_stack_bdevhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrvoid queue_limits_stack_bdev (struct queue_limits *t, struct block_device *bdev, sector_t offset, const char *pfx)h]j)}(hqvoid queue_limits_stack_bdev(struct queue_limits *t, struct block_device *bdev, sector_t offset, const char *pfx)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hqueue_limits_stack_bdevh]j)}(hqueue_limits_stack_bdevh]hqueue_limits_stack_bdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(hU(struct queue_limits *t, struct block_device *bdev, sector_t offset, const char *pfx)h](j)}(hstruct queue_limits *th](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h queue_limitsh]h queue_limits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.queue_limits_stack_bdevasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjjh]ht}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj2)}(h h]h }(hjDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubh)}(hhh]j)}(h block_deviceh]h block_device}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjWmodnameN classnameNj] j` )}jc ]jc.queue_limits_stack_bdevasbuh1hhj3ubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj)}(hbdevh]hbdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsector_t offseth](h)}(hhh]j)}(hsector_th]hsector_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.queue_limits_stack_bdevasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hoffseth]hoffset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *pfxh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpfxh]hpfx}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]j|ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhj~hhubj)}(hhh]h)}(h'adjust queue_limits for stacked devicesh]h'adjust queue_limits for stacked devices}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjZhhubah}(h]h ]h"]h$]h&]uh1jhj~hhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjujjujjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct queue_limits *t`` the stacking driver limits (top device) ``struct block_device *bdev`` the underlying block device (bottom) ``sector_t offset`` offset to beginning of data within component device ``const char *pfx`` prefix to use for warnings logged **Description** This function is used by stacking drivers like MD and DM to ensure that all component devices have compatible block sizes and alignments. The stacking driver must provide a queue_limits struct (top) and then iteratively call the stacking function for all component (bottom) devices. The stacking function will attempt to combine the values and ensure proper alignment.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjyubj )}(hhh](j)}(hC``struct queue_limits *t`` the stacking driver limits (top device) h](j)}(h``struct queue_limits *t``h]j)}(hjh]hstruct queue_limits *t}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubj2)}(hhh]h)}(h'the stacking driver limits (top device)h]h'the stacking driver limits (top device)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hC``struct block_device *bdev`` the underlying block device (bottom) h](j)}(h``struct block_device *bdev``h]j)}(hjh]hstruct block_device *bdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubj2)}(hhh]h)}(h$the underlying block device (bottom)h]h$the underlying block device (bottom)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hH``sector_t offset`` offset to beginning of data within component device h](j)}(h``sector_t offset``h]j)}(hjh]hsector_t offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhj ubj2)}(hhh]h)}(h3offset to beginning of data within component deviceh]h3offset to beginning of data within component device}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj&ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj%hMhjubj)}(h6``const char *pfx`` prefix to use for warnings logged h](j)}(h``const char *pfx``h]j)}(hjIh]hconst char *pfx}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjCubj2)}(hhh]h)}(h!prefix to use for warnings loggedh]h!prefix to use for warnings logged}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hMhj_ubah}(h]h ]h"]h$]h&]uh1j1hjCubeh}(h]h ]h"]h$]h&]uh1jhj^hMhjubeh}(h]h ]h"]h$]h&]uh1j hjyubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjyubj)}(hXrThis function is used by stacking drivers like MD and DM to ensure that all component devices have compatible block sizes and alignments. The stacking driver must provide a queue_limits struct (top) and then iteratively call the stacking function for all component (bottom) devices. The stacking function will attempt to combine the values and ensure proper alignment.h]h)}(hXrThis function is used by stacking drivers like MD and DM to ensure that all component devices have compatible block sizes and alignments. The stacking driver must provide a queue_limits struct (top) and then iteratively call the stacking function for all component (bottom) devices. The stacking function will attempt to combine the values and ensure proper alignment.h]hXrThis function is used by stacking drivers like MD and DM to ensure that all component devices have compatible block sizes and alignments. The stacking driver must provide a queue_limits struct (top) and then iteratively call the stacking function for all component (bottom) devices. The stacking function will attempt to combine the values and ensure proper alignment.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjyubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )queue_limits_stack_integrity (C function)c.queue_limits_stack_integrityhNtauh1hhjhhhNhNubj)}(hhh](j)}(hRbool queue_limits_stack_integrity (struct queue_limits *t, struct queue_limits *b)h]j)}(hQbool queue_limits_stack_integrity(struct queue_limits *t, struct queue_limits *b)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hqueue_limits_stack_integrityh]j)}(hqueue_limits_stack_integrityh]hqueue_limits_stack_integrity}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h0(struct queue_limits *t, struct queue_limits *b)h](j)}(hstruct queue_limits *th](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(h queue_limitsh]h queue_limits}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj/modnameN classnameNj] j` )}jc ]jf )}jY jsbc.queue_limits_stack_integrityasbuh1hhj ubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjjh]ht}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct queue_limits *bh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|ubh)}(hhh]j)}(h queue_limitsh]h queue_limits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jIc.queue_limits_stack_integrityasbuh1hhj|ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hjLh]hb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hstack integrity profileh]hstack integrity profile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct queue_limits *t`` target queue limits ``struct queue_limits *b`` base queue limits **Description** Check if the integrity profile in the **b** can be stacked into the target **t**. Stacking is possible if either: a) does not have any integrity information stacked into it yet b) the integrity profile in **b** is identical to the one in **t** If **b** can be stacked into **t**, return ``true``. Else return ``false`` and clear the integrity information in **t**.h](h)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubj )}(hhh](j)}(h/``struct queue_limits *t`` target queue limits h](j)}(h``struct queue_limits *t``h]j)}(hjAh]hstruct queue_limits *t}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhj;ubj2)}(hhh]h)}(htarget queue limitsh]htarget queue limits}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjWubah}(h]h ]h"]h$]h&]uh1j1hj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhMhj8ubj)}(h-``struct queue_limits *b`` base queue limits h](j)}(h``struct queue_limits *b``h]j)}(hjzh]hstruct queue_limits *b}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjtubj2)}(hhh]h)}(hbase queue limitsh]hbase queue limits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjtubeh}(h]h ]h"]h$]h&]uh1jhjhMhj8ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubh)}(hrCheck if the integrity profile in the **b** can be stacked into the target **t**. Stacking is possible if either:h](h&Check if the integrity profile in the }(hjhhhNhNubj)}(h**b**h]hb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh can be stacked into the target }(hjhhhNhNubj)}(h**t**h]ht}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh". Stacking is possible if either:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubj)}(ha) does not have any integrity information stacked into it yet b) the integrity profile in **b** is identical to the one in **t** h]jG)}(hhh](j)}(h;does not have any integrity information stacked into it yeth]h)}(hjh]h;does not have any integrity information stacked into it yet}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h@the integrity profile in **b** is identical to the one in **t** h]h)}(h?the integrity profile in **b** is identical to the one in **t**h](hthe integrity profile in }(hj!hhhNhNubj)}(h**b**h]hb}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh is identical to the one in }(hj!hhhNhNubj)}(h**t**h]ht}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]j}HjjHhjHj:7uh1jGhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjubh)}(hyIf **b** can be stacked into **t**, return ``true``. Else return ``false`` and clear the integrity information in **t**.h](hIf }(hjbhhhNhNubj)}(h**b**h]hb}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh can be stacked into }(hjbhhhNhNubj)}(h**t**h]ht}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh , return }(hjbhhhNhNubj)}(h``true``h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh. Else return }(hjbhhhNhNubj)}(h ``false``h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh( and clear the integrity information in }(hjbhhhNhNubj)}(h**t**h]ht}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh.}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  blk_set_queue_depth (C function)c.blk_set_queue_depthhNtauh1hhjhhhNhNubj)}(hhh](j)}(hFvoid blk_set_queue_depth (struct request_queue *q, unsigned int depth)h]j)}(hEvoid blk_set_queue_depth(struct request_queue *q, unsigned int depth)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hblk_set_queue_depthh]j)}(hblk_set_queue_depthh]hblk_set_queue_depth}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h-(struct request_queue *q, unsigned int depth)h](j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubh)}(hhh]j)}(h request_queueh]h request_queue}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjHmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_set_queue_depthasbuh1hhj$ubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hjfh]hq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hunsigned int depthh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdepthh]hdepth}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h1tell the block layer about the device queue depthh]h1tell the block layer about the device queue depth}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(ht**Parameters** ``struct request_queue *q`` the request queue for the device ``unsigned int depth`` queue depthh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubj )}(hhh](j)}(h=``struct request_queue *q`` the request queue for the device h](j)}(h``struct request_queue *q``h]j)}(hj<h]hstruct request_queue *q}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhj6ubj2)}(hhh]h)}(h the request queue for the deviceh]h the request queue for the device}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMhjRubah}(h]h ]h"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhMhj3ubj)}(h"``unsigned int depth`` queue depthh](j)}(h``unsigned int depth``h]j)}(hjuh]hunsigned int depth}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjoubj2)}(hhh]h)}(h queue depthh]h queue depth}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:324: ./block/blk-settings.chMhjubah}(h]h ]h"]h$]h&]uh1j1hjoubeh}(h]h ]h"]h$]h&]uh1jhjhMhj3ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blkdev_issue_flush (C function)c.blkdev_issue_flushhNtauh1hhjhhhNhNubj)}(hhh](j)}(h2int blkdev_issue_flush (struct block_device *bdev)h]j)}(h1int blkdev_issue_flush(struct block_device *bdev)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:327: ./block/blk-flush.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hblkdev_issue_flushh]j)}(hblkdev_issue_flushh]hblkdev_issue_flush}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct block_device *bdev)h]j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h block_deviceh]h block_device}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj,modnameN classnameNj] j` )}jc ]jf )}jY jsbc.blkdev_issue_flushasbuh1hhjubj2)}(h h]h }(hjJhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbdevh]hbdev}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h queue a flushh]h queue a flush}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:327: ./block/blk-flush.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct block_device *bdev`` blockdev to issue flush for **Description** Issue a flush for the block device in question.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:327: ./block/blk-flush.chMhjubj )}(hhh]j)}(h:``struct block_device *bdev`` blockdev to issue flush for h](j)}(h``struct block_device *bdev``h]j)}(hjh]hstruct block_device *bdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:327: ./block/blk-flush.chMhjubj2)}(hhh]h)}(hblockdev to issue flush forh]hblockdev to issue flush for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:327: ./block/blk-flush.chMhjubj)}(h/Issue a flush for the block device in question.h]h)}(hj#h]h/Issue a flush for the block device in question.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:327: ./block/blk-flush.chMhj!ubah}(h]h ]h"]h$]h&]uh1jhj2hMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !blkdev_issue_discard (C function)c.blkdev_issue_discardhNtauh1hhjhhhNhNubj)}(hhh](j)}(hhint blkdev_issue_discard (struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask)h]j)}(hgint blkdev_issue_discard(struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask)h](j )}(hinth]hint}(hjYhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUhhhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKKubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUhhhjghKKubj{)}(hblkdev_issue_discardh]j)}(hblkdev_issue_discardh]hblkdev_issue_discard}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjUhhhjghKKubj)}(hO(struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask)h](j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h block_deviceh]h block_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j|sbc.blkdev_issue_discardasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbdevh]hbdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsector_t sectorh](h)}(hhh]j)}(hsector_th]hsector_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jc.blkdev_issue_discardasbuh1hhjubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsectorh]hsector}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsector_t nr_sectsh](h)}(hhh]j)}(hsector_th]hsector_t}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjUmodnameN classnameNj] j` )}jc ]jc.blkdev_issue_discardasbuh1hhjLubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLubj)}(hnr_sectsh]hnr_sects}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.blkdev_issue_discardasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hgfp_maskh]hgfp_mask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjUhhhjghKKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjQhhhjghKKubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1jhjghKKhjNhhubj)}(hhh]h)}(hqueue a discardh]hqueue a discard}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKKhjhhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjghKKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj)}(hX/**Parameters** ``struct block_device *bdev`` blockdev to issue discard for ``sector_t sector`` start sector ``sector_t nr_sects`` number of sectors to discard ``gfp_t gfp_mask`` memory allocation flags (for bio_alloc) **Description** Issue a discard request for the sectors in question.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKOhj ubj )}(hhh](j)}(h<``struct block_device *bdev`` blockdev to issue discard for h](j)}(h``struct block_device *bdev``h]j)}(hj2h]hstruct block_device *bdev}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKLhj,ubj2)}(hhh]h)}(hblockdev to issue discard forh]hblockdev to issue discard for}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhKLhjHubah}(h]h ]h"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]uh1jhjGhKLhj)ubj)}(h!``sector_t sector`` start sector h](j)}(h``sector_t sector``h]j)}(hjkh]hsector_t sector}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKMhjeubj2)}(hhh]h)}(h start sectorh]h start sector}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKMhjubah}(h]h ]h"]h$]h&]uh1j1hjeubeh}(h]h ]h"]h$]h&]uh1jhjhKMhj)ubj)}(h3``sector_t nr_sects`` number of sectors to discard h](j)}(h``sector_t nr_sects``h]j)}(hjh]hsector_t nr_sects}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKNhjubj2)}(hhh]h)}(hnumber of sectors to discardh]hnumber of sectors to discard}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKNhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKNhj)ubj)}(h;``gfp_t gfp_mask`` memory allocation flags (for bio_alloc) h](j)}(h``gfp_t gfp_mask``h]j)}(hjh]hgfp_t gfp_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKOhjubj2)}(hhh]h)}(h'memory allocation flags (for bio_alloc)h]h'memory allocation flags (for bio_alloc)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKOhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKOhj)ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKQhj ubj)}(h4Issue a discard request for the sectors in question.h]h)}(hj0h]h4Issue a discard request for the sectors in question.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKQhj.ubah}(h]h ]h"]h$]h&]uh1jhj?hKQhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #__blkdev_issue_zeroout (C function)c.__blkdev_issue_zeroouthNtauh1hhjhhhNhNubj)}(hhh](j)}(hint __blkdev_issue_zeroout (struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask, struct bio **biop, unsigned flags)h]j)}(hint __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask, struct bio **biop, unsigned flags)h](j )}(hinth]hint}(hjfhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjbhhhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjbhhhjthKubj{)}(h__blkdev_issue_zeroouth]j)}(h__blkdev_issue_zeroouth]h__blkdev_issue_zeroout}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjbhhhjthKubj)}(hr(struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask, struct bio **biop, unsigned flags)h](j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h block_deviceh]h block_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.__blkdev_issue_zerooutasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbdevh]hbdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsector_t sectorh](h)}(hhh]j)}(hsector_th]hsector_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.__blkdev_issue_zerooutasbuh1hhjubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsectorh]hsector}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsector_t nr_sectsh](h)}(hhh]j)}(hsector_th]hsector_t}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjbmodnameN classnameNj] j` )}jc ]jc.__blkdev_issue_zerooutasbuh1hhjYubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj)}(hnr_sectsh]hnr_sects}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.__blkdev_issue_zerooutasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hgfp_maskh]hgfp_mask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct bio **bioph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hbioh]hbio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jc.__blkdev_issue_zerooutasbuh1hhjubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbioph]hbiop}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned flagsh](j )}(hunsignedh]hunsigned}(hjjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfubj2)}(h h]h }(hjxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjbhhhjthKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj^hhhjthKubah}(h]jYah ](jjeh"]h$]h&]jj)jhuh1jhjthKhj[hhubj)}(hhh]h)}(h(generate number of zero filed write biosh]h(generate number of zero filed write bios}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhj[hhhjthKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct block_device *bdev`` blockdev to issue ``sector_t sector`` start sector ``sector_t nr_sects`` number of sectors to write ``gfp_t gfp_mask`` memory allocation flags (for bio_alloc) ``struct bio **biop`` pointer to anchor bio ``unsigned flags`` controls detailed behavior **Description** Zero-fill a block range, either using hardware offload or by explicitly writing zeroes to the device. If a device is using logical block provisioning, the underlying space will not be released if ``flags`` contains BLKDEV_ZERO_NOUNMAP. If ``flags`` contains BLKDEV_ZERO_NOFALLBACK, the function will return -EOPNOTSUPP if no explicit hardware offload for zeroing is provided.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKhjubj )}(hhh](j)}(h0``struct block_device *bdev`` blockdev to issue h](j)}(h``struct block_device *bdev``h]j)}(hjh]hstruct block_device *bdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKhjubj2)}(hhh]h)}(hblockdev to issueh]hblockdev to issue}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h!``sector_t sector`` start sector h](j)}(h``sector_t sector``h]j)}(hj*h]hsector_t sector}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKhj$ubj2)}(hhh]h)}(h start sectorh]h start sector}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hKhj@ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj?hKhjubj)}(h1``sector_t nr_sects`` number of sectors to write h](j)}(h``sector_t nr_sects``h]j)}(hjch]hsector_t nr_sects}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKhj]ubj2)}(hhh]h)}(hnumber of sectors to writeh]hnumber of sectors to write}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhKhjyubah}(h]h ]h"]h$]h&]uh1j1hj]ubeh}(h]h ]h"]h$]h&]uh1jhjxhKhjubj)}(h;``gfp_t gfp_mask`` memory allocation flags (for bio_alloc) h](j)}(h``gfp_t gfp_mask``h]j)}(hjh]hgfp_t gfp_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKhjubj2)}(hhh]h)}(h'memory allocation flags (for bio_alloc)h]h'memory allocation flags (for bio_alloc)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h,``struct bio **biop`` pointer to anchor bio h](j)}(h``struct bio **biop``h]j)}(hjh]hstruct bio **biop}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKhjubj2)}(hhh]h)}(hpointer to anchor bioh]hpointer to anchor bio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h.``unsigned flags`` controls detailed behavior h](j)}(h``unsigned flags``h]j)}(hjh]hunsigned flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKhjubj2)}(hhh]h)}(hcontrols detailed behaviorh]hcontrols detailed behavior}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hKhj$ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj#hKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjIh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKhjubj)}(hXyZero-fill a block range, either using hardware offload or by explicitly writing zeroes to the device. If a device is using logical block provisioning, the underlying space will not be released if ``flags`` contains BLKDEV_ZERO_NOUNMAP. If ``flags`` contains BLKDEV_ZERO_NOFALLBACK, the function will return -EOPNOTSUPP if no explicit hardware offload for zeroing is provided.h](h)}(heZero-fill a block range, either using hardware offload or by explicitly writing zeroes to the device.h]heZero-fill a block range, either using hardware offload or by explicitly writing zeroes to the device.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKhj_ubh)}(hIf a device is using logical block provisioning, the underlying space will not be released if ``flags`` contains BLKDEV_ZERO_NOUNMAP.h](h^If a device is using logical block provisioning, the underlying space will not be released if }(hjrhhhNhNubj)}(h ``flags``h]hflags}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubh contains BLKDEV_ZERO_NOUNMAP.}(hjrhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chKhj_ubh)}(hIf ``flags`` contains BLKDEV_ZERO_NOFALLBACK, the function will return -EOPNOTSUPP if no explicit hardware offload for zeroing is provided.h](hIf }(hjhhhNhNubj)}(h ``flags``h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh contains BLKDEV_ZERO_NOFALLBACK, the function will return -EOPNOTSUPP if no explicit hardware offload for zeroing is provided.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chMhj_ubeh}(h]h ]h"]h$]h&]uh1jhjqhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !blkdev_issue_zeroout (C function)c.blkdev_issue_zeroouthNtauh1hhjhhhNhNubj)}(hhh](j)}(hxint blkdev_issue_zeroout (struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask, unsigned flags)h]j)}(hwint blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask, unsigned flags)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hblkdev_issue_zeroouth]j)}(hblkdev_issue_zeroouth]hblkdev_issue_zeroout}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h_(struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask, unsigned flags)h](j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h block_deviceh]h block_device}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7modnameN classnameNj] j` )}jc ]jf )}jY jsbc.blkdev_issue_zerooutasbuh1hhjubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbdevh]hbdev}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsector_t sectorh](h)}(hhh]j)}(hsector_th]hsector_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jQc.blkdev_issue_zerooutasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hsectorh]hsector}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hsector_t nr_sectsh](h)}(hhh]j)}(hsector_th]hsector_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jQc.blkdev_issue_zerooutasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnr_sectsh]hnr_sects}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jQc.blkdev_issue_zerooutasbuh1hhjubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hgfp_maskh]hgfp_mask}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned flagsh](j )}(hunsignedh]hunsigned}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hflagsh]hflags}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hzero-fill a block rangeh]hzero-fill a block range}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct block_device *bdev`` blockdev to write ``sector_t sector`` start sector ``sector_t nr_sects`` number of sectors to write ``gfp_t gfp_mask`` memory allocation flags (for bio_alloc) ``unsigned flags`` controls detailed behavior **Description** Zero-fill a block range, either using hardware offload or by explicitly writing zeroes to the device. See __blkdev_issue_zeroout() for the valid values for ``flags``.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chMhjubj )}(hhh](j)}(h0``struct block_device *bdev`` blockdev to write h](j)}(h``struct block_device *bdev``h]j)}(hjh]hstruct block_device *bdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chMhjubj2)}(hhh]h)}(hblockdev to writeh]hblockdev to write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(hC]h ]h"]h$]h&]uh1jhjhMhjubj)}(h!``sector_t sector`` start sector h](j)}(h``sector_t sector``h]j)}(hj!h]hsector_t sector}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chMhjubj2)}(hhh]h)}(h start sectorh]h start sector}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj6hMhjubj)}(h1``sector_t nr_sects`` number of sectors to write h](j)}(h``sector_t nr_sects``h]j)}(hjZh]hsector_t nr_sects}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chMhjTubj2)}(hhh]h)}(hnumber of sectors to writeh]hnumber of sectors to write}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohMhjpubah}(h]h ]h"]h$]h&]uh1j1hjTubeh}(h]h ]h"]h$]h&]uh1jhjohMhjubj)}(h;``gfp_t gfp_mask`` memory allocation flags (for bio_alloc) h](j)}(h``gfp_t gfp_mask``h]j)}(hjh]hgfp_t gfp_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chMhjubj2)}(hhh]h)}(h'memory allocation flags (for bio_alloc)h]h'memory allocation flags (for bio_alloc)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h.``unsigned flags`` controls detailed behavior h](j)}(h``unsigned flags``h]j)}(hjh]hunsigned flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chM hjubj2)}(hhh]h)}(hcontrols detailed behaviorh]hcontrols detailed behavior}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chM"hjubj)}(hZero-fill a block range, either using hardware offload or by explicitly writing zeroes to the device. See __blkdev_issue_zeroout() for the valid values for ``flags``.h]h)}(hZero-fill a block range, either using hardware offload or by explicitly writing zeroes to the device. See __blkdev_issue_zeroout() for the valid values for ``flags``.h](hZero-fill a block range, either using hardware offload or by explicitly writing zeroes to the device. See __blkdev_issue_zeroout() for the valid values for }(hj!hhhNhNubj)}(h ``flags``h]hflags}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh.}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:330: ./block/blk-lib.chM"hjubah}(h]h ]h"]h$]h&]uh1jhjAhM"hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_trace_ioctl (C function)c.blk_trace_ioctlhNtauh1hhjhhhNhNubj)}(hhh](j)}(hOint blk_trace_ioctl (struct block_device *bdev, unsigned cmd, char __user *arg)h]j)}(hNint blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)h](j )}(hinth]hint}(hjhhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdhhhjvhMubj{)}(hblk_trace_ioctlh]j)}(hblk_trace_ioctlh]hblk_trace_ioctl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjdhhhjvhMubj)}(h;(struct block_device *bdev, unsigned cmd, char __user *arg)h](j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h block_deviceh]h block_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_trace_ioctlasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbdevh]hbdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h unsigned cmdh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj%hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcmdh]hcmd}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hchar __user *argh](j )}(hcharh]hchar}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubh__user}(hjHhhhNhNubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHubj)}(hjh]h*}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hargh]harg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjdhhhjvhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj`hhhjvhMubah}(h]j[ah ](jjeh"]h$]h&]jj)jhuh1jhjvhMhj]hhubj)}(hhh]h)}(h)handle the ioctls associated with tracingh]h)handle the ioctls associated with tracing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj]hhhjvhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct block_device *bdev`` the block device ``unsigned cmd`` the ioctl cmd ``char __user *arg`` the argument data, if anyh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj )}(hhh](j)}(h/``struct block_device *bdev`` the block device h](j)}(h``struct block_device *bdev``h]j)}(hjh]hstruct block_device *bdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj2)}(hhh]h)}(hthe block deviceh]hthe block device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``unsigned cmd`` the ioctl cmd h](j)}(h``unsigned cmd``h]j)}(hj+h]h unsigned cmd}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj%ubj2)}(hhh]h)}(h the ioctl cmdh]h the ioctl cmd}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhjAubah}(h]h ]h"]h$]h&]uh1j1hj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhjubj)}(h.``char __user *arg`` the argument data, if anyh](j)}(h``char __user *arg``h]j)}(hjdh]hchar __user *arg}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj^ubj2)}(hhh]h)}(hthe argument data, if anyh]hthe argument data, if any}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjzubah}(h]h ]h"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_trace_shutdown (C function)c.blk_trace_shutdownhNtauh1hhjhhhNhNubj)}(hhh](j)}(h1void blk_trace_shutdown (struct request_queue *q)h]j)}(h0void blk_trace_shutdown(struct request_queue *q)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hblk_trace_shutdownh]j)}(hblk_trace_shutdownh]hblk_trace_shutdown}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct request_queue *q)h]j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h request_queueh]h request_queue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_trace_shutdownasbuh1hhjubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjfh]hq}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h!stop and cleanup trace structuresh]h!stop and cleanup trace structures}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjzhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hZ**Parameters** ``struct request_queue *q`` the request queue associated with the deviceh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj )}(hhh]j)}(hH``struct request_queue *q`` the request queue associated with the deviceh](j)}(h``struct request_queue *q``h]j)}(hjh]hstruct request_queue *q}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj2)}(hhh]h)}(h,the request queue associated with the deviceh]h,the request queue associated with the device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_add_trace_rq (C function)c.blk_add_trace_rqhNtauh1hhjhhhNhNubj)}(hhh](j)}(hivoid blk_add_trace_rq (struct request *rq, blk_status_t error, unsigned int nr_bytes, u64 what, u64 cgid)h]j)}(hhvoid blk_add_trace_rq(struct request *rq, blk_status_t error, unsigned int nr_bytes, u64 what, u64 cgid)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj&hMubj{)}(hblk_add_trace_rqh]j)}(hblk_add_trace_rqh]hblk_add_trace_rq}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj&hMubj)}(hS(struct request *rq, blk_status_t error, unsigned int nr_bytes, u64 what, u64 cgid)h](j)}(hstruct request *rqh](j)}(hjAh]hstruct}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubh)}(hhh]j)}(hrequesth]hrequest}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjumodnameN classnameNj] j` )}jc ]jf )}jY j;sbc.blk_add_trace_rqasbuh1hhjQubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(hrqh]hrq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(hblk_status_t errorh](h)}(hhh]j)}(h blk_status_th]h blk_status_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.blk_add_trace_rqasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(herrorh]herror}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(hunsigned int nr_bytesh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hinth]hint}(hj+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hnr_bytesh]hnr_bytes}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(hu64 whath](h)}(hhh]j)}(hu64h]hu64}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjemodnameN classnameNj] j` )}jc ]jc.blk_add_trace_rqasbuh1hhj\ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj)}(hwhath]hwhat}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(hu64 cgidh](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.blk_add_trace_rqasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hcgidh]hcgid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj&hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj&hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj&hMhj hhubj)}(hhh]h)}(h)Add a trace for a request oriented actionh]h)Add a trace for a request oriented action}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj&hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX7**Parameters** ``struct request *rq`` the source request ``blk_status_t error`` return status to log ``unsigned int nr_bytes`` number of completed bytes ``u64 what`` the action ``u64 cgid`` the cgroup info **Description** Records an action against a request. Will log the bio offset + size.h](h)}(h**Parameters**h]j)}(hj#h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj )}(hhh](j)}(h*``struct request *rq`` the source request h](j)}(h``struct request *rq``h]j)}(hjBh]hstruct request *rq}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj<ubj2)}(hhh]h)}(hthe source requesth]hthe source request}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMhjXubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhjWhMhj9ubj)}(h,``blk_status_t error`` return status to log h](j)}(h``blk_status_t error``h]j)}(hj{h]hblk_status_t error}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjuubj2)}(hhh]h)}(hreturn status to logh]hreturn status to log}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjhMhj9ubj)}(h4``unsigned int nr_bytes`` number of completed bytes h](j)}(h``unsigned int nr_bytes``h]j)}(hjh]hunsigned int nr_bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj2)}(hhh]h)}(hnumber of completed bytesh]hnumber of completed bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj9ubj)}(h``u64 what`` the action h](j)}(h ``u64 what``h]j)}(hjh]hu64 what}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj2)}(hhh]h)}(h the actionh]h the action}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj9ubj)}(h``u64 cgid`` the cgroup info h](j)}(h ``u64 cgid``h]j)}(hj&h]hu64 cgid}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj ubj2)}(hhh]h)}(hthe cgroup infoh]hthe cgroup info}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj<ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj;hMhj9ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjah]h Description}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj)}(hDRecords an action against a request. Will log the bio offset + size.h]h)}(hjyh]hDRecords an action against a request. Will log the bio offset + size.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjwubah}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_add_trace_bio (C function)c.blk_add_trace_biohNtauh1hhjhhhNhNubj)}(hhh](j)}(hVvoid blk_add_trace_bio (struct request_queue *q, struct bio *bio, u64 what, int error)h]j)}(hUvoid blk_add_trace_bio(struct request_queue *q, struct bio *bio, u64 what, int error)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMCubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMCubj{)}(hblk_add_trace_bioh]j)}(hblk_add_trace_bioh]hblk_add_trace_bio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMCubj)}(h?(struct request_queue *q, struct bio *bio, u64 what, int error)h](j)}(hstruct request_queue *qh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h request_queueh]h request_queue}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_add_trace_bioasbuh1hhjubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjfh]hq}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct bio *bioh](j)}(hjAh]hstruct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubh)}(hhh]j)}(hbioh]hbio}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj}modnameN classnameNj] j` )}jc ]j&c.blk_add_trace_bioasbuh1hhjYubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hbioh]hbio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hu64 whath](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j&c.blk_add_trace_bioasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hwhath]hwhat}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h int errorh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(herrorh]herror}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMCubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMCubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMChjhhubj)}(hhh]h)}(h%Add a trace for a bio oriented actionh]h%Add a trace for a bio oriented action}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMChjXhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMCubeh}(h]h ](jfunctioneh"]h$]h&]jjjjsjjsjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct request_queue *q`` queue the io is for ``struct bio *bio`` the source bio ``u64 what`` the action ``int error`` error, if any **Description** Records an action against a bio. Will log the bio offset + size.h](h)}(h**Parameters**h]j)}(hj}h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMGhjwubj )}(hhh](j)}(h0``struct request_queue *q`` queue the io is for h](j)}(h``struct request_queue *q``h]j)}(hjh]hstruct request_queue *q}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMDhjubj2)}(hhh]h)}(hqueue the io is forh]hqueue the io is for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMDhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMDhjubj)}(h#``struct bio *bio`` the source bio h](j)}(h``struct bio *bio``h]j)}(hjh]hstruct bio *bio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMEhjubj2)}(hhh]h)}(hthe source bioh]hthe source bio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMEhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMEhjubj)}(h``u64 what`` the action h](j)}(h ``u64 what``h]j)}(hjh]hu64 what}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMFhjubj2)}(hhh]h)}(h the actionh]h the action}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMFhj$ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj#hMFhjubj)}(h``int error`` error, if any h](j)}(h ``int error``h]j)}(hjGh]h int error}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMGhjAubj2)}(hhh]h)}(h error, if anyh]h error, if any}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMGhj]ubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj\hMGhjubeh}(h]h ]h"]h$]h&]uh1j hjwubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMIhjwubj)}(h@Records an action against a bio. Will log the bio offset + size.h]h)}(hjh]h@Records an action against a bio. Will log the bio offset + size.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMIhjubah}(h]h ]h"]h$]h&]uh1jhjhMIhjwubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $blk_add_trace_bio_remap (C function)c.blk_add_trace_bio_remaphNtauh1hhjhhhNhNubj)}(hhh](j)}(hVvoid blk_add_trace_bio_remap (void *ignore, struct bio *bio, dev_t dev, sector_t from)h]j)}(hUvoid blk_add_trace_bio_remap(void *ignore, struct bio *bio, dev_t dev, sector_t from)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hblk_add_trace_bio_remaph]j)}(hblk_add_trace_bio_remaph]hblk_add_trace_bio_remap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h9(void *ignore, struct bio *bio, dev_t dev, sector_t from)h](j)}(h void *ignoreh](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hignoreh]hignore}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct bio *bioh](j)}(hjAh]hstruct}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubh)}(hhh]j)}(hbioh]hbio}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjomodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_add_trace_bio_remapasbuh1hhjKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hbioh]hbio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h dev_t devh](h)}(hhh]j)}(hdev_th]hdev_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.blk_add_trace_bio_remapasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h sector_t fromh](h)}(hhh]j)}(hsector_th]hsector_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.blk_add_trace_bio_remapasbuh1hhjubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hfromh]hfrom}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h%Add a trace for a bio-remap operationh]h%Add a trace for a bio-remap operation}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj_hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjzjjzjjjuh1jhhhjhNhNubj)}(hX **Parameters** ``void *ignore`` trace callback data parameter (not used) ``struct bio *bio`` the source bio ``dev_t dev`` source device ``sector_t from`` source sector **Description** Called after a bio is remapped to a different device and/or sector.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj~ubj )}(hhh](j)}(h:``void *ignore`` trace callback data parameter (not used) h](j)}(h``void *ignore``h]j)}(hjh]h void *ignore}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj2)}(hhh]h)}(h(trace callback data parameter (not used)h]h(trace callback data parameter (not used)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h#``struct bio *bio`` the source bio h](j)}(h``struct bio *bio``h]j)}(hjh]hstruct bio *bio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj2)}(hhh]h)}(hthe source bioh]hthe source bio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``dev_t dev`` source device h](j)}(h ``dev_t dev``h]j)}(hjh]h dev_t dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj2)}(hhh]h)}(h source deviceh]h source device}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj+ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj*hMhjubj)}(h ``sector_t from`` source sector h](j)}(h``sector_t from``h]j)}(hjNh]h sector_t from}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjHubj2)}(hhh]h)}(h source sectorh]h source sector}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMhjdubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjchMhjubeh}(h]h ]h"]h$]h&]uh1j hj~ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj~ubh)}(hCCalled after a bio is remapped to a different device and/or sector.h]hCCalled after a bio is remapped to a different device and/or sector.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #blk_add_trace_rq_remap (C function)c.blk_add_trace_rq_remaphNtauh1hhjhhhNhNubj)}(hhh](j)}(hXvoid blk_add_trace_rq_remap (void *ignore, struct request *rq, dev_t dev, sector_t from)h]j)}(hWvoid blk_add_trace_rq_remap(void *ignore, struct request *rq, dev_t dev, sector_t from)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hblk_add_trace_rq_remaph]j)}(hblk_add_trace_rq_remaph]hblk_add_trace_rq_remap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h<(void *ignore, struct request *rq, dev_t dev, sector_t from)h](j)}(h void *ignoreh](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hignoreh]hignore}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct request *rqh](j)}(hjAh]hstruct}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubh)}(hhh]j)}(hrequesth]hrequest}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.blk_add_trace_rq_remapasbuh1hhjIubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hrqh]hrq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h dev_t devh](h)}(hhh]j)}(hdev_th]hdev_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.blk_add_trace_rq_remapasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h sector_t fromh](h)}(hhh]j)}(hsector_th]hsector_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jc.blk_add_trace_rq_remapasbuh1hhjubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hfromh]hfrom}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h)Add a trace for a request-remap operationh]h)Add a trace for a request-remap operation}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj]hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjxjjxjjjuh1jhhhjhNhNubj)}(hX **Parameters** ``void *ignore`` trace callback data parameter (not used) ``struct request *rq`` the source request ``dev_t dev`` target device ``sector_t from`` source sector **Description** Device mapper remaps request to other devices. Add a trace for that action.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj|ubj )}(hhh](j)}(h:``void *ignore`` trace callback data parameter (not used) h](j)}(h``void *ignore``h]j)}(hjh]h void *ignore}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj2)}(hhh]h)}(h(trace callback data parameter (not used)h]h(trace callback data parameter (not used)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h*``struct request *rq`` the source request h](j)}(h``struct request *rq``h]j)}(hjh]hstruct request *rq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubj2)}(hhh]h)}(hthe source requesth]hthe source request}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``dev_t dev`` target device h](j)}(h ``dev_t dev``h]j)}(hjh]h dev_t dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj ubj2)}(hhh]h)}(h target deviceh]h target device}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj)ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj(hMhjubj)}(h ``sector_t from`` source sector h](j)}(h``sector_t from``h]j)}(hjLh]h sector_t from}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjFubj2)}(hhh]h)}(h source sectorh]h source sector}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMhjbubah}(h]h ]h"]h$]h&]uh1j1hjFubeh}(h]h ]h"]h$]h&]uh1jhjahMhjubeh}(h]h ]h"]h$]h&]uh1j hj|ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhj|ubj)}(hKDevice mapper remaps request to other devices. Add a trace for that action.h]h)}(hKDevice mapper remaps request to other devices. Add a trace for that action.h]hKDevice mapper remaps request to other devices. Add a trace for that action.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:336: ./kernel/trace/blktrace.chMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj|ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j disk_release (C function)c.disk_releasehNtauh1hhjhhhNhNubj)}(hhh](j)}(h&void disk_release (struct device *dev)h]j)}(h%void disk_release(struct device *dev)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:339: ./block/genhd.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(h disk_releaseh]j)}(h disk_releaseh]h disk_release}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct device *dev)h]j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdeviceh]hdevice}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj3modnameN classnameNj] j` )}jc ]jf )}jY jsbc.disk_releaseasbuh1hhjubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdevh]hdev}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h/releases all allocated resources of the gendiskh]h/releases all allocated resources of the gendisk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:339: ./block/genhd.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct device *dev`` the device representing this disk **Description** This function releases all allocated resources of the gendisk. Drivers which used device_add_disk() have a gendisk with a request_queue assigned. Since the request_queue sits on top of the gendisk for these drivers we also call blk_put_queue() for them, and we expect the request_queue refcount to reach 0 at this point, and so the request_queue will also be freed prior to the disk. **Context** can sleeph](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:339: ./block/genhd.chMhjubj )}(hhh]j)}(h9``struct device *dev`` the device representing this disk h](j)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:339: ./block/genhd.chMhjubj2)}(hhh]h)}(h!the device representing this diskh]h!the device representing this disk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:339: ./block/genhd.chMhjubh)}(h>This function releases all allocated resources of the gendisk.h]h>This function releases all allocated resources of the gendisk.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:339: ./block/genhd.chMhjubh)}(hX@Drivers which used device_add_disk() have a gendisk with a request_queue assigned. Since the request_queue sits on top of the gendisk for these drivers we also call blk_put_queue() for them, and we expect the request_queue refcount to reach 0 at this point, and so the request_queue will also be freed prior to the disk.h]hX@Drivers which used device_add_disk() have a gendisk with a request_queue assigned. Since the request_queue sits on top of the gendisk for these drivers we also call blk_put_queue() for them, and we expect the request_queue refcount to reach 0 at this point, and so the request_queue will also be freed prior to the disk.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:339: ./block/genhd.chMhjubh)}(h **Context**h]j)}(hjHh]hContext}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:339: ./block/genhd.chMhjubh)}(h can sleeph]h can sleep}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:339: ./block/genhd.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  bdev_count_inflight (C function)c.bdev_count_inflighthNtauh1hhjhhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjhhhjhKubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hbdev_count_inflighth]j)}(hbdev_count_inflighth]hbdev_count_inflight}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(struct block_device *part)h]j)}(hstruct block_device *parth](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h block_deviceh]h block_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.bdev_count_inflightasbuh1hhjubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hparth]hpart}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h2get the number of inflight IOs for a block device.h]h2get the number of inflight IOs for a block device.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chKhjfhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct block_device *part`` the block device. **Description** Inflight here means started IO accounting, from bdev_start_io_acct() for bio-based block device, and from blk_account_io_start() for rq-based block device.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chKhjubj )}(hhh]j)}(h0``struct block_device *part`` the block device. h](j)}(h``struct block_device *part``h]j)}(hjh]hstruct block_device *part}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chKhjubj2)}(hhh]h)}(hthe block device.h]hthe block device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chKhjubh)}(hInflight here means started IO accounting, from bdev_start_io_acct() for bio-based block device, and from blk_account_io_start() for rq-based block device.h]hInflight here means started IO accounting, from bdev_start_io_acct() for bio-based block device, and from blk_account_io_start() for rq-based block device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __register_blkdev (C function)c.__register_blkdevhNtauh1hhjhhhNhNubj)}(hhh](j)}(hWint __register_blkdev (unsigned int major, const char *name, void (*probe)(dev_t devt))h]j)}(hVint __register_blkdev(unsigned int major, const char *name, void (*probe)(dev_t devt))h](j )}(hinth]hint}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chKubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&hhhj8hKubj{)}(h__register_blkdevh]j)}(h__register_blkdevh]h__register_blkdev}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj&hhhj8hKubj)}(hA(unsigned int major, const char *name, void (*probe)(dev_t devt))h](j)}(hunsigned int majorh](j )}(hunsignedh]hunsigned}(hjghhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjcubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjcubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hmajorh]hmajor}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubj)}(hconst char *nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubj)}(hvoid (*probe)(dev_t devt)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hj7h]h(}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hprobeh]hprobe}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj:7h]h)}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj7h]h(}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdev_th]hdev_t}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjxmodnameN classnameNj] j` )}jc ]jf )}jY jMsbc.__register_blkdevasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hdevth]hdevt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj:7h]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubeh}(h]h ]h"]h$]h&]jjuh1jhj&hhhj8hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj"hhhj8hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj8hKhjhhubj)}(hhh]h)}(hregister a new block deviceh]hregister a new block device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj8hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXR**Parameters** ``unsigned int major`` the requested major device number [1..BLKDEV_MAJOR_MAX-1]. If **major** = 0, try to allocate any unused major number. ``const char *name`` the name of the new block device as a zero terminated string ``void (*probe)(dev_t devt)`` pre-devtmpfs / pre-udev callback used to create disks when their pre-created device node is accessed. When a probe call uses add_disk() and it fails the driver must cleanup resources. This interface may soon be removed. **Description** The **name** must be unique within the system. The return value depends on the **major** input parameter: - if a major device number was requested in range [1..BLKDEV_MAJOR_MAX-1] then the function returns zero on success, or a negative error code - if any unused major number was requested with **major** = 0 parameter then the return value is the allocated major number in range [1..BLKDEV_MAJOR_MAX-1] or a negative error code otherwise See Documentation/admin-guide/devices.txt for the list of allocated major numbers. Use register_blkdev instead for any new code.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chKhjubj )}(hhh](j)}(h``unsigned int major`` the requested major device number [1..BLKDEV_MAJOR_MAX-1]. If **major** = 0, try to allocate any unused major number. zh](j)}(h``unsigned int major``h]j)}(hjh]hunsigned int major}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chKhjubj2)}(hhh]h)}(huthe requested major device number [1..BLKDEV_MAJOR_MAX-1]. If **major** = 0, try to allocate any unused major number.h](h>the requested major device number [1..BLKDEV_MAJOR_MAX-1]. If }(hj5hhhNhNubj)}(h **major**h]hmajor}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh. = 0, try to allocate any unused major number.}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chKhj2ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj1hKhjubj)}(hR``const char *name`` the name of the new block device as a zero terminated string h](j)}(h``const char *name``h]j)}(hjhh]hconst char *name}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chKhjbubj2)}(hhh]h)}(hah"]h$]h&]uh1j1hjhhhjhM<ubj{)}(hadd_disk_fwnodeh]j)}(hadd_disk_fwnodeh]hadd_disk_fwnode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM<ubj)}(hr(struct device *parent, struct gendisk *disk, const struct attribute_group **groups, struct fwnode_handle *fwnode)h](j)}(hstruct device *parenth](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdeviceh]hdevice}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj'modnameN classnameNj] j` )}jc ]jf )}jY jsbc.add_disk_fwnodeasbuh1hhjubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hparenth]hparent}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct gendisk *diskh](j)}(hjAh]hstruct}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjuubh)}(hhh]j)}(hgendiskh]hgendisk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jAc.add_disk_fwnodeasbuh1hhjuubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjuubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj)}(hdiskh]hdisk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h%const struct attribute_group **groupsh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hattribute_grouph]hattribute_group}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj$modnameN classnameNj] j` )}jc ]jAc.add_disk_fwnodeasbuh1hhjubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgroupsh]hgroups}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct fwnode_handle *fwnodeh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubh)}(hhh]j)}(h fwnode_handleh]h fwnode_handle}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jAc.add_disk_fwnodeasbuh1hhj}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj)}(hfwnodeh]hfwnode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM<ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM<ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM<hjhhubj)}(hhh]h)}(h/add disk information to kernel list with fwnodeh]h/add disk information to kernel list with fwnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM<hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM<ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct device *parent`` parent device for the disk ``struct gendisk *disk`` per-device partitioning information ``const struct attribute_group **groups`` Additional per-device sysfs groups ``struct fwnode_handle *fwnode`` attached disk fwnode **Description** This function registers the partitioning information in **disk** with the kernel. Also attach a fwnode to the disk device.h](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM@hjubj )}(hhh](j)}(h5``struct device *parent`` parent device for the disk h](j)}(h``struct device *parent``h]j)}(hjCh]hstruct device *parent}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM=hj=ubj2)}(hhh]h)}(hparent device for the diskh]hparent device for the disk}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhM=hjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhM=hj:ubj)}(h=``struct gendisk *disk`` per-device partitioning information h](j)}(h``struct gendisk *disk``h]j)}(hj|h]hstruct gendisk *disk}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM>hjvubj2)}(hhh]h)}(h#per-device partitioning informationh]h#per-device partitioning information}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM>hjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhM>hj:ubj)}(hM``const struct attribute_group **groups`` Additional per-device sysfs groups h](j)}(h)``const struct attribute_group **groups``h]j)}(hjh]h%const struct attribute_group **groups}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM?hjubj2)}(hhh]h)}(h"Additional per-device sysfs groupsh]h"Additional per-device sysfs groups}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM?hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM?hj:ubj)}(h6``struct fwnode_handle *fwnode`` attached disk fwnode h](j)}(h ``struct fwnode_handle *fwnode``h]j)}(hjh]hstruct fwnode_handle *fwnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM@hjubj2)}(hhh]h)}(hattached disk fwnodeh]hattached disk fwnode}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM@hj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hM@hj:ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj) h]h Description}(hj+ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj' ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMBhjubh)}(hzThis function registers the partitioning information in **disk** with the kernel. Also attach a fwnode to the disk device.h](h8This function registers the partitioning information in }(hj? hhhNhNubj)}(h**disk**h]hdisk}(hjG hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj? ubh: with the kernel. Also attach a fwnode to the disk device.}(hj? hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMAhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j device_add_disk (C function)c.device_add_diskhNtauh1hhjhhhNhNubj)}(hhh](j)}(hhint device_add_disk (struct device *parent, struct gendisk *disk, const struct attribute_group **groups)h]j)}(hgint device_add_disk(struct device *parent, struct gendisk *disk, const struct attribute_group **groups)h](j )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj| hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMdubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj| hhhj hMdubj{)}(hdevice_add_diskh]j)}(hdevice_add_diskh]hdevice_add_disk}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj| hhhj hMdubj)}(hT(struct device *parent, struct gendisk *disk, const struct attribute_group **groups)h](j)}(hstruct device *parenth](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY j sbc.device_add_diskasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hparenth]hparent}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hstruct gendisk *diskh](j)}(hjAh]hstruct}(hj/ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ ubj2)}(h h]h }(hj< hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ ubh)}(hhh]j)}(hgendiskh]hgendisk}(hjM hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjO modnameN classnameNj] j` )}jc ]j c.device_add_diskasbuh1hhj+ ubj2)}(h h]h }(hjk hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ ubj)}(hjh]h*}(hjy hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ ubj)}(hdiskh]hdisk}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(h%const struct attribute_group **groupsh](j)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hattribute_grouph]hattribute_group}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]j c.device_add_diskasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hgroupsh]hgroups}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhj| hhhj hMdubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjx hhhj hMdubah}(h]js ah ](jjeh"]h$]h&]jj)jhuh1jhj hMdhju hhubj)}(hhh]h)}(h#add disk information to kernel listh]h#add disk information to kernel list}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMdhjE hhubah}(h]h ]h"]h$]h&]uh1jhju hhhj hMdubeh}(h]h ](jfunctioneh"]h$]h&]jjjj` jj` jjjuh1jhhhjhNhNubj)}(hX:**Parameters** ``struct device *parent`` parent device for the disk ``struct gendisk *disk`` per-device partitioning information ``const struct attribute_group **groups`` Additional per-device sysfs groups **Description** This function registers the partitioning information in **disk** with the kernel.h](h)}(h**Parameters**h]j)}(hjj h]h Parameters}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhhjd ubj )}(hhh](j)}(h5``struct device *parent`` parent device for the disk h](j)}(h``struct device *parent``h]j)}(hj h]hstruct device *parent}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMehj ubj2)}(hhh]h)}(hparent device for the diskh]hparent device for the disk}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMehj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hMehj ubj)}(h=``struct gendisk *disk`` per-device partitioning information h](j)}(h``struct gendisk *disk``h]j)}(hj h]hstruct gendisk *disk}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMfhj ubj2)}(hhh]h)}(h#per-device partitioning informationh]h#per-device partitioning information}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMfhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hMfhj ubj)}(hM``const struct attribute_group **groups`` Additional per-device sysfs groups h](j)}(h)``const struct attribute_group **groups``h]j)}(hj h]h%const struct attribute_group **groups}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMghj ubj2)}(hhh]h)}(h"Additional per-device sysfs groupsh]h"Additional per-device sysfs groups}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMghj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hMghj ubeh}(h]h ]h"]h$]h&]uh1j hjd ubh)}(h**Description**h]j)}(hj6 h]h Description}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4 ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMihjd ubh)}(hQThis function registers the partitioning information in **disk** with the kernel.h](h8This function registers the partitioning information in }(hjL hhhNhNubj)}(h**disk**h]hdisk}(hjT hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL ubh with the kernel.}(hjL hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhhjd ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_mark_disk_dead (C function)c.blk_mark_disk_deadhNtauh1hhjhhhNhNubj)}(hhh](j)}(h.void blk_mark_disk_dead (struct gendisk *disk)h]j)}(h-void blk_mark_disk_dead(struct gendisk *disk)h](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj hMubj{)}(hblk_mark_disk_deadh]j)}(hblk_mark_disk_deadh]hblk_mark_disk_dead}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj hMubj)}(h(struct gendisk *disk)h]j)}(hstruct gendisk *diskh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hgendiskh]hgendisk}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY j sbc.blk_mark_disk_deadasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hdiskh]hdisk}(hj# hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhj hhhj hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hMhj hhubj)}(hhh]h)}(hmark a disk as deadh]hmark a disk as dead}(hjM hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjJ hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjje jje jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct gendisk *disk`` disk to mark as dead **Description** Mark as disk as dead (e.g. surprise removed) and don't accept any new I/O to this disk.h](h)}(h**Parameters**h]j)}(hjo h]h Parameters}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhji ubj )}(hhh]j)}(h.``struct gendisk *disk`` disk to mark as dead h](j)}(h``struct gendisk *disk``h]j)}(hj h]hstruct gendisk *disk}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhj ubj2)}(hhh]h)}(hdisk to mark as deadh]hdisk to mark as dead}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubah}(h]h ]h"]h$]h&]uh1j hji ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhji ubh)}(hWMark as disk as dead (e.g. surprise removed) and don't accept any new I/O to this disk.h]hYMark as disk as dead (e.g. surprise removed) and don’t accept any new I/O to this disk.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhji ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j del_gendisk (C function) c.del_gendiskhNtauh1hhjhhhNhNubj)}(hhh](j)}(h'void del_gendisk (struct gendisk *disk)h]j)}(h&void del_gendisk(struct gendisk *disk)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhMubj{)}(h del_gendiskh]j)}(h del_gendiskh]h del_gendisk}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhMubj)}(h(struct gendisk *disk)h]j)}(hstruct gendisk *diskh](j)}(hjAh]hstruct}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubh)}(hhh]j)}(hgendiskh]hgendisk}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjkmodnameN classnameNj] j` )}jc ]jf )}jY j1sb c.del_gendiskasbuh1hhjGubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj)}(hdiskh]hdisk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubah}(h]h ]h"]h$]h&]jjuh1jhj hhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hremove the gendiskh]hremove the gendisk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX^**Parameters** ``struct gendisk *disk`` the struct gendisk to remove **Description** Removes the gendisk and all its associated resources. This deletes the partitions associated with the gendisk, and unregisters the associated request_queue. This is the counter to the respective device_add_disk() call. The final removal of the struct gendisk happens when its refcount reaches 0 with put_disk(), which should be called after del_gendisk(), if device_add_disk() was used. Drivers exist which depend on the release of the gendisk to be synchronous, it should not be deferred. **Context** can sleeph](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjubj )}(hhh]j)}(h6``struct gendisk *disk`` the struct gendisk to remove h](j)}(h``struct gendisk *disk``h]j)}(hjh]hstruct gendisk *disk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhj ubj2)}(hhh]h)}(hthe struct gendisk to removeh]hthe struct gendisk to remove}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj%ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj$hMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjJh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjubh)}(hRemoves the gendisk and all its associated resources. This deletes the partitions associated with the gendisk, and unregisters the associated request_queue.h]hRemoves the gendisk and all its associated resources. This deletes the partitions associated with the gendisk, and unregisters the associated request_queue.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjubh)}(h=This is the counter to the respective device_add_disk() call.h]h=This is the counter to the respective device_add_disk() call.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjubh)}(hThe final removal of the struct gendisk happens when its refcount reaches 0 with put_disk(), which should be called after del_gendisk(), if device_add_disk() was used.h]hThe final removal of the struct gendisk happens when its refcount reaches 0 with put_disk(), which should be called after del_gendisk(), if device_add_disk() was used.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjubh)}(hfDrivers exist which depend on the release of the gendisk to be synchronous, it should not be deferred.h]hfDrivers exist which depend on the release of the gendisk to be synchronous, it should not be deferred.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM"hjubh)}(h can sleeph]h can sleep}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM#hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j invalidate_disk (C function)c.invalidate_diskhNtauh1hhjhhhNhNubj)}(hhh](j)}(h+void invalidate_disk (struct gendisk *disk)h]j)}(h*void invalidate_disk(struct gendisk *disk)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM;ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM;ubj{)}(hinvalidate_diskh]j)}(hinvalidate_diskh]hinvalidate_disk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM;ubj)}(h(struct gendisk *disk)h]j)}(hstruct gendisk *diskh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hgendiskh]hgendisk}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj@modnameN classnameNj] j` )}jc ]jf )}jY jsbc.invalidate_diskasbuh1hhjubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdiskh]hdisk}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM;ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM;ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM;hjhhubj)}(hhh]h)}(hinvalidate the diskh]hinvalidate the disk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM;hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM;ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct gendisk *disk`` the struct gendisk to invalidate **Description** A helper to invalidates the disk. It will clean the disk's associated buffer/page caches and reset its internal states so that the disk can be reused by the drivers. **Context** can sleeph](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM?hjubj )}(hhh]j)}(h:``struct gendisk *disk`` the struct gendisk to invalidate h](j)}(h``struct gendisk *disk``h]j)}(hjh]hstruct gendisk *disk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM<hjubj2)}(hhh]h)}(h the struct gendisk to invalidateh]h the struct gendisk to invalidate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM<hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM<hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM>hjubh)}(hA helper to invalidates the disk. It will clean the disk's associated buffer/page caches and reset its internal states so that the disk can be reused by the drivers.h]hA helper to invalidates the disk. It will clean the disk’s associated buffer/page caches and reset its internal states so that the disk can be reused by the drivers.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chM=hjubh)}(h **Context**h]j)}(hjFh]hContext}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMAhjubh)}(h can sleeph]h can sleep}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMBhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j put_disk (C function) c.put_diskhNtauh1hhjhhhNhNubj)}(hhh](j)}(h$void put_disk (struct gendisk *disk)h]j)}(h#void put_disk(struct gendisk *disk)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hput_diskh]j)}(hput_diskh]hput_disk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct gendisk *disk)h]j)}(hstruct gendisk *diskh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hgendiskh]hgendisk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.put_diskasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdiskh]hdisk}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hdecrements the gendisk refcounth]hdecrements the gendisk refcount}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjHhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjcjjcjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct gendisk *disk`` the struct gendisk to decrement the refcount for **Description** This decrements the refcount for the struct gendisk. When this reaches 0 we'll have disk_release() called. **Note** for blk-mq disk put_disk must be called before freeing the tag_set when handling probe errors (that is before add_disk() is called). **Context** Any context, but the last reference must not be dropped from atomic context.h](h)}(h**Parameters**h]j)}(hjmh]h Parameters}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjgubj )}(hhh]j)}(hJ``struct gendisk *disk`` the struct gendisk to decrement the refcount for h](j)}(h``struct gendisk *disk``h]j)}(hjh]hstruct gendisk *disk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjubj2)}(hhh]h)}(h0the struct gendisk to decrement the refcount forh]h0the struct gendisk to decrement the refcount for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjgubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjgubh)}(hjThis decrements the refcount for the struct gendisk. When this reaches 0 we'll have disk_release() called.h]hlThis decrements the refcount for the struct gendisk. When this reaches 0 we’ll have disk_release() called.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjgubh)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjgubh)}(hfor blk-mq disk put_disk must be called before freeing the tag_set when handling probe errors (that is before add_disk() is called).h]hfor blk-mq disk put_disk must be called before freeing the tag_set when handling probe errors (that is before add_disk() is called).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjgubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjgubh)}(hLAny context, but the last reference must not be dropped from atomic context.h]hLAny context, but the last reference must not be dropped from atomic context.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjgubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j set_disk_ro (C function) c.set_disk_rohNtauh1hhjhhhNhNubj)}(hhh](j)}(h7void set_disk_ro (struct gendisk *disk, bool read_only)h]j)}(h6void set_disk_ro(struct gendisk *disk, bool read_only)h](j )}(hvoidh]hvoid}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjVhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVhhhjhhMubj{)}(h set_disk_roh]j)}(h set_disk_roh]h set_disk_ro}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjVhhhjhhMubj)}(h&(struct gendisk *disk, bool read_only)h](j)}(hstruct gendisk *diskh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hgendiskh]hgendisk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j}sb c.set_disk_roasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdiskh]hdisk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hbool read_onlyh](j )}(hj8h]hbool}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h read_onlyh]h read_only}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjVhhhjhhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjRhhhjhhMubah}(h]jMah ](jjeh"]h$]h&]jj)jhuh1jhjhhMhjOhhubj)}(hhh]h)}(hset a gendisk read-onlyh]hset a gendisk read-only}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjKhhubah}(h]h ]h"]h$]h&]uh1jhjOhhhjhhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjfjjfjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct gendisk *disk`` gendisk to operate on ``bool read_only`` ``true`` to set the disk read-only, ``false`` set the disk read/write **Description** This function is used to indicate whether a given disk device should have its read-only flag set. set_disk_ro() is typically used by device drivers to indicate whether the underlying physical device is write-protected.h](h)}(h**Parameters**h]j)}(hjph]h Parameters}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjjubj )}(hhh](j)}(h/``struct gendisk *disk`` gendisk to operate on h](j)}(h``struct gendisk *disk``h]j)}(hjh]hstruct gendisk *disk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjubj2)}(hhh]h)}(hgendisk to operate onh]hgendisk to operate on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hY``bool read_only`` ``true`` to set the disk read-only, ``false`` set the disk read/write h](j)}(h``bool read_only``h]j)}(hjh]hbool read_only}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjubj2)}(hhh]h)}(hE``true`` to set the disk read-only, ``false`` set the disk read/writeh](j)}(h``true``h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to set the disk read-only, }(hjhhhNhNubj)}(h ``false``h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh set the disk read/write}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjjubh)}(h**Description**h]j)}(hj#h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjjubh)}(hThis function is used to indicate whether a given disk device should have its read-only flag set. set_disk_ro() is typically used by device drivers to indicate whether the underlying physical device is write-protected.h]hThis function is used to indicate whether a given disk device should have its read-only flag set. set_disk_ro() is typically used by device drivers to indicate whether the underlying physical device is write-protected.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:342: ./block/genhd.chMhjjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $bdev_validate_blocksize (C function)c.bdev_validate_blocksizehNtauh1hhjhhhNhNubj)}(hhh](j)}(hGint bdev_validate_blocksize (struct block_device *bdev, int block_size)h]j)}(hFint bdev_validate_blocksize(struct block_device *bdev, int block_size)h](j )}(hinth]hint}(hjhhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chKubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdhhhjvhKubj{)}(hbdev_validate_blocksizeh]j)}(hbdev_validate_blocksizeh]hbdev_validate_blocksize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjdhhhjvhKubj)}(h+(struct block_device *bdev, int block_size)h](j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h block_deviceh]h block_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.bdev_validate_blocksizeasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbdevh]hbdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint block_sizeh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj%hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h block_sizeh]h block_size}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjdhhhjvhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj`hhhjvhKubah}(h]j[ah ](jjeh"]h$]h&]jj)jhuh1jhjvhKhj]hhubj)}(hhh]h)}(h(check that this block size is acceptableh]h(check that this block size is acceptable}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chKhjZhhubah}(h]h ]h"]h$]h&]uh1jhj]hhhjvhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjujjujjjuh1jhhhjhNhNubj)}(hXZ**Parameters** ``struct block_device *bdev`` blockdevice to check ``int block_size`` block size to check **Description** For block device users that do not use buffer heads or the block device page cache, make sure that this block size can be used with the device. **Return** On success zero is returned, negative error code on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chKhjyubj )}(hhh](j)}(h3``struct block_device *bdev`` blockdevice to check h](j)}(h``struct block_device *bdev``h]j)}(hjh]hstruct block_device *bdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chKhjubj2)}(hhh]h)}(hblockdevice to checkh]hblockdevice to check}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h'``int block_size`` block size to check h](j)}(h``int block_size``h]j)}(hjh]hint block_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chKhjubj2)}(hhh]h)}(hblock size to checkh]hblock size to check}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1j hjyubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chKhjyubh)}(hFor block device users that do not use buffer heads or the block device page cache, make sure that this block size can be used with the device.h]hFor block device users that do not use buffer heads or the block device page cache, make sure that this block size can be used with the device.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chKhjyubh)}(h **Return**h]j)}(hj9h]hReturn}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chKhjyubh)}(hah"]h$]h&]uh1j1hjzhhhjhM ubj{)}(h bdev_freezeh]j)}(h bdev_freezeh]h bdev_freeze}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjzhhhjhM ubj)}(h(struct block_device *bdev)h]j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h block_deviceh]h block_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.bdev_freezeasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbdevh]hbdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjzhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjvhhhjhM ubah}(h]jqah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjshhubj)}(hhh]h)}(h6lock a filesystem and force it into a consistent stateh]h6lock a filesystem and force it into a consistent state}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chM hj;hhubah}(h]h ]h"]h$]h&]uh1jhjshhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjVjjVjjjuh1jhhhjhNhNubj)}(hX]**Parameters** ``struct block_device *bdev`` blockdevice to lock **Description** If a superblock is found on this device, we take the s_umount semaphore on it to make sure nobody unmounts until the snapshot creation is done. The reference counter (bd_fsfreeze_count) guarantees that only the last unfreeze process can unfreeze the frozen filesystem actually when multiple freeze requests arrive simultaneously. It counts up in bdev_freeze() and count down in bdev_thaw(). When it becomes 0, thaw_bdev() will unfreeze actually. **Return** On success zero is returned, negative error code on failure.h](h)}(h**Parameters**h]j)}(hj`h]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chM$hjZubj )}(hhh]j)}(h2``struct block_device *bdev`` blockdevice to lock h](j)}(h``struct block_device *bdev``h]j)}(hjh]hstruct block_device *bdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chM!hjyubj2)}(hhh]h)}(hblockdevice to lockh]hblockdevice to lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM!hjubah}(h]h ]h"]h$]h&]uh1j1hjyubeh}(h]h ]h"]h$]h&]uh1jhjhM!hjvubah}(h]h ]h"]h$]h&]uh1j hjZubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chM#hjZubh)}(hXIf a superblock is found on this device, we take the s_umount semaphore on it to make sure nobody unmounts until the snapshot creation is done. The reference counter (bd_fsfreeze_count) guarantees that only the last unfreeze process can unfreeze the frozen filesystem actually when multiple freeze requests arrive simultaneously. It counts up in bdev_freeze() and count down in bdev_thaw(). When it becomes 0, thaw_bdev() will unfreeze actually.h]hXIf a superblock is found on this device, we take the s_umount semaphore on it to make sure nobody unmounts until the snapshot creation is done. The reference counter (bd_fsfreeze_count) guarantees that only the last unfreeze process can unfreeze the frozen filesystem actually when multiple freeze requests arrive simultaneously. It counts up in bdev_freeze() and count down in bdev_thaw(). When it becomes 0, thaw_bdev() will unfreeze actually.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chM"hjZubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chM*hjZubh)}(hah"]h$]h&]uh1j1hj"hhhj4hMJubj{)}(h bdev_thawh]j)}(h bdev_thawh]h bdev_thaw}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj"hhhj4hMJubj)}(h(struct block_device *bdev)h]j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubh)}(hhh]j)}(h block_deviceh]h block_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jIsb c.bdev_thawasbuh1hhj_ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hbdevh]hbdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj[ubah}(h]h ]h"]h$]h&]jjuh1jhj"hhhj4hMJubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj4hMJubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj4hMJhjhhubj)}(hhh]h)}(hunlock filesystemh]hunlock filesystem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMJhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj4hMJubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct block_device *bdev`` blockdevice to unlock **Description** Unlocks the filesystem and marks it writeable again after bdev_freeze(). **Return** On success zero is returned, negative error code on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMNhjubj )}(hhh]j)}(h4``struct block_device *bdev`` blockdevice to unlock h](j)}(h``struct block_device *bdev``h]j)}(hj'h]hstruct block_device *bdev}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMKhj!ubj2)}(hhh]h)}(hblockdevice to unlockh]hblockdevice to unlock}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMKhj=ubah}(h]h ]h"]h$]h&]uh1j1hj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hMKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjbh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMMhjubh)}(hHUnlocks the filesystem and marks it writeable again after bdev_freeze().h]hHUnlocks the filesystem and marks it writeable again after bdev_freeze().}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMLhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMNhjubh)}(hah"]h$]h&]uh1j1hjhhhjhM=ubj{)}(hbd_prepare_to_claimh]j)}(hbd_prepare_to_claimh]hbd_prepare_to_claim}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM=ubj)}(hL(struct block_device *bdev, void *holder, const struct blk_holder_ops *hops)h](j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h block_deviceh]h block_device}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj+modnameN classnameNj] j` )}jc ]jf )}jY jsbc.bd_prepare_to_claimasbuh1hhjubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbdevh]hbdev}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h void *holderh](j )}(hvoidh]hvoid}(hj}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjyubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(hholderh]hholder}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h!const struct blk_holder_ops *hopsh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hblk_holder_opsh]hblk_holder_ops}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jEc.bd_prepare_to_claimasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hhopsh]hhops}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM=ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM=ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM=hjhhubj)}(hhh]h)}(hclaim a block deviceh]hclaim a block device}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chM=hjXhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM=ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjsjjsjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct block_device *bdev`` block device of interest ``void *holder`` holder trying to claim **bdev** ``const struct blk_holder_ops *hops`` holder ops. **Description** Claim **bdev**. This function fails if **bdev** is already claimed by another holder and waits if another claiming is in progress. return, the caller has ownership of bd_claiming and bd_holder[s]. **Return** 0 if **bdev** can be claimed, -EBUSY otherwise.h](h)}(h**Parameters**h]j)}(hj}h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMAhjwubj )}(hhh](j)}(h7``struct block_device *bdev`` block device of interest h](j)}(h``struct block_device *bdev``h]j)}(hjh]hstruct block_device *bdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chM>hjubj2)}(hhh]h)}(hblock device of interesth]hblock device of interest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM>hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM>hjubj)}(h1``void *holder`` holder trying to claim **bdev** h](j)}(h``void *holder``h]j)}(hjh]h void *holder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chM?hjubj2)}(hhh]h)}(hholder trying to claim **bdev**h](hholder trying to claim }(hjhhhNhNubj)}(h**bdev**h]hbdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhjhM?hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM?hjubj)}(h2``const struct blk_holder_ops *hops`` holder ops. h](j)}(h%``const struct blk_holder_ops *hops``h]j)}(hjh]h!const struct blk_holder_ops *hops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chM@hjubj2)}(hhh]h)}(h holder ops.h]h holder ops.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hM@hj2ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj1hM@hjubeh}(h]h ]h"]h$]h&]uh1j hjwubh)}(h**Description**h]j)}(hjWh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMBhjwubh)}(hClaim **bdev**. This function fails if **bdev** is already claimed by another holder and waits if another claiming is in progress. return, the caller has ownership of bd_claiming and bd_holder[s].h](hClaim }(hjmhhhNhNubj)}(h**bdev**h]hbdev}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh. This function fails if }(hjmhhhNhNubj)}(h**bdev**h]hbdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh is already claimed by another holder and waits if another claiming is in progress. return, the caller has ownership of bd_claiming and bd_holder[s].}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMAhjwubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMEhjwubh)}(h/0 if **bdev** can be claimed, -EBUSY otherwise.h](h0 if }(hjhhhNhNubj)}(h**bdev**h]hbdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh" can be claimed, -EBUSY otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMFhjwubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bd_abort_claiming (C function)c.bd_abort_claiminghNtauh1hhjhhhNhNubj)}(hhh](j)}(h@void bd_abort_claiming (struct block_device *bdev, void *holder)h]j)}(h?void bd_abort_claiming(struct block_device *bdev, void *holder)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hbd_abort_claimingh]j)}(hbd_abort_claimingh]hbd_abort_claiming}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h)(struct block_device *bdev, void *holder)h](j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubh)}(hhh]j)}(h block_deviceh]h block_device}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjVmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.bd_abort_claimingasbuh1hhj2ubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hbdevh]hbdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj.ubj)}(h void *holderh](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hholderh]hholder}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj.ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h abort claiming of a block deviceh]h abort claiming of a block device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXS**Parameters** ``struct block_device *bdev`` block device of interest ``void *holder`` holder that has claimed **bdev** **Description** Abort claiming of a block device when the exclusive open failed. This can be also used when exclusive open is not actually desired and we just needed to block other exclusive openers for a while.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhjubj )}(hhh](j)}(h7``struct block_device *bdev`` block device of interest h](j)}(h``struct block_device *bdev``h]j)}(hj<h]hstruct block_device *bdev}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj6ubj2)}(hhh]h)}(hblock device of interesth]hblock device of interest}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMhjRubah}(h]h ]h"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhMhj3ubj)}(h2``void *holder`` holder that has claimed **bdev** h](j)}(h``void *holder``h]j)}(hjuh]h void *holder}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhjoubj2)}(hhh]h)}(h holder that has claimed **bdev**h](hholder that has claimed }(hjhhhNhNubj)}(h**bdev**h]hbdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjoubeh}(h]h ]h"]h$]h&]uh1jhjhMhj3ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhjubh)}(hAbort claiming of a block device when the exclusive open failed. This can be also used when exclusive open is not actually desired and we just needed to block other exclusive openers for a while.h]hAbort claiming of a block device when the exclusive open failed. This can be also used when exclusive open is not actually desired and we just needed to block other exclusive openers for a while.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bdev_fput (C function) c.bdev_fputhNtauh1hhjhhhNhNubj)}(hhh](j)}(h'void bdev_fput (struct file *bdev_file)h]j)}(h&void bdev_fput(struct file *bdev_file)h](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj hMubj{)}(h bdev_fputh]j)}(h bdev_fputh]h bdev_fput}(hj$ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj hMubj)}(h(struct file *bdev_file)h]j)}(hstruct file *bdev_fileh](j)}(hjAh]hstruct}(hj@ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj< ubj2)}(h h]h }(hjM hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj< ubh)}(hhh]j)}(hfileh]hfile}(hj^ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj` modnameN classnameNj] j` )}jc ]jf )}jY j& sb c.bdev_fputasbuh1hhj< ubj2)}(h h]h }(hj~ hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj< ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj< ubj)}(h bdev_fileh]h bdev_file}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj< ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj8 ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hMhjhhubj)}(hhh]h)}(h0yield claim to the block device and put the fileh]h0yield claim to the block device and put the file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct file *bdev_file`` open block device **Description** Yield claim on the block device and put the file. Ensure that the block device can be reclaimed before the file is closed which is a deferred operation.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj ubj )}(hhh]j)}(h-``struct file *bdev_file`` open block device h](j)}(h``struct file *bdev_file``h]j)}(hj!h]hstruct file *bdev_file}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj ubj2)}(hhh]h)}(hopen block deviceh]hopen block device}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMhj!ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj!hMhj ubah}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hj?!h]h Description}(hjA!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=!ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj ubh)}(hYield claim on the block device and put the file. Ensure that the block device can be reclaimed before the file is closed which is a deferred operation.h]hYield claim on the block device and put the file. Ensure that the block device can be reclaimed before the file is closed which is a deferred operation.}(hjU!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j lookup_bdev (C function) c.lookup_bdevhNtauh1hhjhhhNhNubj)}(hhh](j)}(h2int lookup_bdev (const char *pathname, dev_t *dev)h]j)}(h1int lookup_bdev(const char *pathname, dev_t *dev)h](j )}(hinth]hint}(hj!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!hhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!hhhj!hMubj{)}(h lookup_bdevh]j)}(h lookup_bdevh]h lookup_bdev}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj!hhhj!hMubj)}(h"(const char *pathname, dev_t *dev)h](j)}(hconst char *pathnameh](j)}(hjh]hconst}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!ubj )}(hcharh]hchar}(hj!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!ubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!ubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(hpathnameh]hpathname}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h dev_t *devh](h)}(hhh]j)}(hdev_th]hdev_t}(hj!"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj#"modnameN classnameNj] j` )}jc ]jf )}jY j!sb c.lookup_bdevasbuh1hhj"ubj2)}(h h]h }(hjA"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"ubj)}(hjh]h*}(hjO"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hdevh]hdev}(hj\"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubeh}(h]h ]h"]h$]h&]jjuh1jhj!hhhj!hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj|!hhhj!hMubah}(h]jw!ah ](jjeh"]h$]h&]jj)jhuh1jhj!hMhjy!hhubj)}(hhh]h)}(h&Look up a struct block_device by name.h]h&Look up a struct block_device by name.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj"hhubah}(h]h ]h"]h$]h&]uh1jhjy!hhhj!hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj"jj"jjjuh1jhhhjhNhNubj)}(hXh**Parameters** ``const char *pathname`` Name of the block device in the filesystem. ``dev_t *dev`` Pointer to the block device's dev_t, if found. **Description** Lookup the block device's dev_t at **pathname** in the current namespace if possible and return it in **dev**. **Context** May sleep. **Return** 0 if succeeded, negative errno otherwise.h](h)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj"ubj )}(hhh](j)}(hE``const char *pathname`` Name of the block device in the filesystem. h](j)}(h``const char *pathname``h]j)}(hj"h]hconst char *pathname}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj"ubj2)}(hhh]h)}(h+Name of the block device in the filesystem.h]h+Name of the block device in the filesystem.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMhj"ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hMhj"ubj)}(h>``dev_t *dev`` Pointer to the block device's dev_t, if found. h](j)}(h``dev_t *dev``h]j)}(hj#h]h dev_t *dev}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj"ubj2)}(hhh]h)}(h.Pointer to the block device's dev_t, if found.h]h0Pointer to the block device’s dev_t, if found.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMhj#ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj#hMhj"ubeh}(h]h ]h"]h$]h&]uh1j hj"ubh)}(h**Description**h]j)}(hj;#h]h Description}(hj=#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9#ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj"ubh)}(hnLookup the block device's dev_t at **pathname** in the current namespace if possible and return it in **dev**.h](h%Lookup the block device’s dev_t at }(hjQ#hhhNhNubj)}(h **pathname**h]hpathname}(hjY#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ#ubh7 in the current namespace if possible and return it in }(hjQ#hhhNhNubj)}(h**dev**h]hdev}(hjk#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ#ubh.}(hjQ#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj"ubh)}(h **Context**h]j)}(hj#h]hContext}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj"ubh)}(h May sleep.h]h May sleep.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj"ubh)}(h **Return**h]j)}(hj#h]hReturn}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj"ubh)}(h)0 if succeeded, negative errno otherwise.h]h)0 if succeeded, negative errno otherwise.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j bdev_mark_dead (C function)c.bdev_mark_deadhNtauh1hhjhhhNhNubj)}(hhh](j)}(h>void bdev_mark_dead (struct block_device *bdev, bool surprise)h]j)}(h=void bdev_mark_dead(struct block_device *bdev, bool surprise)h](j )}(hvoidh]hvoid}(hj#hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj#hhhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#hhhj$hMubj{)}(hbdev_mark_deadh]j)}(hbdev_mark_deadh]hbdev_mark_dead}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj#hhhj$hMubj)}(h*(struct block_device *bdev, bool surprise)h](j)}(hstruct block_device *bdevh](j)}(hjAh]hstruct}(hj/$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+$ubj2)}(h h]h }(hj<$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+$ubh)}(hhh]j)}(h block_deviceh]h block_device}(hjM$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ$ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjO$modnameN classnameNj] j` )}jc ]jf )}jY j$sbc.bdev_mark_deadasbuh1hhj+$ubj2)}(h h]h }(hjm$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+$ubj)}(hjh]h*}(hj{$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+$ubj)}(hbdevh]hbdev}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'$ubj)}(h bool surpriseh](j )}(hj8h]hbool}(hj$hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(hsurpriseh]hsurprise}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj'$ubeh}(h]h ]h"]h$]h&]jjuh1jhj#hhhj$hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj#hhhj$hMubah}(h]j#ah ](jjeh"]h$]h&]jj)jhuh1jhj$hMhj#hhubj)}(hhh]h)}(hmark a block device as deadh]hmark a block device as dead}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj$hhubah}(h]h ]h"]h$]h&]uh1jhj#hhhj$hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj$jj$jjjuh1jhhhjhNhNubj)}(hX&**Parameters** ``struct block_device *bdev`` block device to operate on ``bool surprise`` indicate a surprise removal **Description** Tell the file system that this devices or media is dead. If **surprise** is set to ``true`` the device or media is already gone, if not we are preparing for an orderly removal. This calls into the file system, which then typicall syncs out all dirty data and writes back inodes and then invalidates any cached data in the inodes on the file system. In addition we also invalidate the block device mapping.h](h)}(h**Parameters**h]j)}(hj%h]h Parameters}(hj %hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj%ubj )}(hhh](j)}(h9``struct block_device *bdev`` block device to operate on h](j)}(h``struct block_device *bdev``h]j)}(hj'%h]hstruct block_device *bdev}(hj)%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%%ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj!%ubj2)}(hhh]h)}(hblock device to operate onh]hblock device to operate on}(hj@%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<%hMhj=%ubah}(h]h ]h"]h$]h&]uh1j1hj!%ubeh}(h]h ]h"]h$]h&]uh1jhj<%hMhj%ubj)}(h.``bool surprise`` indicate a surprise removal h](j)}(h``bool surprise``h]j)}(hj`%h]h bool surprise}(hjb%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^%ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhjZ%ubj2)}(hhh]h)}(hindicate a surprise removalh]hindicate a surprise removal}(hjy%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhju%hMhjv%ubah}(h]h ]h"]h$]h&]uh1j1hjZ%ubeh}(h]h ]h"]h$]h&]uh1jhju%hMhj%ubeh}(h]h ]h"]h$]h&]uh1j hj%ubh)}(h**Description**h]j)}(hj%h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj%ubh)}(hTell the file system that this devices or media is dead. If **surprise** is set to ``true`` the device or media is already gone, if not we are preparing for an orderly removal.h](h=Tell the file system that this devices or media is dead. If }(hj%hhhNhNubj)}(h **surprise**h]hsurprise}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh is set to }(hj%hhhNhNubj)}(h``true``h]htrue}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubhU the device or media is already gone, if not we are preparing for an orderly removal.}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj%ubh)}(hThis calls into the file system, which then typicall syncs out all dirty data and writes back inodes and then invalidates any cached data in the inodes on the file system. In addition we also invalidate the block device mapping.h]hThis calls into the file system, which then typicall syncs out all dirty data and writes back inodes and then invalidates any cached data in the inodes on the file system. In addition we also invalidate the block device mapping.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:345: ./block/bdev.chMhj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h] block-devicesah ]h"] block devicesah$]h&]uh1hhhhhhhhM4ubh)}(hhh](h)}(h Char devicesh]h Char devices}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hhhhhM]ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #register_chrdev_region (C function)c.register_chrdev_regionhNtauh1hhj&hhhNhNubj)}(hhh](j)}(hIint register_chrdev_region (dev_t from, unsigned count, const char *name)h]j)}(hHint register_chrdev_region(dev_t from, unsigned count, const char *name)h](j )}(hinth]hint}(hj,&hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj(&hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKubj2)}(h h]h }(hj;&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(&hhhj:&hKubj{)}(hregister_chrdev_regionh]j)}(hregister_chrdev_regionh]hregister_chrdev_region}(hjM&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI&ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj(&hhhj:&hKubj)}(h.(dev_t from, unsigned count, const char *name)h](j)}(h dev_t fromh](h)}(hhh]j)}(hdev_th]hdev_t}(hjl&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji&ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjn&modnameN classnameNj] j` )}jc ]jf )}jY jO&sbc.register_chrdev_regionasbuh1hhje&ubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hje&ubj)}(hfromh]hfrom}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhja&ubj)}(hunsigned counth](j )}(hunsignedh]hunsigned}(hj&hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&ubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj)}(hcounth]hcount}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhja&ubj)}(hconst char *nameh](j)}(hjh]hconst}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj )}(hcharh]hchar}(hj'hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&ubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&ubj)}(hjh]h*}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hnameh]hname}(hj,'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhja&ubeh}(h]h ]h"]h$]h&]jjuh1jhj(&hhhj:&hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj$&hhhj:&hKubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1jhj:&hKhj!&hhubj)}(hhh]h)}(h"register a range of device numbersh]h"register a range of device numbers}(hjV'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhjS'hhubah}(h]h ]h"]h$]h&]uh1jhj!&hhhj:&hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjn'jjn'jjjuh1jhhhj&hNhNubj)}(hXJ**Parameters** ``dev_t from`` the first in the desired range of device numbers; must include the major number. ``unsigned count`` the number of consecutive device numbers required ``const char *name`` the name of the device or driver. **Description** Return value is zero on success, a negative error code on failure.h](h)}(h**Parameters**h]j)}(hjx'h]h Parameters}(hjz'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv'ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhjr'ubj )}(hhh](j)}(h```dev_t from`` the first in the desired range of device numbers; must include the major number. h](j)}(h``dev_t from``h]j)}(hj'h]h dev_t from}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj'ubj2)}(hhh]h)}(hPthe first in the desired range of device numbers; must include the major number.h]hPthe first in the desired range of device numbers; must include the major number.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj'ubah}(h]h ]h"]h$]h&]uh1j1hj'ubeh}(h]h ]h"]h$]h&]uh1jhj'hKhj'ubj)}(hE``unsigned count`` the number of consecutive device numbers required h](j)}(h``unsigned count``h]j)}(hj'h]hunsigned count}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj'ubj2)}(hhh]h)}(h1the number of consecutive device numbers requiredh]h1the number of consecutive device numbers required}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hKhj'ubah}(h]h ]h"]h$]h&]uh1j1hj'ubeh}(h]h ]h"]h$]h&]uh1jhj'hKhj'ubj)}(h7``const char *name`` the name of the device or driver. h](j)}(h``const char *name``h]j)}(hj (h]hconst char *name}(hj (hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj(ubj2)}(hhh]h)}(h!the name of the device or driver.h]h!the name of the device or driver.}(hj#(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hKhj (ubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhj(hKhj'ubeh}(h]h ]h"]h$]h&]uh1j hjr'ubh)}(h**Description**h]j)}(hjE(h]h Description}(hjG(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC(ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhjr'ubh)}(hBReturn value is zero on success, a negative error code on failure.h]hBReturn value is zero on success, a negative error code on failure.}(hj[(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhjr'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  alloc_chrdev_region (C function)c.alloc_chrdev_regionhNtauh1hhj&hhhNhNubj)}(hhh](j)}(hZint alloc_chrdev_region (dev_t *dev, unsigned baseminor, unsigned count, const char *name)h]j)}(hYint alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)h](j )}(hinth]hint}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj(hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(hhhj(hKubj{)}(halloc_chrdev_regionh]j)}(halloc_chrdev_regionh]halloc_chrdev_region}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj(hhhj(hKubj)}(hB(dev_t *dev, unsigned baseminor, unsigned count, const char *name)h](j)}(h dev_t *devh](h)}(hhh]j)}(hdev_th]hdev_t}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj(modnameN classnameNj] j` )}jc ]jf )}jY j(sbc.alloc_chrdev_regionasbuh1hhj(ubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(ubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hdevh]hdev}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubj)}(hunsigned baseminorh](j )}(hunsignedh]hunsigned}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj,)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(h baseminorh]h baseminor}(hj:)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubj)}(hunsigned counth](j )}(hunsignedh]hunsigned}(hjS)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjO)ubj2)}(h h]h }(hja)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjO)ubj)}(hcounth]hcount}(hjo)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjO)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubj)}(hconst char *nameh](j)}(hjh]hconst}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj )}(hcharh]hchar}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hnameh]hname}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubeh}(h]h ]h"]h$]h&]jjuh1jhj(hhhj(hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj(hhhj(hKubah}(h]j}(ah ](jjeh"]h$]h&]jj)jhuh1jhj(hKhj(hhubj)}(hhh]h)}(h'register a range of char device numbersh]h'register a range of char device numbers}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj)hhubah}(h]h ]h"]h$]h&]uh1jhj(hhhj(hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj*jj*jjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``dev_t *dev`` output parameter for first assigned number ``unsigned baseminor`` first of the requested range of minor numbers ``unsigned count`` the number of minor numbers required ``const char *name`` the name of the associated device or driver **Description** Allocates a range of char device numbers. The major number will be chosen dynamically, and returned (along with the first minor number) in **dev**. Returns zero or a negative error code.h](h)}(h**Parameters**h]j)}(hj*h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj*ubj )}(hhh](j)}(h:``dev_t *dev`` output parameter for first assigned number h](j)}(h``dev_t *dev``h]j)}(hj7*h]h dev_t *dev}(hj9*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5*ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj1*ubj2)}(hhh]h)}(h*output parameter for first assigned numberh]h*output parameter for first assigned number}(hjP*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjL*hKhjM*ubah}(h]h ]h"]h$]h&]uh1j1hj1*ubeh}(h]h ]h"]h$]h&]uh1jhjL*hKhj.*ubj)}(hE``unsigned baseminor`` first of the requested range of minor numbers h](j)}(h``unsigned baseminor``h]j)}(hjp*h]hunsigned baseminor}(hjr*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjn*ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhjj*ubj2)}(hhh]h)}(h-first of the requested range of minor numbersh]h-first of the requested range of minor numbers}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hKhj*ubah}(h]h ]h"]h$]h&]uh1j1hjj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hKhj.*ubj)}(h8``unsigned count`` the number of minor numbers required h](j)}(h``unsigned count``h]j)}(hj*h]hunsigned count}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj*ubj2)}(hhh]h)}(h$the number of minor numbers requiredh]h$the number of minor numbers required}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hKhj*ubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hKhj.*ubj)}(hA``const char *name`` the name of the associated device or driver h](j)}(h``const char *name``h]j)}(hj*h]hconst char *name}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj*ubj2)}(hhh]h)}(h+the name of the associated device or driverh]h+the name of the associated device or driver}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hKhj*ubah}(h]h ]h"]h$]h&]uh1j1hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hKhj.*ubeh}(h]h ]h"]h$]h&]uh1j hj*ubh)}(h**Description**h]j)}(hj+h]h Description}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj*ubh)}(hAllocates a range of char device numbers. The major number will be chosen dynamically, and returned (along with the first minor number) in **dev**. Returns zero or a negative error code.h](hAllocates a range of char device numbers. The major number will be chosen dynamically, and returned (along with the first minor number) in }(hj3+hhhNhNubj)}(h**dev**h]hdev}(hj;+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3+ubh). Returns zero or a negative error code.}(hj3+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j __register_chrdev (C function)c.__register_chrdevhNtauh1hhj&hhhNhNubj)}(hhh](j)}(hint __register_chrdev (unsigned int major, unsigned int baseminor, unsigned int count, const char *name, const struct file_operations *fops)h]j)}(hint __register_chrdev(unsigned int major, unsigned int baseminor, unsigned int count, const char *name, const struct file_operations *fops)h](j )}(hinth]hint}(hjt+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjp+hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjp+hhhj+hKubj{)}(h__register_chrdevh]j)}(h__register_chrdevh]h__register_chrdev}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjp+hhhj+hKubj)}(hv(unsigned int major, unsigned int baseminor, unsigned int count, const char *name, const struct file_operations *fops)h](j)}(hunsigned int majorh](j )}(hunsignedh]hunsigned}(hj+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+ubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj )}(hinth]hint}(hj+hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+ubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj)}(hmajorh]hmajor}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(hunsigned int baseminorh](j )}(hunsignedh]hunsigned}(hj,hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+ubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj )}(hinth]hint}(hj,hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj+ubj2)}(h h]h }(hj,,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj)}(h baseminorh]h baseminor}(hj:,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(hunsigned int counth](j )}(hunsignedh]hunsigned}(hjS,hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjO,ubj2)}(h h]h }(hja,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjO,ubj )}(hinth]hint}(hjo,hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjO,ubj2)}(h h]h }(hj},hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjO,ubj)}(hcounth]hcount}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjO,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(hconst char *nameh](j)}(hjh]hconst}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubj )}(hcharh]hchar}(hj,hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj,ubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubj)}(hjh]h*}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(hnameh]hname}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(h"const struct file_operations *fopsh](j)}(hjh]hconst}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubj)}(hjAh]hstruct}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj2)}(h h]h }(hj)-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubh)}(hhh]j)}(hfile_operationsh]hfile_operations}(hj:-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7-ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj<-modnameN classnameNj] j` )}jc ]jf )}jY j+sbc.__register_chrdevasbuh1hhj,ubj2)}(h h]h }(hjZ-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,ubj)}(hjh]h*}(hjh-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(hfopsh]hfops}(hju-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubeh}(h]h ]h"]h$]h&]jjuh1jhjp+hhhj+hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjl+hhhj+hKubah}(h]jg+ah ](jjeh"]h$]h&]jj)jhuh1jhj+hKhji+hhubj)}(hhh]h)}(h6create and register a cdev occupying a range of minorsh]h6create and register a cdev occupying a range of minors}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj-hhubah}(h]h ]h"]h$]h&]uh1jhji+hhhj+hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj-jj-jjjuh1jhhhj&hNhNubj)}(hXm**Parameters** ``unsigned int major`` major device number or 0 for dynamic allocation ``unsigned int baseminor`` first of the requested range of minor numbers ``unsigned int count`` the number of minor numbers required ``const char *name`` name of this range of devices ``const struct file_operations *fops`` file operations associated with this devices **Description** If **major** == 0 this functions will dynamically allocate a major and return its number. If **major** > 0 this function will attempt to reserve a device with the given major number and will return zero on success. Returns a -ve errno on failure. The name of this device has nothing to do with the name of the device in /dev. It only helps to keep track of the different owners of devices. If your module name has only one type of devices it's ok to use e.g. the name of the module here.h](h)}(h**Parameters**h]j)}(hj-h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj-ubj )}(hhh](j)}(hG``unsigned int major`` major device number or 0 for dynamic allocation h](j)}(h``unsigned int major``h]j)}(hj-h]hunsigned int major}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj-ubj2)}(hhh]h)}(h/major device number or 0 for dynamic allocationh]h/major device number or 0 for dynamic allocation}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hKhj-ubah}(h]h ]h"]h$]h&]uh1j1hj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hKhj-ubj)}(hI``unsigned int baseminor`` first of the requested range of minor numbers h](j)}(h``unsigned int baseminor``h]j)}(hj.h]hunsigned int baseminor}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj.ubj2)}(hhh]h)}(h-first of the requested range of minor numbersh]h-first of the requested range of minor numbers}(hj2.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj..hKhj/.ubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhj..hKhj-ubj)}(h<``unsigned int count`` the number of minor numbers required h](j)}(h``unsigned int count``h]j)}(hjR.h]hunsigned int count}(hjT.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP.ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhjL.ubj2)}(hhh]h)}(h$the number of minor numbers requiredh]h$the number of minor numbers required}(hjk.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg.hKhjh.ubah}(h]h ]h"]h$]h&]uh1j1hjL.ubeh}(h]h ]h"]h$]h&]uh1jhjg.hKhj-ubj)}(h3``const char *name`` name of this range of devices h](j)}(h``const char *name``h]j)}(hj.h]hconst char *name}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj.ubj2)}(hhh]h)}(hname of this range of devicesh]hname of this range of devices}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hKhj.ubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhj-ubj)}(hT``const struct file_operations *fops`` file operations associated with this devices h](j)}(h&``const struct file_operations *fops``h]j)}(hj.h]h"const struct file_operations *fops}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj.ubj2)}(hhh]h)}(h,file operations associated with this devicesh]h,file operations associated with this devices}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hKhj.ubah}(h]h ]h"]h$]th&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhj-ubeh}(h]h ]h"]h$]h&]uh1j hj-ubh)}(h**Description**h]j)}(hj.h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj-ubh)}(hYIf **major** == 0 this functions will dynamically allocate a major and return its number.h](hIf }(hj/hhhNhNubj)}(h **major**h]hmajor}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubhM == 0 this functions will dynamically allocate a major and return its number.}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj-ubh)}(h|If **major** > 0 this function will attempt to reserve a device with the given major number and will return zero on success.h](hIf }(hj6/hhhNhNubj)}(h **major**h]hmajor}(hj>/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6/ubhp > 0 this function will attempt to reserve a device with the given major number and will return zero on success.}(hj6/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj-ubh)}(hReturns a -ve errno on failure.h]hReturns a -ve errno on failure.}(hjW/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj-ubh)}(hThe name of this device has nothing to do with the name of the device in /dev. It only helps to keep track of the different owners of devices. If your module name has only one type of devices it's ok to use e.g. the name of the module here.h]hThe name of this device has nothing to do with the name of the device in /dev. It only helps to keep track of the different owners of devices. If your module name has only one type of devices it’s ok to use e.g. the name of the module here.}(hjf/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %unregister_chrdev_region (C function)c.unregister_chrdev_regionhNtauh1hhj&hhhNhNubj)}(hhh](j)}(h:void unregister_chrdev_region (dev_t from, unsigned count)h]j)}(h9void unregister_chrdev_region(dev_t from, unsigned count)h](j )}(hvoidh]hvoid}(hj/hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj/hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM,ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/hhhj/hM,ubj{)}(hunregister_chrdev_regionh]j)}(hunregister_chrdev_regionh]hunregister_chrdev_region}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj/hhhj/hM,ubj)}(h(dev_t from, unsigned count)h](j)}(h dev_t fromh](h)}(hhh]j)}(hdev_th]hdev_t}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj/modnameN classnameNj] j` )}jc ]jf )}jY j/sbc.unregister_chrdev_regionasbuh1hhj/ubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(hfromh]hfrom}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj/ubj)}(hunsigned counth](j )}(hunsignedh]hunsigned}(hj0hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj0ubj2)}(h h]h }(hj*0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0ubj)}(hcounth]hcount}(hj80hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj/ubeh}(h]h ]h"]h$]h&]jjuh1jhj/hhhj/hM,ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj/hhhj/hM,ubah}(h]j/ah ](jjeh"]h$]h&]jj)jhuh1jhj/hM,hj/hhubj)}(hhh]h)}(h$unregister a range of device numbersh]h$unregister a range of device numbers}(hjb0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM,hj_0hhubah}(h]h ]h"]h$]h&]uh1jhj/hhhj/hM,ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjz0jjz0jjjuh1jhhhj&hNhNubj)}(hXW**Parameters** ``dev_t from`` the first in the range of numbers to unregister ``unsigned count`` the number of device numbers to unregister **Description** This function will unregister a range of **count** device numbers, starting with **from**. The caller should normally be the one who allocated those numbers in the first place...h](h)}(h**Parameters**h]j)}(hj0h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM0hj~0ubj )}(hhh](j)}(h?``dev_t from`` the first in the range of numbers to unregister h](j)}(h``dev_t from``h]j)}(hj0h]h dev_t from}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM-hj0ubj2)}(hhh]h)}(h/the first in the range of numbers to unregisterh]h/the first in the range of numbers to unregister}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hM-hj0ubah}(h]h ]h"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]uh1jhj0hM-hj0ubj)}(h>``unsigned count`` the number of device numbers to unregister h](j)}(h``unsigned count``h]j)}(hj0h]hunsigned count}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM.hj0ubj2)}(hhh]h)}(h*the number of device numbers to unregisterh]h*the number of device numbers to unregister}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hM.hj0ubah}(h]h ]h"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]uh1jhj0hM.hj0ubeh}(h]h ]h"]h$]h&]uh1j hj~0ubh)}(h**Description**h]j)}(hj1h]h Description}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM0hj~0ubh)}(hThis function will unregister a range of **count** device numbers, starting with **from**. The caller should normally be the one who allocated those numbers in the first place...h](h)This function will unregister a range of }(hj-1hhhNhNubj)}(h **count**h]hcount}(hj51hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-1ubh device numbers, starting with }(hj-1hhhNhNubj)}(h**from**h]hfrom}(hjG1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-1ubhZ. The caller should normally be the one who allocated those numbers in the first place...}(hj-1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM/hj~0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  __unregister_chrdev (C function)c.__unregister_chrdevhNtauh1hhj&hhhNhNubj)}(hhh](j)}(hkvoid __unregister_chrdev (unsigned int major, unsigned int baseminor, unsigned int count, const char *name)h]j)}(hjvoid __unregister_chrdev(unsigned int major, unsigned int baseminor, unsigned int count, const char *name)h](j )}(hvoidh]hvoid}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj|1hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMBubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|1hhhj1hMBubj{)}(h__unregister_chrdevh]j)}(h__unregister_chrdevh]h__unregister_chrdev}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj|1hhhj1hMBubj)}(hR(unsigned int major, unsigned int baseminor, unsigned int count, const char *name)h](j)}(hunsigned int majorh](j )}(hunsignedh]hunsigned}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj1ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1ubj )}(hinth]hint}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj1ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1ubj)}(hmajorh]hmajor}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj1ubj)}(hunsigned int baseminorh](j )}(hunsignedh]hunsigned}(hj2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj 2ubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj 2ubj )}(hinth]hint}(hj*2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj 2ubj2)}(h h]h }(hj82hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj 2ubj)}(h baseminorh]h baseminor}(hjF2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 2ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj1ubj)}(hunsigned int counth](j )}(hunsignedh]hunsigned}(hj_2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[2ubj2)}(h h]h }(hjm2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[2ubj )}(hinth]hint}(hj{2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[2ubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[2ubj)}(hcounth]hcount}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[2ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj1ubj)}(hconst char *nameh](j)}(hjh]hconst}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubj )}(hcharh]hchar}(hj2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj2ubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hnameh]hname}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj1ubeh}(h]h ]h"]h$]h&]jjuh1jhj|1hhhj1hMBubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjx1hhhj1hMBubah}(h]js1ah ](jjeh"]h$]h&]jj)jhuh1jhj1hMBhju1hhubj)}(hhh]h)}(hunregister and destroy a cdevh]hunregister and destroy a cdev}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMBhj3hhubah}(h]h ]h"]h$]h&]uh1jhju1hhhj1hMBubeh}(h]h ](jfunctioneh"]h$]h&]jjjj63jj63jjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``unsigned int major`` major device number ``unsigned int baseminor`` first of the range of minor numbers ``unsigned int count`` the number of minor numbers this cdev is occupying ``const char *name`` name of this range of devices **Description** Unregister and destroy the cdev occupying the region described by **major**, **baseminor** and **count**. This function undoes what __register_chrdev() did.h](h)}(h**Parameters**h]j)}(hj@3h]h Parameters}(hjB3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>3ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMFhj:3ubj )}(hhh](j)}(h+``unsigned int major`` major device number h](j)}(h``unsigned int major``h]j)}(hj_3h]hunsigned int major}(hja3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]3ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMChjY3ubj2)}(hhh]h)}(hmajor device numberh]hmajor device number}(hjx3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjt3hMChju3ubah}(h]h ]h"]h$]h&]uh1j1hjY3ubeh}(h]h ]h"]h$]h&]uh1jhjt3hMChjV3ubj)}(h?``unsigned int baseminor`` first of the range of minor numbers h](j)}(h``unsigned int baseminor``h]j)}(hj3h]hunsigned int baseminor}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMDhj3ubj2)}(hhh]h)}(h#first of the range of minor numbersh]h#first of the range of minor numbers}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMDhj3ubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hMDhjV3ubj)}(hJ``unsigned int count`` the number of minor numbers this cdev is occupying h](j)}(h``unsigned int count``h]j)}(hj3h]hunsigned int count}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMEhj3ubj2)}(hhh]h)}(h2the number of minor numbers this cdev is occupyingh]h2the number of minor numbers this cdev is occupying}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMEhj3ubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hMEhjV3ubj)}(h3``const char *name`` name of this range of devices h](j)}(h``const char *name``h]j)}(hj 4h]hconst char *name}(hj 4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMFhj4ubj2)}(hhh]h)}(hname of this range of devicesh]hname of this range of devices}(hj#4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hMFhj 4ubah}(h]h ]h"]h$]h&]uh1j1hj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hMFhjV3ubeh}(h]h ]h"]h$]h&]uh1j hj:3ubh)}(h**Description**h]j)}(hjE4h]h Description}(hjG4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC4ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMHhj:3ubh)}(hUnregister and destroy the cdev occupying the region described by **major**, **baseminor** and **count**. This function undoes what __register_chrdev() did.h](hBUnregister and destroy the cdev occupying the region described by }(hj[4hhhNhNubj)}(h **major**h]hmajor}(hjc4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[4ubh, }(hj[4hhhNhNubj)}(h **baseminor**h]h baseminor}(hju4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[4ubh and }(hj[4hhhNhNubj)}(h **count**h]hcount}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[4ubh5. This function undoes what __register_chrdev() did.}(hj[4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMGhj:3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j cdev_add (C function) c.cdev_addhNtauh1hhj&hhhNhNubj)}(hhh](j)}(h8int cdev_add (struct cdev *p, dev_t dev, unsigned count)h]j)}(h7int cdev_add(struct cdev *p, dev_t dev, unsigned count)h](j )}(hinth]hint}(hj4hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj4hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4hhhj4hMubj{)}(hcdev_addh]j)}(hcdev_addh]hcdev_add}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj4hhhj4hMubj)}(h+(struct cdev *p, dev_t dev, unsigned count)h](j)}(hstruct cdev *ph](j)}(hjAh]hstruct}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj2)}(h h]h }(hj 5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4ubh)}(hhh]j)}(hcdevh]hcdev}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj5modnameN classnameNj] j` )}jc ]jf )}jY j4sb c.cdev_addasbuh1hhj4ubj2)}(h h]h }(hj;5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4ubj)}(hjh]h*}(hjI5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(hjh]hp}(hjV5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj4ubj)}(h dev_t devh](h)}(hhh]j)}(hdev_th]hdev_t}(hjq5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn5ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjs5modnameN classnameNj] j` )}jc ]j75 c.cdev_addasbuh1hhjj5ubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjj5ubj)}(hdevh]hdev}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj4ubj)}(hunsigned counth](j )}(hunsignedh]hunsigned}(hj5hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hcounth]hcount}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj4ubeh}(h]h ]h"]h$]h&]jjuh1jhj4hhhj4hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj4hhhj4hMubah}(h]j4ah ](jjeh"]h$]h&]jj)jhuh1jhj4hMhj4hhubj)}(hhh]h)}(hadd a char device to the systemh]hadd a char device to the system}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj5hhubah}(h]h ]h"]h$]h&]uh1jhj4hhhj4hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj6jj6jjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``struct cdev *p`` the cdev structure for the device ``dev_t dev`` the first device number for which this device is responsible ``unsigned count`` the number of consecutive minor numbers corresponding to this device **Description** cdev_add() adds the device represented by **p** to the system, making it live immediately. A negative error code is returned on failure.h](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hj 6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj6ubj )}(hhh](j)}(h5``struct cdev *p`` the cdev structure for the device h](j)}(h``struct cdev *p``h]j)}(hj=6h]hstruct cdev *p}(hj?6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;6ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj76ubj2)}(hhh]h)}(h!the cdev structure for the deviceh]h!the cdev structure for the device}(hjV6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjR6hMhjS6ubah}(h]h ]h"]h$]h&]uh1j1hj76ubeh}(h]h ]h"]h$]h&]uh1jhjR6hMhj46ubj)}(hK``dev_t dev`` the first device number for which this device is responsible h](j)}(h ``dev_t dev``h]j)}(hjv6h]h dev_t dev}(hjx6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjt6ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhjp6ubj2)}(hhh]h)}(h7hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMubj2)}(h h]h }(hjQ7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>7hhhjP7hMubj{)}(hcdev_set_parenth]j)}(hcdev_set_parenth]hcdev_set_parent}(hjc7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_7ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj>7hhhjP7hMubj)}(h&(struct cdev *p, struct kobject *kobj)h](j)}(hstruct cdev *ph](j)}(hjAh]hstruct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{7ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{7ubh)}(hhh]j)}(hcdevh]hcdev}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7modnameN classnameNj] j` )}jc ]jf )}jY je7sbc.cdev_set_parentasbuh1hhj{7ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{7ubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{7ubj)}(hjh]hp}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjw7ubj)}(hstruct kobject *kobjh](j)}(hjAh]hstruct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7ubh)}(hhh]j)}(hkobjecth]hkobject}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 8ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj8modnameN classnameNj] j` )}jc ]j7c.cdev_set_parentasbuh1hhj7ubj2)}(h h]h }(hj,8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7ubj)}(hjh]h*}(hj:8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(hkobjh]hkobj}(hjG8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjw7ubeh}(h]h ]h"]h$]h&]jjuh1jhj>7hhhjP7hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj:7hhhjP7hMubah}(h]j57ah ](jjeh"]h$]h&]jj)jhuh1jhjP7hMhj77hhubj)}(hhh]h)}(h(set the parent kobject for a char deviceh]h(set the parent kobject for a char device}(hjq8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhjn8hhubah}(h]h ]h"]h$]h&]uh1jhj77hhhjP7hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj8jj8jjjuh1jhhhj&hNhNubj)}(hX***Parameters** ``struct cdev *p`` the cdev structure ``struct kobject *kobj`` the kobject to take a reference to **Description** cdev_set_parent() sets a parent kobject which will be referenced appropriately so the parent is not freed before the cdev. This should be called before cdev_add.h](h)}(h**Parameters**h]j)}(hj8h]h Parameters}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj8ubj )}(hhh](j)}(h&``struct cdev *p`` the cdev structure h](j)}(h``struct cdev *p``h]j)}(hj8h]hstruct cdev *p}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj8ubj2)}(hhh]h)}(hthe cdev structureh]hthe cdev structure}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1j1hj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hMhj8ubj)}(h<``struct kobject *kobj`` the kobject to take a reference to h](j)}(h``struct kobject *kobj``h]j)}(hj8h]hstruct kobject *kobj}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj8ubj2)}(hhh]h)}(h"the kobject to take a reference toh]h"the kobject to take a reference to}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hMhj9ubah}(h]h ]h"]h$]h&]uh1j1hj8ubeh}(h]h ]h"]h$]h&]uh1jhj9hMhj8ubeh}(h]h ]h"]h$]h&]uh1j hj8ubh)}(h**Description**h]j)}(hj&9h]h Description}(hj(9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$9ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj8ubh)}(hcdev_set_parent() sets a parent kobject which will be referenced appropriately so the parent is not freed before the cdev. This should be called before cdev_add.h]hcdev_set_parent() sets a parent kobject which will be referenced appropriately so the parent is not freed before the cdev. This should be called before cdev_add.}(hj<9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j cdev_device_add (C function)c.cdev_device_addhNtauh1hhj&hhhNhNubj)}(hhh](j)}(h;int cdev_device_add (struct cdev *cdev, struct device *dev)h]j)}(h:int cdev_device_add(struct cdev *cdev, struct device *dev)h](j )}(hinth]hint}(hjk9hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjg9hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMubj2)}(h h]h }(hjz9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjg9hhhjy9hMubj{)}(hcdev_device_addh]j)}(hcdev_device_addh]hcdev_device_add}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjg9hhhjy9hMubj)}(h'(struct cdev *cdev, struct device *dev)h](j)}(hstruct cdev *cdevh](j)}(hjAh]hstruct}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubh)}(hhh]j)}(hcdevh]hcdev}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj9modnameN classnameNj] j` )}jc ]jf )}jY j9sbc.cdev_device_addasbuh1hhj9ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9ubj)}(hjh]h*}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hcdevh]hcdev}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubj)}(hstruct device *devh](j)}(hjAh]hstruct}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj2)}(h h]h }(hj':hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubh)}(hhh]j)}(hdeviceh]hdevice}(hj8:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5:ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj::modnameN classnameNj] j` )}jc ]j9c.cdev_device_addasbuh1hhj:ubj2)}(h h]h }(hjV:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(hjh]h*}(hjd:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hdevh]hdev}(hjq:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9ubeh}(h]h ]h"]h$]h&]jjuh1jhjg9hhhjy9hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjc9hhhjy9hMubah}(h]j^9ah ](jjeh"]h$]h&]jj)jhuh1jhjy9hMhj`9hhubj)}(hhh]h)}(h?add a char device and it's corresponding struct device, linkinkh]hAadd a char device and it’s corresponding struct device, linkink}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj:hhubah}(h]h ]h"]h$]h&]uh1jhj`9hhhjy9hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj:jj:jjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``struct cdev *cdev`` the cdev structure ``struct device *dev`` the device structure **Description** cdev_device_add() adds the char device represented by **cdev** to the system, just as cdev_add does. It then adds **dev** to the system using device_add The dev_t for the char device will be taken from the struct device which needs to be initialized first. This helper function correctly takes a reference to the parent device so the parent will not get released until all references to the cdev are released. This helper uses dev->devt for the device number. If it is not set it will not add the cdev and it will be equivalent to device_add. This function should be used whenever the struct cdev and the struct device are members of the same structure whose lifetime is managed by the struct device. **NOTE** Callers must assume that userspace was able to open the cdev and can call cdev fops callbacks at any time, even if this function fails.h](h)}(h**Parameters**h]j)}(hj:h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM hj:ubj )}(hhh](j)}(h)``struct cdev *cdev`` the cdev structure h](j)}(h``struct cdev *cdev``h]j)}(hj:h]hstruct cdev *cdev}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM hj:ubj2)}(hhh]h)}(hthe cdev structureh]hthe cdev structure}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hM hj:ubah}(h]h ]h"]h$]h&]uh1j1hj:ubeh}(h]h ]h"]h$]h&]uh1jhj:hM hj:ubj)}(h,``struct device *dev`` the device structure h](j)}(h``struct device *dev``h]j)}(hj;h]hstruct device *dev}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM hj;ubj2)}(hhh]h)}(hthe device structureh]hthe device structure}(hj.;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*;hM hj+;ubah}(h]h ]h"]h$]h&]uh1j1hj;ubeh}(h]h ]h"]h$]h&]uh1jhj*;hM hj:ubeh}(h]h ]h"]h$]h&]uh1j hj:ubh)}(h**Description**h]j)}(hjP;h]h Description}(hjR;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN;ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM hj:ubh)}(hXcdev_device_add() adds the char device represented by **cdev** to the system, just as cdev_add does. It then adds **dev** to the system using device_add The dev_t for the char device will be taken from the struct device which needs to be initialized first. This helper function correctly takes a reference to the parent device so the parent will not get released until all references to the cdev are released.h](h6cdev_device_add() adds the char device represented by }(hjf;hhhNhNubj)}(h**cdev**h]hcdev}(hjn;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf;ubh4 to the system, just as cdev_add does. It then adds }(hjf;hhhNhNubj)}(h**dev**h]hdev}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf;ubhX  to the system using device_add The dev_t for the char device will be taken from the struct device which needs to be initialized first. This helper function correctly takes a reference to the parent device so the parent will not get released until all references to the cdev are released.}(hjf;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM hj:ubh)}(hThis helper uses dev->devt for the device number. If it is not set it will not add the cdev and it will be equivalent to device_add.h]hThis helper uses dev->devt for the device number. If it is not set it will not add the cdev and it will be equivalent to device_add.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj:ubh)}(hThis function should be used whenever the struct cdev and the struct device are members of the same structure whose lifetime is managed by the struct device.h]hThis function should be used whenever the struct cdev and the struct device are members of the same structure whose lifetime is managed by the struct device.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj:ubh)}(h**NOTE**h]j)}(hj;h]hNOTE}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj:ubh)}(hCallers must assume that userspace was able to open the cdev and can call cdev fops callbacks at any time, even if this function fails.h]hCallers must assume that userspace was able to open the cdev and can call cdev fops callbacks at any time, even if this function fails.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j cdev_device_del (C function)c.cdev_device_delhNtauh1hhj&hhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hj;hhhj <hM1ubj{)}(hcdev_device_delh]j)}(hcdev_device_delh]hcdev_device_del}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj;hhhj <hM1ubj)}(h'(struct cdev *cdev, struct device *dev)h](j)}(hstruct cdev *cdevh](j)}(hjAh]hstruct}(hj;<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7<ubj2)}(h h]h }(hjH<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7<ubh)}(hhh]j)}(hcdevh]hcdev}(hjY<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV<ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj[<modnameN classnameNj] j` )}jc ]jf )}jY j!<sbc.cdev_device_delasbuh1hhj7<ubj2)}(h h]h }(hjy<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7<ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7<ubj)}(hcdevh]hcdev}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3<ubj)}(hstruct device *devh](j)}(hjAh]hstruct}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubh)}(hhh]j)}(hdeviceh]hdevice}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj<modnameN classnameNj] j` )}jc ]ju<c.cdev_device_delasbuh1hhj<ubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hdevh]hdev}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3<ubeh}(h]h ]h"]h$]h&]jjuh1jhj;hhhj <hM1ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj;hhhj <hM1ubah}(h]j;ah ](jjeh"]h$]h&]jj)jhuh1jhj <hM1hj;hhubj)}(hhh]h)}(hinverse of cdev_device_addh]hinverse of cdev_device_add}(hj.=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM1hj+=hhubah}(h]h ]h"]h$]h&]uh1jhj;hhhj <hM1ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjF=jjF=jjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``struct cdev *cdev`` the cdev structure ``struct device *dev`` the device structure **Description** cdev_device_del() is a helper function to call cdev_del and device_del. It should be used whenever cdev_device_add is used. If dev->devt is not set it will not remove the cdev and will be equivalent to device_del. **NOTE** This guarantees that associated sysfs callbacks are not running or runnable, however any cdevs already open will remain and their fops will still be callable even after this function returns.h](h)}(h**Parameters**h]j)}(hjP=h]h Parameters}(hjR=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN=ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM5hjJ=ubj )}(hhh](j)}(h)``struct cdev *cdev`` the cdev structure h](j)}(h``struct cdev *cdev``h]j)}(hjo=h]hstruct cdev *cdev}(hjq=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm=ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM2hji=ubj2)}(hhh]h)}(hthe cdev structureh]hthe cdev structure}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM2hj=ubah}(h]h ]h"]h$]h&]uh1j1hji=ubeh}(h]h ]h"]h$]h&]uh1jhj=hM2hjf=ubj)}(h,``struct device *dev`` the device structure h](j)}(h``struct device *dev``h]j)}(hj=h]hstruct device *dev}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM3hj=ubj2)}(hhh]h)}(hthe device structureh]hthe device structure}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM3hj=ubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hM3hjf=ubeh}(h]h ]h"]h$]h&]uh1j hjJ=ubh)}(h**Description**h]j)}(hj=h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM5hjJ=ubh)}(h{cdev_device_del() is a helper function to call cdev_del and device_del. It should be used whenever cdev_device_add is used.h]h{cdev_device_del() is a helper function to call cdev_del and device_del. It should be used whenever cdev_device_add is used.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM4hjJ=ubh)}(hYIf dev->devt is not set it will not remove the cdev and will be equivalent to device_del.h]hYIf dev->devt is not set it will not remove the cdev and will be equivalent to device_del.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM7hjJ=ubh)}(h**NOTE**h]j)}(hj>h]hNOTE}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM:hjJ=ubh)}(hThis guarantees that associated sysfs callbacks are not running or runnable, however any cdevs already open will remain and their fops will still be callable even after this function returns.h]hThis guarantees that associated sysfs callbacks are not running or runnable, however any cdevs already open will remain and their fops will still be callable even after this function returns.}(hj/>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM;hjJ=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j cdev_del (C function) c.cdev_delhNtauh1hhj&hhhNhNubj)}(hhh](j)}(hvoid cdev_del (struct cdev *p)h]j)}(hvoid cdev_del(struct cdev *p)h](j )}(hvoidh]hvoid}(hj^>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZ>hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMLubj2)}(h h]h }(hjm>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZ>hhhjl>hMLubj{)}(hcdev_delh]j)}(hcdev_delh]hcdev_del}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{>ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjZ>hhhjl>hMLubj)}(h(struct cdev *p)h]j)}(hstruct cdev *ph](j)}(hjAh]hstruct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubh)}(hhh]j)}(hcdevh]hcdev}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj>modnameN classnameNj] j` )}jc ]jf )}jY j>sb c.cdev_delasbuh1hhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hjh]hp}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj>ubah}(h]h ]h"]h$]h&]jjuh1jhjZ>hhhjl>hMLubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjV>hhhjl>hMLubah}(h]jQ>ah ](jjeh"]h$]h&]jj)jhuh1jhjl>hMLhjS>hhubj)}(hhh]h)}(hremove a cdev from the systemh]hremove a cdev from the system}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMLhj?hhubah}(h]h ]h"]h$]h&]uh1jhjS>hhhjl>hMLubeh}(h]h ](jfunctioneh"]h$]h&]jjjj5?jj5?jjjuh1jhhhj&hNhNubj)}(hXg**Parameters** ``struct cdev *p`` the cdev structure to be removed **Description** cdev_del() removes **p** from the system, possibly freeing the structure itself. **NOTE** This guarantees that cdev device will no longer be able to be opened, however any cdevs already open will remain and their fops will still be callable even after cdev_del returns.h](h)}(h**Parameters**h]j)}(hj??h]h Parameters}(hjA?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=?ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMPhj9?ubj )}(hhh]j)}(h4``struct cdev *p`` the cdev structure to be removed h](j)}(h``struct cdev *p``h]j)}(hj^?h]hstruct cdev *p}(hj`?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\?ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMMhjX?ubj2)}(hhh]h)}(h the cdev structure to be removedh]h the cdev structure to be removed}(hjw?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjs?hMMhjt?ubah}(h]h ]h"]h$]h&]uh1j1hjX?ubeh}(h]h ]h"]h$]h&]uh1jhjs?hMMhjU?ubah}(h]h ]h"]h$]h&]uh1j hj9?ubh)}(h**Description**h]j)}(hj?h]h Description}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMOhj9?ubh)}(hPcdev_del() removes **p** from the system, possibly freeing the structure itself.h](hcdev_del() removes }(hj?hhhNhNubj)}(h**p**h]hp}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh8 from the system, possibly freeing the structure itself.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMNhj9?ubh)}(h**NOTE**h]j)}(hj?h]hNOTE}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMQhj9?ubh)}(hThis guarantees that cdev device will no longer be able to be opened, however any cdevs already open will remain and their fops will still be callable even after cdev_del returns.h]hThis guarantees that cdev device will no longer be able to be opened, however any cdevs already open will remain and their fops will still be callable even after cdev_del returns.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMRhj9?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j cdev_alloc (C function) c.cdev_allochNtauh1hhj&hhhNhNubj)}(hhh](j)}(hstruct cdev * cdev_alloc (void)h]j)}(hstruct cdev *cdev_alloc(void)h](j)}(hjAh]hstruct}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMyubj2)}(h h]h }(hj%@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@hhhj$@hMyubh)}(hhh]j)}(hcdevh]hcdev}(hj6@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3@ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj8@modnameN classnameNj] j` )}jc ]jf )}jY cdev_allocsb c.cdev_allocasbuh1hhj@hhhj$@hMyubj2)}(h h]h }(hjW@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@hhhj$@hMyubj)}(hjh]h*}(hje@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhj$@hMyubj{)}(h cdev_alloch]j)}(hjT@h]h cdev_alloc}(hjv@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr@ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj@hhhj$@hMyubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj@hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj@ubah}(h]h ]h"]h$]h&]jjuh1jhj@hhhj$@hMyubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj@hhhj$@hMyubah}(h]j @ah ](jjeh"]h$]h&]jj)jhuh1jhj$@hMyhj @hhubj)}(hhh]h)}(hallocate a cdev structureh]hallocate a cdev structure}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMyhj@hhubah}(h]h ]h"]h$]h&]uh1jhj @hhhj$@hMyubeh}(h]h ](jfunctioneh"]h$]h&]jjjj@jj@jjjuh1jhhhj&hNhNubj)}(hu**Parameters** ``void`` no arguments **Description** Allocates and returns a cdev structure, or NULL on failure.h](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chM}hj@ubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj@h]hvoid}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj@ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhKhjAubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhjAhKhj@ubah}(h]h ]h"]h$]h&]uh1j hj@ubh)}(h**Description**h]j)}(hj7Ah]h Description}(hj9AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5Aubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chKhj@ubh)}(h;Allocates and returns a cdev structure, or NULL on failure.h]h;Allocates and returns a cdev structure, or NULL on failure.}(hjMAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMzhj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j cdev_init (C function) c.cdev_inithNtauh1hhj&hhhNhNubj)}(hhh](j)}(hFvoid cdev_init (struct cdev *cdev, const struct file_operations *fops)h]j)}(hEvoid cdev_init(struct cdev *cdev, const struct file_operations *fops)h](j )}(hvoidh]hvoid}(hj|AhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjxAhhhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxAhhhjAhMubj{)}(h cdev_inith]j)}(h cdev_inith]h cdev_init}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjxAhhhjAhMubj)}(h7(struct cdev *cdev, const struct file_operations *fops)h](j)}(hstruct cdev *cdevh](j)}(hjAh]hstruct}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubh)}(hhh]j)}(hcdevh]hcdev}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjAmodnameN classnameNj] j` )}jc ]jf )}jY jAsb c.cdev_initasbuh1hhjAubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubj)}(hjh]h*}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(hcdevh]hcdev}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjAubj)}(h"const struct file_operations *fopsh](j)}(hjh]hconst}(hj+BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Bubj2)}(h h]h }(hj8BhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'Bubj)}(hjAh]hstruct}(hjFBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Bubj2)}(h h]h }(hjSBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'Bubh)}(hhh]j)}(hfile_operationsh]hfile_operations}(hjdBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaBubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjfBmodnameN classnameNj] j` )}jc ]jA c.cdev_initasbuh1hhj'Bubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'Bubj)}(hjh]h*}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Bubj)}(hfopsh]hfops}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Bubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjAubeh}(h]h ]h"]h$]h&]jjuh1jhjxAhhhjAhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjtAhhhjAhMubah}(h]joAah ](jjeh"]h$]h&]jj)jhuh1jhjAhMhjqAhhubj)}(hhh]h)}(hinitialize a cdev structureh]hinitialize a cdev structure}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhjBhhubah}(h]h ]h"]h$]h&]uh1jhjqAhhhjAhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjBjjBjjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``struct cdev *cdev`` the structure to initialize ``const struct file_operations *fops`` the file_operations for this device **Description** Initializes **cdev**, remembering **fops**, making it ready to add to the system with cdev_add().h](h)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhjBubj )}(hhh](j)}(h2``struct cdev *cdev`` the structure to initialize h](j)}(h``struct cdev *cdev``h]j)}(hjCh]hstruct cdev *cdev}(hj ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhjCubj2)}(hhh]h)}(hthe structure to initializeh]hthe structure to initialize}(hj!ChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMhjCubah}(h]h ]h"]h$]h&]uh1j1hjCubeh}(h]h ]h"]h$]h&]uh1jhjChMhjBubj)}(hK``const struct file_operations *fops`` the file_operations for this device h](j)}(h&``const struct file_operations *fops``h]j)}(hjACh]h"const struct file_operations *fops}(hjCChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?Cubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhj;Cubj2)}(hhh]h)}(h#the file_operations for this deviceh]h#the file_operations for this device}(hjZChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVChMhjWCubah}(h]h ]h"]h$]h&]uh1j1hj;Cubeh}(h]h ]h"]h$]h&]uh1jhjVChMhjBubeh}(h]h ]h"]h$]h&]uh1j hjBubh)}(h**Description**h]j)}(hj|Ch]h Description}(hj~ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzCubah}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhjBubh)}(haInitializes **cdev**, remembering **fops**, making it ready to add to the system with cdev_add().h](h Initializes }(hjChhhNhNubj)}(h**cdev**h]hcdev}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubh, remembering }(hjChhhNhNubj)}(h**fops**h]hfops}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubh7, making it ready to add to the system with cdev_add().}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhR/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:351: ./fs/char_dev.chMhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubeh}(h] char-devicesah ]h"] char devicesah$]h&]uh1hhhhhhhhM]ubh)}(hhh](h)}(hClock Frameworkh]hClock Framework}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChhhhhMcubh)}(hXgThe clock framework defines programming interfaces to support software management of the system clock tree. This framework is widely used with System-On-Chip (SOC) platforms to support power management and various devices which may need custom clock rates. Note that these "clocks" don't relate to timekeeping or real time clocks (RTCs), each of which have separate frameworks. These :c:type:`struct clk ` instances may be used to manage for example a 96 MHz signal that is used to shift bits into and out of peripherals or busses, or otherwise trigger synchronous state machine transitions in system hardware.h](hXThe clock framework defines programming interfaces to support software management of the system clock tree. This framework is widely used with System-On-Chip (SOC) platforms to support power management and various devices which may need custom clock rates. Note that these “clocks” don’t relate to timekeeping or real time clocks (RTCs), each of which have separate frameworks. These }(hjChhhNhNubh)}(h:c:type:`struct clk `h]j)}(hjCh]h struct clk}(hjChhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjclkuh1hhhhMehjCubh instances may be used to manage for example a 96 MHz signal that is used to shift bits into and out of peripherals or busses, or otherwise trigger synchronous state machine transitions in system hardware.A}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMehjChhubh)}(hX_Power management is supported by explicit software clock gating: unused clocks are disabled, so the system doesn't waste power changing the state of transistors that aren't in active use. On some systems this may be backed by hardware clock gating, where clocks are gated without being disabled in software. Sections of chips that are powered but not clocked may be able to retain their last state. This low power state is often called a *retention mode*. This mode still incurs leakage currents, especially with finer circuit geometries, but for CMOS circuits power is mostly used by clocked state changes.h](hXPower management is supported by explicit software clock gating: unused clocks are disabled, so the system doesn’t waste power changing the state of transistors that aren’t in active use. On some systems this may be backed by hardware clock gating, where clocks are gated without being disabled in software. Sections of chips that are powered but not clocked may be able to retain their last state. This low power state is often called a }(hjDhhhNhNubj)}(h*retention mode*h]hretention mode}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh. This mode still incurs leakage currents, especially with finer circuit geometries, but for CMOS circuits power is mostly used by clocked state changes.}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMohjChhubh)}(hXPower-aware drivers only enable their clocks when the device they manage is in active use. Also, system sleep states often differ according to which clock domains are active: while a "standby" state may allow wakeup from several active domains, a "mem" (suspend-to-RAM) state may require a more wholesale shutdown of clocks derived from higher speed PLLs and oscillators, limiting the number of possible wakeup event sources. A driver's suspend method may need to be aware of system-specific clock constraints on the target sleep state.h]hX"Power-aware drivers only enable their clocks when the device they manage is in active use. Also, system sleep states often differ according to which clock domains are active: while a “standby” state may allow wakeup from several active domains, a “mem” (suspend-to-RAM) state may require a more wholesale shutdown of clocks derived from higher speed PLLs and oscillators, limiting the number of possible wakeup event sources. A driver’s suspend method may need to be aware of system-specific clock constraints on the target sleep state.}(hj6DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMyhjChhubh)}(hSome platforms support programmable clock generators. These can be used by external chips of various kinds, such as other CPUs, multimedia codecs, and devices with strict requirements for interface clocking.h]hSome platforms support programmable clock generators. These can be used by external chips of various kinds, such as other CPUs, multimedia codecs, and devices with strict requirements for interface clocking.}(hjDDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjChhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_notifier (C struct)c.clk_notifierhNtauh1hhjChhhNhNubj)}(hhh](j)}(h clk_notifierh]j)}(hstruct clk_notifierh](j)}(hjAh]hstruct}(hjkDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgDhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKubj2)}(h h]h }(hjyDhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgDhhhjxDhKubj{)}(h clk_notifierh]j)}(hjeDh]h clk_notifier}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjgDhhhjxDhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjcDhhhjxDhKubah}(h]j^Dah ](jjeh"]h$]h&]jj)jhuh1jhjxDhKhj`Dhhubj)}(hhh]h)}(hassociate a clk with a notifierh]hassociate a clk with a notifier}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK,hjDhhubah}(h]h ]h"]h$]h&]uh1jhj`DhhhjxDhKubeh}(h]h ](jstructeh"]h$]h&]jjjjDjjDjjjuh1jhhhjChNhNubj)}(hX[**Definition**:: struct clk_notifier { struct clk *clk; struct srcu_notifier_head notifier_head; struct list_head node; }; **Members** ``clk`` struct clk * to associate the notifier with ``notifier_head`` a blocking_notifier_head for this clk ``node`` linked list pointersh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh:}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK0hjDubj7C)}(hstruct clk_notifier { struct clk *clk; struct srcu_notifier_head notifier_head; struct list_head node; };h]hstruct clk_notifier { struct clk *clk; struct srcu_notifier_head notifier_head; struct list_head node; };}hjDsbah}(h]h ]h"]h$]h&]jjuh1j6ChX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK2hjDubh)}(h **Members**h]j)}(hjDh]hMembers}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK8hjDubj )}(hhh](j)}(h4``clk`` struct clk * to associate the notifier with h](j)}(h``clk``h]j)}(hjEh]hclk}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK.hjEubj2)}(hhh]h)}(h+struct clk * to associate the notifier withh]h+struct clk * to associate the notifier with}(hj3EhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/EhK.hj0Eubah}(h]h ]h"]h$]h&]uh1j1hjEubeh}(h]h ]h"]h$]h&]uh1jhj/EhK.hjEubj)}(h8``notifier_head`` a blocking_notifier_head for this clk h](j)}(h``notifier_head``h]j)}(hjSEh]h notifier_head}(hjUEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQEubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK/hjMEubj2)}(hhh]h)}(h%a blocking_notifier_head for this clkh]h%a blocking_notifier_head for this clk}(hjlEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhEhK/hjiEubah}(h]h ]h"]h$]h&]uh1j1hjMEubeh}(h]h ]h"]h$]h&]uh1jhjhEhK/hjEubj)}(h``node`` linked list pointersh](j)}(h``node``h]j)}(hjEh]hnode}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK/hjEubj2)}(hhh]h)}(hlinked list pointersh]hlinked list pointers}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK0hjEubah}(h]h ]h"]h$]h&]uh1j1hjEubeh}(h]h ]h"]h$]h&]uh1jhjEhK/hjEubeh}(h]h ]h"]h$]h&]uh1j hjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(h**Description**h]j)}(hjEh]h Description}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK3hjChhubh)}(hA list of struct clk_notifier is maintained by the notifier code. An entry is created whenever code registers the first notifier on a particular **clk**. Future notifiers on that **clk** are added to the **notifier_head**.h](hA list of struct clk_notifier is maintained by the notifier code. An entry is created whenever code registers the first notifier on a particular }(hjEhhhNhNubj)}(h**clk**h]hclk}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh. Future notifiers on that }(hjEhhhNhNubj)}(h**clk**h]hclk}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh are added to the }(hjEhhhNhNubj)}(h**notifier_head**h]h notifier_head}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK0hjChhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_notifier_data (C struct)c.clk_notifier_datahNtauh1hhjChhhNhNubj)}(hhh](j)}(hclk_notifier_datah]j)}(hstruct clk_notifier_datah](j)}(hjAh]hstruct}(hjCFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?FhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK8ubj2)}(h h]h }(hjQFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj?FhhhjPFhK8ubj{)}(hclk_notifier_datah]j)}(hj=Fh]hclk_notifier_data}(hjcFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_Fubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj?FhhhjPFhK8ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj;FhhhjPFhK8ubah}(h]j6Fah ](jjeh"]h$]h&]jj)jhuh1jhjPFhK8hj8Fhhubj)}(hhh]h)}(h*rate data to pass to the notifier callbackh]h*rate data to pass to the notifier callback}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK=hjFhhubah}(h]h ]h"]h$]h&]uh1jhj8FhhhjPFhK8ubeh}(h]h ](jstructeh"]h$]h&]jjjjFjjFjjjuh1jhhhjChNhNubj)}(hX)**Definition**:: struct clk_notifier_data { struct clk *clk; unsigned long old_rate; unsigned long new_rate; }; **Members** ``clk`` struct clk * being changed ``old_rate`` previous rate of this clk ``new_rate`` new rate of this clkh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubh:}(hjFhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKAhjFubj7C)}(hstruct clk_notifier_data { struct clk *clk; unsigned long old_rate; unsigned long new_rate; };h]hstruct clk_notifier_data { struct clk *clk; unsigned long old_rate; unsigned long new_rate; };}hjFsbah}(h]h ]h"]h$]h&]jjuh1j6ChX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKChjFubh)}(h **Members**h]j)}(hjFh]hMembers}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKIhjFubj )}(hhh](j)}(h#``clk`` struct clk * being changed h](j)}(h``clk``h]j)}(hjFh]hclk}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK?hjFubj2)}(hhh]h)}(hstruct clk * being changedh]hstruct clk * being changed}(hj GhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhK?hjGubah}(h]h ]h"]h$]h&]uh1j1hjFubeh}(h]h ]h"]h$]h&]uh1jhjGhK?hjFubj)}(h'``old_rate`` previous rate of this clk h](j)}(h ``old_rate``h]j)}(hj+Gh]hold_rate}(hj-GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)Gubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK@hj%Gubj2)}(hhh]h)}(hprevious rate of this clkh]hprevious rate of this clk}(hjDGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@GhK@hjAGubah}(h]h ]h"]h$]h&]uh1j1hj%Gubeh}(h]h ]h"]h$]h&]uh1jhj@GhK@hjFubj)}(h!``new_rate`` new rate of this clkh](j)}(h ``new_rate``h]j)}(hjdGh]hnew_rate}(hjfGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbGubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK@hj^Gubj2)}(hhh]h)}(hnew rate of this clkh]hnew rate of this clk}(hj}GhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKAhjzGubah}(h]h ]h"]h$]h&]uh1j1hj^Gubeh}(h]h ]h"]h$]h&]uh1jhjyGhK@hjFubeh}(h]h ]h"]h$]h&]uh1j hjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(h**Description**h]j)}(hjGh]h Description}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKDhjChhubh)}(hFor a pre-notifier, old_rate is the clk's rate before this rate change, and new_rate is what the rate will be in the future. For a post-notifier, old_rate and new_rate are both set to the clk's current rate (this was done to optimize the implementation).h]hXFor a pre-notifier, old_rate is the clk’s rate before this rate change, and new_rate is what the rate will be in the future. For a post-notifier, old_rate and new_rate are both set to the clk’s current rate (this was done to optimize the implementation).}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKAhjChhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_bulk_data (C struct)c.clk_bulk_datahNtauh1hhjChhhNhNubj)}(hhh](j)}(h clk_bulk_datah]j)}(hstruct clk_bulk_datah](j)}(hjAh]hstruct}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKIubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGhhhjGhKIubj{)}(h clk_bulk_datah]j)}(hjGh]h clk_bulk_data}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjGhhhjGhKIubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjGhhhjGhKIubah}(h]jGah ](jjeh"]h$]h&]jj)jhuh1jhjGhKIhjGhhubj)}(hhh]h)}(h"Data used for bulk clk operations.h]h"Data used for bulk clk operations.}(hj'HhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKNhj$Hhhubah}(h]h ]h"]h$]h&]uh1jhjGhhhjGhKIubeh}(h]h ](jstructeh"]h$]h&]jjjj?Hjj?Hjjjuh1jhhhjChNhNubj)}(h**Definition**:: struct clk_bulk_data { const char *id; struct clk *clk; }; **Members** ``id`` clock consumer ID ``clk`` struct clk * to store the associated clockh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjKHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGHubh:}(hjGHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKRhjCHubj7C)}(h\struct clk_bulk_data { const char *id; struct clk *clk; };h]h\struct clk_bulk_data { const char *id; struct clk *clk; };}hjdHsbah}(h]h ]h"]h$]h&]jjuh1j6ChX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKThjCHubh)}(h **Members**h]j)}(hjuHh]hMembers}(hjwHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsHubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKYhjCHubj )}(hhh](j)}(h``id`` clock consumer ID h](j)}(h``id``h]j)}(hjHh]hid}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKQhjHubj2)}(hhh]h)}(hclock consumer IDh]hclock consumer ID}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhKQhjHubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjHhKQhjHubj)}(h2``clk`` struct clk * to store the associated clockh](j)}(h``clk``h]j)}(hjHh]hclk}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKQhjHubj2)}(hhh]h)}(h*struct clk * to store the associated clockh]h*struct clk * to store the associated clock}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKRhjHubah}(h]h ]h"]h$]h&]uh1j1hjHubeh}(h]h ]h"]h$]h&]uh1jhjHhKQhjHubeh}(h]h ]h"]h$]h&]uh1j hjCHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(h**Description**h]j)}(hjIh]h Description}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKUhjChhubh)}(hThe CLK APIs provide a series of clk_bulk_() API calls as a convenience to consumers which require multiple clks. This structure is used to manage data for these calls.h]hThe CLK APIs provide a series of clk_bulk_() API calls as a convenience to consumers which require multiple clks. This structure is used to manage data for these calls.}(hj&IhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKRhjChhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "clk_notifier_register (C function)c.clk_notifier_registerhNtauh1hhjChhhNhNubj)}(hhh](j)}(hFint clk_notifier_register (struct clk *clk, struct notifier_block *nb)h]j)}(hEint clk_notifier_register(struct clk *clk, struct notifier_block *nb)h](j )}(hinth]hint}(hjNIhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJIhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK_ubj2)}(h h]h }(hj]IhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJIhhhj\IhK_ubj{)}(hclk_notifier_registerh]j)}(hclk_notifier_registerh]hclk_notifier_register}(hjoIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkIubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjJIhhhj\IhK_ubj)}(h,(struct clk *clk, struct notifier_block *nb)h](j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubh)}(hhh]j)}(hclkh]hclk}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjImodnameN classnameNj] j` )}jc ]jf )}jY jqIsbc.clk_notifier_registerasbuh1hhjIubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjh]h*}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hclkh]hclk}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjIubj)}(hstruct notifier_block *nbh](j)}(hjAh]hstruct}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj2)}(h h]h }(hj JhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubh)}(hhh]j)}(hnotifier_blockh]hnotifier_block}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjJmodnameN classnameNj] j` )}jc ]jIc.clk_notifier_registerasbuh1hhjIubj2)}(h h]h }(hj9JhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjh]h*}(hjGJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hnbh]hnb}(hjTJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjIubeh}(h]h ]h"]h$]h&]jjuh1jhjJIhhhj\IhK_ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjFIhhhj\IhK_ubah}(h]jAIah ](jjeh"]h$]h&]jj)jhuh1jhj\IhK_hjCIhhubj)}(hhh]h)}(h.register a clock rate-change notifier callbackh]h.register a clock rate-change notifier callback}(hj~JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK_hj{Jhhubah}(h]h ]h"]h$]h&]uh1jhjCIhhhj\IhK_ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjJjjJjjjuh1jhhhjChNhNubj)}(hXF**Parameters** ``struct clk *clk`` clock whose rate we are interested in ``struct notifier_block *nb`` notifier block with callback function pointer **Description** ProTip: debugging across notifier chains can be frustrating. Make sure that your notifier callback function prints a nice big warning in case of failure.h](h)}(h**Parameters**h]j)}(hjJh]h Parameters}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKchjJubj )}(hhh](j)}(h:``struct clk *clk`` clock whose rate we are interested in h](j)}(h``struct clk *clk``h]j)}(hjJh]hstruct clk *clk}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK`hjJubj2)}(hhh]h)}(h%clock whose rate we are interested inh]h%clock whose rate we are interested in}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhK`hjJubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjJhK`hjJubj)}(hL``struct notifier_block *nb`` notifier block with callback function pointer h](j)}(h``struct notifier_block *nb``h]j)}(hjJh]hstruct notifier_block *nb}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKahjJubj2)}(hhh]h)}(h-notifier block with callback function pointerh]h-notifier block with callback function pointer}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj KhKahjKubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhj KhKahjJubeh}(h]h ]h"]h$]h&]uh1j hjJubh)}(h**Description**h]j)}(hj3Kh]h Description}(hj5KhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1Kubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKchjJubh)}(hProTip: debugging across notifier chains can be frustrating. Make sure that your notifier callback function prints a nice big warning in case of failure.h]hProTip: debugging across notifier chains can be frustrating. Make sure that your notifier callback function prints a nice big warning in case of failure.}(hjIKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKbhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $clk_notifier_unregister (C function)c.clk_notifier_unregisterhNtauh1hhjChhhNhNubj)}(hhh](j)}(hHint clk_notifier_unregister (struct clk *clk, struct notifier_block *nb)h]j)}(hGint clk_notifier_unregister(struct clk *clk, struct notifier_block *nb)h](j )}(hinth]hint}(hjxKhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjtKhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKjubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtKhhhjKhKjubj{)}(hclk_notifier_unregisterh]j)}(hclk_notifier_unregisterh]hclk_notifier_unregister}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjtKhhhjKhKjubj)}(h,(struct clk *clk, struct notifier_block *nb)h](j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubh)}(hhh]j)}(hclkh]hclk}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjKmodnameN classnameNj] j` )}jc ]jf )}jY jKsbc.clk_notifier_unregisterasbuh1hhjKubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubj)}(hjh]h*}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hclkh]hclk}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjKubj)}(hstruct notifier_block *nbh](j)}(hjAh]hstruct}(hj'LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#Lubj2)}(h h]h }(hj4LhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#Lubh)}(hhh]j)}(hnotifier_blockh]hnotifier_block}(hjELhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBLubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjGLmodnameN classnameNj] j` )}jc ]jKc.clk_notifier_unregisterasbuh1hhj#Lubj2)}(h h]h }(hjcLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#Lubj)}(hjh]h*}(hjqLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#Lubj)}(hnbh]hnb}(hj~LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#Lubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjKubeh}(h]h ]h"]h$]h&]jjuh1jhjtKhhhjKhKjubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjpKhhhjKhKjubah}(h]jkKah ](jjeh"]h$]h&]jj)jhuh1jhjKhKjhjmKhhubj)}(hhh]h)}(h0unregister a clock rate-change notifier callbackh]h0unregister a clock rate-change notifier callback}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKjhjLhhubah}(h]h ]h"]h$]h&]uh1jhjmKhhhjKhKjubeh}(h]h ](jfunctioneh"]h$]h&]jjjjLjjLjjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock whose rate we are no longer interested in ``struct notifier_block *nb`` notifier block which will be unregisteredh](h)}(h**Parameters**h]j)}(hjLh]h Parameters}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKnhjLubj )}(hhh](j)}(hD``struct clk *clk`` clock whose rate we are no longer interested in h](j)}(h``struct clk *clk``h]j)}(hjLh]hstruct clk *clk}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKkhjLubj2)}(hhh]h)}(h/clock whose rate we are no longer interested inh]h/clock whose rate we are no longer interested in}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhKkhjLubah}(h]h ]h"]h$]h&]uh1j1hjLubeh}(h]h ]h"]h$]h&]uh1jhjLhKkhjLubj)}(hG``struct notifier_block *nb`` notifier block which will be unregisteredh](j)}(h``struct notifier_block *nb``h]j)}(hj"Mh]hstruct notifier_block *nb}(hj$MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Mubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKmhjMubj2)}(hhh]h)}(h)notifier block which will be unregisteredh]h)notifier block which will be unregistered}(hj;MhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKlhj8Mubah}(h]h ]h"]h$]h&]uh1j1hjMubeh}(h]h ]h"]h$]h&]uh1jhj7MhKmhjLubeh}(h]h ]h"]h$]h&]uh1j hjLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'devm_clk_notifier_register (C function)c.devm_clk_notifier_registerhNtauh1hhjChhhNhNubj)}(hhh](j)}(h_int devm_clk_notifier_register (struct device *dev, struct clk *clk, struct notifier_block *nb)h]j)}(h^int devm_clk_notifier_register(struct device *dev, struct clk *clk, struct notifier_block *nb)h](j )}(hinth]hint}(hj|MhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjxMhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKqubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxMhhhjMhKqubj{)}(hdevm_clk_notifier_registerh]j)}(hdevm_clk_notifier_registerh]hdevm_clk_notifier_register}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjxMhhhjMhKqubj)}(h@(struct device *dev, struct clk *clk, struct notifier_block *nb)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubh)}(hhh]j)}(hdeviceh]hdevice}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjMmodnameN classnameNj] j` )}jc ]jf )}jY jMsbc.devm_clk_notifier_registerasbuh1hhjMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(hdevh]hdev}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hj+NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Nubj2)}(h h]h }(hj8NhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'Nubh)}(hhh]j)}(hclkh]hclk}(hjINhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFNubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjKNmodnameN classnameNj] j` )}jc ]jMc.devm_clk_notifier_registerasbuh1hhj'Nubj2)}(h h]h }(hjgNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'Nubj)}(hjh]h*}(hjuNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Nubj)}(hclkh]hclk}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Nubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubj)}(hstruct notifier_block *nbh](j)}(hjAh]hstruct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubh)}(hhh]j)}(hnotifier_blockh]hnotifier_block}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjNmodnameN classnameNj] j` )}jc ]jMc.devm_clk_notifier_registerasbuh1hhjNubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj)}(hnbh]hnb}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubeh}(h]h ]h"]h$]h&]jjuh1jhjxMhhhjMhKqubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjtMhhhjMhKqubah}(h]joMah ](jjeh"]h$]h&]jj)jhuh1jhjMhKqhjqMhhubj)}(hhh]h)}(h0register a managed rate-change notifier callbackh]h0register a managed rate-change notifier callback}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKqhjOhhubah}(h]h ]h"]h$]h&]uh1jhjqMhhhjMhKqubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4Ojj4Ojjjuh1jhhhjChNhNubj)}(hX **Parameters** ``struct device *dev`` device for clock "consumer" ``struct clk *clk`` clock whose rate we are interested in ``struct notifier_block *nb`` notifier block with callback function pointer **Description** Returns 0 on success, -EERROR otherwiseh](h)}(h**Parameters**h]j)}(hj>Oh]h Parameters}(hj@OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjah"]h$]h&]uh1j1hjKPhhhj]PhK|ubj{)}(hclk_get_accuracyh]j)}(hclk_get_accuracyh]hclk_get_accuracy}(hjpPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlPubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjKPhhhj]PhK|ubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubh)}(hhh]j)}(hclkh]hclk}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjPmodnameN classnameNj] j` )}jc ]jf )}jY jrPsbc.clk_get_accuracyasbuh1hhjPubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hclkh]hclk}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubah}(h]h ]h"]h$]h&]jjuh1jhjKPhhhj]PhK|ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjGPhhhj]PhK|ubah}(h]jBPah ](jjeh"]h$]h&]jj)jhuh1jhj]PhK|hjDPhhubj)}(hhh]h)}(hHobtain the clock accuracy in ppb (parts per billion) for a clock source.h]hHobtain the clock accuracy in ppb (parts per billion) for a clock source.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK|hj Qhhubah}(h]h ]h"]h$]h&]uh1jhjDPhhhj]PhK|ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj'Qjj'Qjjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock source **Description** This gets the clock source accuracy expressed in ppb. A perfect clock returns 0.h](h)}(h**Parameters**h]j)}(hj1Qh]h Parameters}(hj3QhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/Qubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj+Qubj )}(hhh]j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjPQh]hstruct clk *clk}(hjRQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNQubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhK~hjJQubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjiQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjeQhK~hjfQubah}(h]h ]h"]h$]h&]uh1j1hjJQubeh}(h]h ]h"]h$]h&]uh1jhjeQhK~hjGQubah}(h]h ]h"]h$]h&]uh1j hj+Qubh)}(h**Description**h]j)}(hjQh]h Description}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj+Qubh)}(hPThis gets the clock source accuracy expressed in ppb. A perfect clock returns 0.h]hPThis gets the clock source accuracy expressed in ppb. A perfect clock returns 0.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj+Qubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_set_phase (C function)c.clk_set_phasehNtauh1hhjChhhNhNubj)}(hhh](j)}(h0int clk_set_phase (struct clk *clk, int degrees)h]j)}(h/int clk_set_phase(struct clk *clk, int degrees)h](j )}(hinth]hint}(hjQhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjQhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQhhhjQhKubj{)}(h clk_set_phaseh]j)}(h clk_set_phaseh]h clk_set_phase}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjQhhhjQhKubj)}(h(struct clk *clk, int degrees)h](j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hj RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Rubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj Rubh)}(hhh]j)}(hclkh]hclk}(hj+RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(Rubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj-RmodnameN classnameNj] j` )}jc ]jf )}jY jQsbc.clk_set_phaseasbuh1hhj Rubj2)}(h h]h }(hjKRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj Rubj)}(hjh]h*}(hjYRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Rubj)}(hclkh]hclk}(hjfRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Rubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjRubj)}(h int degreesh](j )}(hinth]hint}(hjRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj{Rubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{Rubj)}(hdegreesh]hdegrees}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{Rubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjRubeh}(h]h ]h"]h$]h&]jjuh1jhjQhhhjQhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjQhhhjQhKubah}(h]jQah ](jjeh"]h$]h&]jj)jhuh1jhjQhKhjQhhubj)}(hhh]h)}(h(adjust the phase shift of a clock signalh]h(adjust the phase shift of a clock signal}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjRhhubah}(h]h ]h"]h$]h&]uh1jhjQhhhjQhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjRjjRjjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock signal source ``int degrees`` number of degrees the signal is shifted **Description** Shifts the phase of a clock signal by the specified degrees. Returns 0 on success, -EERROR otherwise.h](h)}(h**Parameters**h]j)}(hjRh]h Parameters}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjRubj )}(hhh](j)}(h(``struct clk *clk`` clock signal source h](j)}(h``struct clk *clk``h]j)}(hjSh]hstruct clk *clk}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjSubj2)}(hhh]h)}(hclock signal sourceh]hclock signal source}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShKhjSubah}(h]h ]h"]h$]h&]uh1j1hjSubeh}(h]h ]h"]h$]h&]uh1jhjShKhjRubj)}(h8``int degrees`` number of degrees the signal is shifted h](j)}(h``int degrees``h]j)}(hj?Sh]h int degrees}(hjAShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=Subah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj9Subj2)}(hhh]h)}(h'number of degrees the signal is shiftedh]h'number of degrees the signal is shifted}(hjXShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjTShKhjUSubah}(h]h ]h"]h$]h&]uh1j1hj9Subeh}(h]h ]h"]h$]h&]uh1jhjTShKhjRubeh}(h]h ]h"]h$]h&]uh1j hjRubh)}(h**Description**h]j)}(hjzSh]h Description}(hj|ShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxSubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjRubh)}(heShifts the phase of a clock signal by the specified degrees. Returns 0 on success, -EERROR otherwise.h]heShifts the phase of a clock signal by the specified degrees. Returns 0 on success, -EERROR otherwise.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_get_phase (C function)c.clk_get_phasehNtauh1hhjChhhNhNubj)}(hhh](j)}(h#int clk_get_phase (struct clk *clk)h]j)}(h"int clk_get_phase(struct clk *clk)h](j )}(hinth]hint}(hjShhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjShhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjShhhjShKubj{)}(h clk_get_phaseh]j)}(h clk_get_phaseh]h clk_get_phase}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjShhhjShKubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj2)}(h h]h }(hj ThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubh)}(hhh]j)}(hclkh]hclk}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjTmodnameN classnameNj] j` )}jc ]jf )}jY jSsbc.clk_get_phaseasbuh1hhjSubj2)}(h h]h }(hj:ThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hjh]h*}(hjHThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj)}(hclkh]hclk}(hjUThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubah}(h]h ]h"]h$]h&]jjuh1jhjShhhjShKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjShhhjShKubah}(h]jSah ](jjeh"]h$]h&]jj)jhuh1jhjShKhjShhubj)}(hhh]h)}(h(return the phase shift of a clock signalh]h(return the phase shift of a clock signal}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj|Thhubah}(h]h ]h"]h$]h&]uh1jhjShhhjShKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjTjjTjjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock signal source **Description** Returns the phase shift of a clock node in degrees, otherwise returns -EERROR.h](h)}(h**Parameters**h]j)}(hjTh]h Parameters}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjTubj )}(hhh]j)}(h(``struct clk *clk`` clock signal source h](j)}(h``struct clk *clk``h]j)}(hjTh]hstruct clk *clk}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjTubj2)}(hhh]h)}(hclock signal sourceh]hclock signal source}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThKhjTubah}(h]h ]h"]h$]h&]uh1j1hjTubeh}(h]h ]h"]h$]h&]uh1jhjThKhjTubah}(h]h ]h"]h$]h&]uh1j hjTubh)}(h**Description**h]j)}(hjTh]h Description}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjTubh)}(hNReturns the phase shift of a clock node in degrees, otherwise returns -EERROR.h]hNReturns the phase shift of a clock node in degrees, otherwise returns -EERROR.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_set_duty_cycle (C function)c.clk_set_duty_cyclehNtauh1hhjChhhNhNubj)}(hhh](j)}(hLint clk_set_duty_cycle (struct clk *clk, unsigned int num, unsigned int den)h]j)}(hKint clk_set_duty_cycle(struct clk *clk, unsigned int num, unsigned int den)h](j )}(hinth]hint}(hj@UhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjah"]h$]h&]uh1j1hjah"]h$]h&]uh1j1hjyUubh)}(hhh]j)}(hclkh]hclk}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjUmodnameN classnameNj] j` )}jc ]jf )}jY jcUsbc.clk_set_duty_cycleasbuh1hhjyUubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyUubj)}(hjh]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyUubj)}(hclkh]hclk}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjuUubj)}(hunsigned int numh](j )}(hunsignedh]hunsigned}(hjUhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj )}(hinth]hint}(hj VhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj)}(hnumh]hnum}(hj'VhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjuUubj)}(hunsigned int denh](j )}(hunsignedh]hunsigned}(hj@VhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjah"]h$]h&]uh1j1hjah"]h$]h&]uh1j1hjah"]h$]h&]uh1j1hjWhhhjWhKubj{)}(hclk_get_scaled_duty_cycleh]j)}(hclk_get_scaled_duty_cycleh]hclk_get_scaled_duty_cycle}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjWhhhjWhKubj)}(h%(struct clk *clk, unsigned int scale)h](j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubh)}(hhh]j)}(hclkh]hclk}(hj0XhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-Xubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj2XmodnameN classnameNj] j` )}jc ]jf )}jY jWsbc.clk_get_scaled_duty_cycleasbuh1hhjXubj2)}(h h]h }(hjPXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubj)}(hjh]h*}(hj^XhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(hclkh]hclk}(hjkXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj Xubj)}(hunsigned int scaleh](j )}(hunsignedh]hunsigned}(hjXhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjXubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubj )}(hinth]hint}(hjXhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjXubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubj)}(hscaleh]hscale}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj Xubeh}(h]h ]h"]h$]h&]jjuh1jhjWhhhjWhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjWhhhjWhKubah}(h]jWah ](jjeh"]h$]h&]jj)jhuh1jhjWhKhjWhhubj)}(hhh]h)}(h-return the duty cycle ratio of a clock signalh]h-return the duty cycle ratio of a clock signal}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjXhhubah}(h]h ]h"]h$]h&]uh1jhjWhhhjWhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjXjjXjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct clk *clk`` clock signal source ``unsigned int scale`` scaling factor to be applied to represent the ratio as an integer **Description** Returns the duty cycle ratio multiplied by the scale provided, otherwise returns -EERROR.h](h)}(h**Parameters**h]j)}(hjYh]h Parameters}(hj YhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjYubj )}(hhh](j)}(h(``struct clk *clk`` clock signal source h](j)}(h``struct clk *clk``h]j)}(hj'Yh]hstruct clk *clk}(hj)YhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%Yubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj!Yubj2)}(hhh]h)}(hclock signal sourceh]hclock signal source}(hj@YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjah"]h$]h&]uh1j1hjYhhhjYhKubj{)}(h clk_is_matchh]j)}(h clk_is_matchh]h clk_is_match}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjYhhhjYhKubj)}(h*(const struct clk *p, const struct clk *q)h](j)}(hconst struct clk *ph](j)}(hjh]hconst}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj2)}(h h]h }(hj)ZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hjAh]hstruct}(hj7ZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj2)}(h h]h }(hjDZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubh)}(hhh]j)}(hclkh]hclk}(hjUZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRZubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjWZmodnameN classnameNj] j` )}jc ]jf )}jY jZsbc.clk_is_matchasbuh1hhjZubj2)}(h h]h }(hjuZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hjh]h*}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hjh]hp}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubj)}(hconst struct clk *qh](j)}(hjh]hconst}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hjAh]hstruct}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubh)}(hhh]j)}(hclkh]hclk}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjZmodnameN classnameNj] j` )}jc ]jqZc.clk_is_matchasbuh1hhjZubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZubj)}(hjh]h*}(hj [hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hjfh]hq}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZubeh}(h]h ]h"]h$]h&]jjuh1jhjYhhhjYhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjYhhhjYhKubah}(h]jYah ](jjeh"]h$]h&]jj)jhuh1jhjYhKhjYhhubj)}(hhh]h)}(h3check if two clk's point to the same hardware clockh]h5check if two clk’s point to the same hardware clock}(hjC[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj@[hhubah}(h]h ]h"]h$]h&]uh1jhjYhhhjYhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[[jj[[jjjuh1jhhhjChNhNubj)}(hX**Parameters** ``const struct clk *p`` clk compared against q ``const struct clk *q`` clk compared against p **Description** Returns true if the two struct clk pointers both point to the same hardware clock node. Put differently, returns true if **p** and **q** share the same :c:type:`struct clk_core ` object. Returns false otherwise. Note that two NULL clks are treated as matching.h](h)}(h**Parameters**h]j)}(hje[h]h Parameters}(hjg[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc[ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj_[ubj )}(hhh](j)}(h/``const struct clk *p`` clk compared against q h](j)}(h``const struct clk *p``h]j)}(hj[h]hconst struct clk *p}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj~[ubj2)}(hhh]h)}(hclk compared against qh]hclk compared against q}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hKhj[ubah}(h]h ]h"]h$]h&]uh1j1hj~[ubeh}(h]h ]h"]h$]h&]uh1jhj[hKhj{[ubj)}(h/``const struct clk *q`` clk compared against p h](j)}(h``const struct clk *q``h]j)}(hj[h]hconst struct clk *q}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj[ubj2)}(hhh]h)}(hclk compared against ph]hclk compared against p}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hKhj[ubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhj[hKhj{[ubeh}(h]h ]h"]h$]h&]uh1j hj_[ubh)}(h**Description**h]j)}(hj[h]h Description}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj_[ubh)}(hReturns true if the two struct clk pointers both point to the same hardware clock node. Put differently, returns true if **p** and **q** share the same :c:type:`struct clk_core ` object.h](hyReturns true if the two struct clk pointers both point to the same hardware clock node. Put differently, returns true if }(hj\hhhNhNubj)}(h**p**h]hp}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh and }(hj\hhhNhNubj)}(h**q**h]hq}(hj(\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh share the same }(hj\hhhNhNubh)}(h$:c:type:`struct clk_core `h]j)}(hj<\h]hstruct clk_core}(hj>\hhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhj:\ubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjclk_coreuh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj\ubh object.}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjY\hKhj_[ubh)}(hIReturns false otherwise. Note that two NULL clks are treated as matching.h]hIReturns false otherwise. Note that two NULL clks are treated as matching.}(hjd\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj_[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #clk_rate_exclusive_get (C function)c.clk_rate_exclusive_gethNtauh1hhjChhhNhNubj)}(hhh](j)}(h,int clk_rate_exclusive_get (struct clk *clk)h]j)}(h+int clk_rate_exclusive_get(struct clk *clk)h](j )}(hinth]hint}(hj\hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\hhhj\hKubj{)}(hclk_rate_exclusive_geth]j)}(hclk_rate_exclusive_geth]hclk_rate_exclusive_get}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj\hhhj\hKubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubh)}(hhh]j)}(hclkh]hclk}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj\modnameN classnameNj] j` )}jc ]jf )}jY j\sbc.clk_rate_exclusive_getasbuh1hhj\ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj)}(hjh]h*}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hclkh]hclk}(hj)]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubah}(h]h ]h"]h$]h&]jjuh1jhj\hhhj\hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj\hhhj\hKubah}(h]j\ah ](jjeh"]h$]h&]jj)jhuh1jhj\hKhj\hhubj)}(hhh]h)}(h3get exclusivity over the rate control of a producerh]h3get exclusivity over the rate control of a producer}(hjS]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjP]hhubah}(h]h ]h"]h$]h&]uh1jhj\hhhj\hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjk]jjk]jjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct clk *clk`` clock source **Description** This function allows drivers to get exclusive control over the rate of a provider. It prevents any other consumer to execute, even indirectly, opereation which could alter the rate of the provider or cause glitches If exlusivity is claimed more than once on clock, even by the same driver, the rate effectively gets locked as exclusivity can't be preempted. Must not be called from within atomic context. Returns success (0) or negative errno.h](h)}(h**Parameters**h]j)}(hju]h]h Parameters}(hjw]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs]ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjo]ubj )}(hhh]j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hj]h]hstruct clk *clk}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj]ubj2)}(hhh]h)}(h clock sourceh]h clock source}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hKhj]ubah}(h]h ]h"]h$]h&]uh1j1hj]ubeh}(h]h ]h"]h$]h&]uh1jhj]hKhj]ubah}(h]h ]h"]h$]h&]uh1j hjo]ubh)}(h**Description**h]j)}(hj]h]h Description}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjo]ubh)}(hThis function allows drivers to get exclusive control over the rate of a provider. It prevents any other consumer to execute, even indirectly, opereation which could alter the rate of the provider or cause glitchesh]hThis function allows drivers to get exclusive control over the rate of a provider. It prevents any other consumer to execute, even indirectly, opereation which could alter the rate of the provider or cause glitches}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjo]ubh)}(hIf exlusivity is claimed more than once on clock, even by the same driver, the rate effectively gets locked as exclusivity can't be preempted.h]hIf exlusivity is claimed more than once on clock, even by the same driver, the rate effectively gets locked as exclusivity can’t be preempted.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjo]ubh)}(h.Must not be called from within atomic context.h]h.Must not be called from within atomic context.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjo]ubh)}(h&Returns success (0) or negative errno.h]h&Returns success (0) or negative errno.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjo]ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (devm_clk_rate_exclusive_get (C function)c.devm_clk_rate_exclusive_gethNtauh1hhjChhhNhNubj)}(hhh](j)}(hEint devm_clk_rate_exclusive_get (struct device *dev, struct clk *clk)h]j)}(hDint devm_clk_rate_exclusive_get(struct device *dev, struct clk *clk)h](j )}(hinth]hint}(hjA^hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj=^hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKubj2)}(h h]h }(hjP^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=^hhhjO^hKubj{)}(hdevm_clk_rate_exclusive_geth]j)}(hdevm_clk_rate_exclusive_geth]hdevm_clk_rate_exclusive_get}(hjb^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^^ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj=^hhhjO^hKubj)}(h%(struct device *dev, struct clk *clk)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hj~^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjz^ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjz^ubh)}(hhh]j)}(hdeviceh]hdevice}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj^modnameN classnameNj] j` )}jc ]jf )}jY jd^sbc.devm_clk_rate_exclusive_getasbuh1hhjz^ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjz^ubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjz^ubj)}(hdevh]hdev}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjz^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjv^ubj)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubh)}(hhh]j)}(hclkh]hclk}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj _ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj_modnameN classnameNj] j` )}jc ]j^c.devm_clk_rate_exclusive_getasbuh1hhj^ubj2)}(h h]h }(hj,_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubj)}(hjh]h*}(hj:_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hclkh]hclk}(hjG_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjv^ubeh}(h]h ]h"]h$]h&]jjuh1jhj=^hhhjO^hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj9^hhhjO^hKubah}(h]j4^ah ](jjeh"]h$]h&]jj)jhuh1jhjO^hKhj6^hhubj)}(hhh]h)}(h&devm variant of clk_rate_exclusive_geth]h&devm variant of clk_rate_exclusive_get}(hjq_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjn_hhubah}(h]h ]h"]h$]h&]uh1jhj6^hhhjO^hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj_jj_jjjuh1jhhhjChNhNubj)}(hX-**Parameters** ``struct device *dev`` device the exclusivity is bound to ``struct clk *clk`` clock source **Description** Calls clk_rate_exclusive_get() on **clk** and registers a devm cleanup handler on **dev** to call clk_rate_exclusive_put(). Must not be called from within atomic context.h](h)}(h**Parameters**h]j)}(hj_h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj_ubj )}(hhh](j)}(h:``struct device *dev`` device the exclusivity is bound to h](j)}(h``struct device *dev``h]j)}(hj_h]hstruct device *dev}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj_ubj2)}(hhh]h)}(h"device the exclusivity is bound toh]h"device the exclusivity is bound to}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hKhj_ubah}(h]h ]h"]h$]h&]uh1j1hj_ubeh}(h]h ]h"]h$]h&]uh1jhj_hKhj_ubj)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hj_h]hstruct clk *clk}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj_ubj2)}(hhh]h)}(h clock sourceh]h clock source}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hKhj`ubah}(h]h ]h"]h$]h&]uh1j1hj_ubeh}(h]h ]h"]h$]h&]uh1jhj`hKhj_ubeh}(h]h ]h"]h$]h&]uh1j hj_ubh)}(h**Description**h]j)}(hj&`h]h Description}(hj(`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$`ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj_ubh)}(h{Calls clk_rate_exclusive_get() on **clk** and registers a devm cleanup handler on **dev** to call clk_rate_exclusive_put().h](h"Calls clk_rate_exclusive_get() on }(hj<`hhhNhNubj)}(h**clk**h]hclk}(hjD`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<`ubh) and registers a devm cleanup handler on }(hj<`hhhNhNubj)}(h**dev**h]hdev}(hjV`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<`ubh" to call clk_rate_exclusive_put().}(hj<`hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj_ubh)}(h.Must not be called from within atomic context.h]h.Must not be called from within atomic context.}(hjo`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #clk_rate_exclusive_put (C function)c.clk_rate_exclusive_puthNtauh1hhjChhhNhNubj)}(hhh](j)}(h-void clk_rate_exclusive_put (struct clk *clk)h]j)}(h,void clk_rate_exclusive_put(struct clk *clk)h](j )}(hvoidh]hvoid}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj`hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`hhhj`hKubj{)}(hclk_rate_exclusive_puth]j)}(hclk_rate_exclusive_puth]hclk_rate_exclusive_put}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj`hhhj`hKubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubh)}(hhh]j)}(hclkh]hclk}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj`modnameN classnameNj] j` )}jc ]jf )}jY j`sbc.clk_rate_exclusive_putasbuh1hhj`ubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`ubj)}(hjh]h*}(hj'ahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hclkh]hclk}(hj4ahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj`ubah}(h]h ]h"]h$]h&]jjuh1jhj`hhhj`hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj`hhhj`hKubah}(h]j`ah ](jjeh"]h$]h&]jj)jhuh1jhj`hKhj`hhubj)}(hhh]h)}(h7release exclusivity over the rate control of a producerh]h7release exclusivity over the rate control of a producer}(hj^ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhj[ahhubah}(h]h ]h"]h$]h&]uh1jhj`hhhj`hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjvajjvajjjuh1jhhhjChNhNubj)}(hX@**Parameters** ``struct clk *clk`` clock source **Description** This function allows drivers to release the exclusivity it previously got from clk_rate_exclusive_get() The caller must balance the number of clk_rate_exclusive_get() and clk_rate_exclusive_put() calls. Must not be called from within atomic context.h](h)}(h**Parameters**h]j)}(hjah]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~aubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjzaubj )}(hhh]j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjah]hstruct clk *clk}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjaubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahKhjaubah}(h]h ]h"]h$]h&]uh1j1hjaubeh}(h]h ]h"]h$]h&]uh1jhjahKhjaubah}(h]h ]h"]h$]h&]uh1j hjzaubh)}(h**Description**h]j)}(hjah]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjzaubh)}(hgThis function allows drivers to release the exclusivity it previously got from clk_rate_exclusive_get()h]hgThis function allows drivers to release the exclusivity it previously got from clk_rate_exclusive_get()}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjzaubh)}(hbThe caller must balance the number of clk_rate_exclusive_get() and clk_rate_exclusive_put() calls.h]hbThe caller must balance the number of clk_rate_exclusive_get() and clk_rate_exclusive_put() calls.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjzaubh)}(h.Must not be called from within atomic context.h]h.Must not be called from within atomic context.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjzaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_save_context (C function)c.clk_save_contexthNtauh1hhjChhhNhNubj)}(hhh](j)}(hint clk_save_context (void)h]j)}(hint clk_save_context(void)h](j )}(hinth]hint}(hj=bhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj9bhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKubj2)}(h h]h }(hjLbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9bhhhjKbhKubj{)}(hclk_save_contexth]j)}(hclk_save_contexth]hclk_save_context}(hj^bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZbubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj9bhhhjKbhKubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjzbhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjvbubah}(h]h ]h"]h$]h&]noemphjjuh1jhjrbubah}(h]h ]h"]h$]h&]jjuh1jhj9bhhhjKbhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj5bhhhjKbhKubah}(h]j0bah ](jjeh"]h$]h&]jj)jhuh1jhjKbhKhj2bhhubj)}(hhh]h)}(hsave clock context for poweroffh]hsave clock context for poweroff}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjbhhubah}(h]h ]h"]h$]h&]uh1jhj2bhhhjKbhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbjjbjjjuh1jhhhjChNhNubj)}(h**Parameters** ``void`` no arguments **Description** Saves the context of the clock register for powerstates in which the contents of the registers will be lost. Occurs deep within the suspend code so locking is not necessary.h](h)}(h**Parameters**h]j)}(hjbh]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjbubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjbh]hvoid}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjbubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhKhjbubah}(h]h ]h"]h$]h&]uh1j1hjbubeh}(h]h ]h"]h$]h&]uh1jhjbhKhjbubah}(h]h ]h"]h$]h&]uh1j hjbubh)}(h**Description**h]j)}(hj ch]h Description}(hj"chhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjbubh)}(hSaves the context of the clock register for powerstates in which the contents of the registers will be lost. Occurs deep within the suspend code so locking is not necessary.h]hSaves the context of the clock register for powerstates in which the contents of the registers will be lost. Occurs deep within the suspend code so locking is not necessary.}(hj6chhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  clk_restore_context (C function)c.clk_restore_contexthNtauh1hhjChhhNhNubj)}(hhh](j)}(hvoid clk_restore_context (void)h]j)}(hvoid clk_restore_context(void)h](j )}(hvoidh]hvoid}(hjechhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjachhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKubj2)}(h h]h }(hjtchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjachhhjschKubj{)}(hclk_restore_contexth]j)}(hclk_restore_contexth]hclk_restore_context}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjachhhjschKubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjchhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]noemphjjuh1jhjcubah}(h]h ]h"]h$]h&]jjuh1jhjachhhjschKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj]chhhjschKubah}(h]jXcah ](jjeh"]h$]h&]jj)jhuh1jhjschKhjZchhubj)}(hhh]h)}(h$restore clock context after poweroffh]h$restore clock context after poweroff}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjchhubah}(h]h ]h"]h$]h&]uh1jhjZchhhjschKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjcjjcjjjuh1jhhhjChNhNubj)}(h**Parameters** ``void`` no arguments **Description** This occurs with all clocks enabled. Occurs deep within the resume code so locking is not necessary.h](h)}(h**Parameters**h]j)}(hjch]h Parameters}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjcubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj dh]hvoid}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj dubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjdubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj&dhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"dhKhj#dubah}(h]h ]h"]h$]h&]uh1j1hjdubeh}(h]h ]h"]h$]h&]uh1jhj"dhKhjdubah}(h]h ]h"]h$]h&]uh1j hjcubh)}(h**Description**h]j)}(hjHdh]h Description}(hjJdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFdubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjcubh)}(hdThis occurs with all clocks enabled. Occurs deep within the resume code so locking is not necessary.h]hdThis occurs with all clocks enabled. Occurs deep within the resume code so locking is not necessary.}(hj^dhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhKhjcubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_prepare (C function) c.clk_preparehNtauh1hhjChhhNhNubj)}(hhh](j)}(h!int clk_prepare (struct clk *clk)h]j)}(h int clk_prepare(struct clk *clk)h](j )}(hinth]hint}(hjdhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMDubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdhhhjdhMDubj{)}(h clk_prepareh]j)}(h clk_prepareh]h clk_prepare}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjdhhhjdhMDubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubh)}(hhh]j)}(hclkh]hclk}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjdmodnameN classnameNj] j` )}jc ]jf )}jY jdsb c.clk_prepareasbuh1hhjdubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hclkh]hclk}(hj#ehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjdubah}(h]h ]h"]h$]h&]jjuh1jhjdhhhjdhMDubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjdhhhjdhMDubah}(h]jdah ](jjeh"]h$]h&]jj)jhuh1jhjdhMDhjdhhubj)}(hhh]h)}(hprepare a clock sourceh]hprepare a clock source}(hjMehhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMDhjJehhubah}(h]h ]h"]h$]h&]uh1jhjdhhhjdhMDubeh}(h]h ](jfunctioneh"]h$]h&]jjjjeejjeejjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock source **Description** This prepares the clock source for use. Must not be called from within atomic context.h](h)}(h**Parameters**h]j)}(hjoeh]h Parameters}(hjqehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmeubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMHhjieubj )}(hhh]j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjeh]hstruct clk *clk}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMEhjeubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMEhjeubah}(h]h ]h"]h$]h&]uh1j1hjeubeh}(h]h ]h"]h$]h&]uh1jhjehMEhjeubah}(h]h ]h"]h$]h&]uh1j hjieubh)}(h**Description**h]j)}(hjeh]h Description}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMGhjieubh)}(h'This prepares the clock source for use.h]h'This prepares the clock source for use.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMFhjieubh)}(h.Must not be called from within atomic context.h]h.Must not be called from within atomic context.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMHhjieubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_unprepare (C function)c.clk_unpreparehNtauh1hhjChhhNhNubj)}(hhh](j)}(h$void clk_unprepare (struct clk *clk)h]j)}(h#void clk_unprepare(struct clk *clk)h](j )}(hvoidh]hvoid}(hjfhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMNubj2)}(h h]h }(hj,fhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfhhhj+fhMNubj{)}(h clk_unprepareh]j)}(h clk_unprepareh]h clk_unprepare}(hj>fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:fubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjfhhhj+fhMNubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjZfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVfubj2)}(h h]h }(hjgfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVfubh)}(hhh]j)}(hclkh]hclk}(hjxfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjufubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjzfmodnameN classnameNj] j` )}jc ]jf )}jY j@fsbc.clk_unprepareasbuh1hhjVfubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVfubj)}(hjh]h*}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVfubj)}(hclkh]hclk}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVfubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjRfubah}(h]h ]h"]h$]h&]jjuh1jhjfhhhj+fhMNubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjfhhhj+fhMNubah}(h]jfah ](jjeh"]h$]h&]jj)jhuh1jhj+fhMNhjfhhubj)}(hhh]h)}(h"undo preparation of a clock sourceh]h"undo preparation of a clock source}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMNhjfhhubah}(h]h ]h"]h$]h&]uh1jhjfhhhj+fhMNubeh}(h]h ](jfunctioneh"]h$]h&]jjjjfjjfjjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock source **Description** This undoes a previously prepared clock. The caller must balance the number of prepare and unprepare calls. Must not be called from within atomic context.h](h)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMRhjfubj )}(hhh]j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjgh]hstruct clk *clk}(hj ghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMOhjgubj2)}(hhh]h)}(h clock sourceh]h clock source}(hj7ghhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3ghMOhj4gubah}(h]h ]h"]h$]h&]uh1j1hjgubeh}(h]h ]h"]h$]h&]uh1jhj3ghMOhjgubah}(h]h ]h"]h$]h&]uh1j hjfubh)}(h**Description**h]j)}(hjYgh]h Description}(hj[ghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWgubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMQhjfubh)}(hlThis undoes a previously prepared clock. The caller must balance the number of prepare and unprepare calls.h]hlThis undoes a previously prepared clock. The caller must balance the number of prepare and unprepare calls.}(hjoghhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMPhjfubh)}(h.Must not be called from within atomic context.h]h.Must not be called from within atomic context.}(hj~ghhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMShjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )clk_is_enabled_when_prepared (C function)c.clk_is_enabled_when_preparedhNtauh1hhjChhhNhNubj)}(hhh](j)}(h3bool clk_is_enabled_when_prepared (struct clk *clk)h]j)}(h2bool clk_is_enabled_when_prepared(struct clk *clk)h](j )}(hj8h]hbool}(hjghhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjghhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM]ubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjghhhjghM]ubj{)}(hclk_is_enabled_when_preparedh]j)}(hclk_is_enabled_when_preparedh]hclk_is_enabled_when_prepared}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjghhhjghM]ubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgubh)}(hhh]j)}(hclkh]hclk}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj hmodnameN classnameNj] j` )}jc ]jf )}jY jgsbc.clk_is_enabled_when_preparedasbuh1hhjgubj2)}(h h]h }(hj'hhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjgubj)}(hjh]h*}(hj5hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(hclkh]hclk}(hjBhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjgubah}(h]h ]h"]h$]h&]jjuh1jhjghhhjghM]ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjghhhjghM]ubah}(h]jgah ](jjeh"]h$]h&]jj)jhuh1jhjghM]hjghhubj)}(hhh]h)}(h.indicate if preparing a clock also enables it.h]h.indicate if preparing a clock also enables it.}(hjlhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM]hjihhhubah}(h]h ]h"]h$]h&]uh1jhjghhhjghM]ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjhjjhjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct clk *clk`` clock source **Description** Returns true if clk_prepare() implicitly enables the clock, effectively making clk_enable()/clk_disable() no-ops, false otherwise. This is of interest mainly to the power management code where actually disabling the clock also requires unpreparing it to have any material effect. Regardless of the value returned here, the caller must always invoke clk_enable() or clk_prepare_enable() and counterparts for usage counts to be right.h](h)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMahjhubj )}(hhh]j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjhh]hstruct clk *clk}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM^hjhubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhM^hjhubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhjhhM^hjhubah}(h]h ]h"]h$]h&]uh1j hjhubh)}(h**Description**h]j)}(hjhh]h Description}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM`hjhubh)}(hReturns true if clk_prepare() implicitly enables the clock, effectively making clk_enable()/clk_disable() no-ops, false otherwise.h]hReturns true if clk_prepare() implicitly enables the clock, effectively making clk_enable()/clk_disable() no-ops, false otherwise.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM_hjhubh)}(hThis is of interest mainly to the power management code where actually disabling the clock also requires unpreparing it to have any material effect.h]hThis is of interest mainly to the power management code where actually disabling the clock also requires unpreparing it to have any material effect.}(hj ihhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMbhjhubh)}(hRegardless of the value returned here, the caller must always invoke clk_enable() or clk_prepare_enable() and counterparts for usage counts to be right.h]hRegardless of the value returned here, the caller must always invoke clk_enable() or clk_prepare_enable() and counterparts for usage counts to be right.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMfhjhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_get (C function) c.clk_gethNtauh1hhjChhhNhNubj)}(hhh](j)}(h9struct clk * clk_get (struct device *dev, const char *id)h]j)}(h7struct clk *clk_get(struct device *dev, const char *id)h](j)}(hjAh]hstruct}(hjKihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGihhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjYihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGihhhjXihMubh)}(hhh]j)}(hclkh]hclk}(hjjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgiubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlimodnameN classnameNj] j` )}jc ]jf )}jY clk_getsb c.clk_getasbuh1hhjGihhhjXihMubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGihhhjXihMubj)}(hjh]h*}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGihhhjXihMubj{)}(hclk_geth]j)}(hjih]hclk_get}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjGihhhjXihMubj)}(h$(struct device *dev, const char *id)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiubh)}(hhh]j)}(hdeviceh]hdevice}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjimodnameN classnameNj] j` )}jc ]ji c.clk_getasbuh1hhjiubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjiubj)}(hjh]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj)}(hdevh]hdev}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjiubj)}(hconst char *idh](j)}(hjh]hconst}(hj5jhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1jubj2)}(h h]h }(hjBjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1jubj )}(hcharh]hchar}(hjPjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj1jubj2)}(h h]h }(hj^jhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1jubj)}(hjh]h*}(hjljhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1jubj)}(hidh]hid}(hjyjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1jubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjiubeh}(h]h ]h"]h$]h&]jjuh1jhjGihhhjXihMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjCihhhjXihMubah}(h]j>iah ](jjeh"]h$]h&]jj)jhuh1jhjXihMhj@ihhubj)}(hhh]h)}(h2lookup and obtain a reference to a clock producer.h]h2lookup and obtain a reference to a clock producer.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjjhhubah}(h]h ]h"]h$]h&]uh1jhj@ihhhjXihMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjjjuh1jhhhjChNhNubj)}(hX;**Parameters** ``struct device *dev`` device for clock "consumer" ``const char *id`` clock consumer ID **Description** Returns a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. (IOW, **id** may be identical strings, but clk_get may return different clock producers depending on **dev**.) Drivers must assume that the clock source is not enabled. clk_get should not be called from within interrupt context.h](h)}(h**Parameters**h]j)}(hjjh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjjubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjjh]hstruct device *dev}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjjubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhMhjjubah}(h]h ]h"]h$]h&]uh1j1hjjubeh}(h]h ]h"]h$]h&]uh1jhjjhMhjjubj)}(h%``const char *id`` clock consumer ID h](j)}(h``const char *id``h]j)}(hjkh]hconst char *id}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjkubj2)}(hhh]h)}(hclock consumer IDh]hclock consumer ID}(hj6khhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2khMhj3kubah}(h]h ]h"]h$]h&]uh1j1hjkubeh}(h]h ]h"]h$]h&]uh1jhj2khMhjjubeh}(h]h ]h"]h$]h&]uh1j hjjubh)}(h**Description**h]j)}(hjXkh]h Description}(hjZkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVkubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjjubh)}(hXDReturns a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. (IOW, **id** may be identical strings, but clk_get may return different clock producers depending on **dev**.)h](hReturns a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses }(hjnkhhhNhNubj)}(h**dev**h]hdev}(hjvkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnkubh and }(hjnkhhhNhNubj)}(h**id**h]hid}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnkubhI to determine the clock consumer, and thereby the clock producer. (IOW, }(hjnkhhhNhNubj)}(h**id**h]hid}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnkubhY may be identical strings, but clk_get may return different clock producers depending on }(hjnkhhhNhNubj)}(h**dev**h]hdev}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnkubh.)}(hjnkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjjubh)}(h9Drivers must assume that the clock source is not enabled.h]h9Drivers must assume that the clock source is not enabled.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjjubh)}(h;clk_get should not be called from within interrupt context.h]h;clk_get should not be called from within interrupt context.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_bulk_get (C function)c.clk_bulk_gethNtauh1hhjChhhNhNubj)}(hhh](j)}(hOint clk_bulk_get (struct device *dev, int num_clks, struct clk_bulk_data *clks)h]j)}(hNint clk_bulk_get(struct device *dev, int num_clks, struct clk_bulk_data *clks)h](j )}(hinth]hint}(hjlhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjkhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjkhhhjlhMubj{)}(h clk_bulk_geth]j)}(h clk_bulk_geth]h clk_bulk_get}(hj$lhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj lubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjkhhhjlhMubj)}(h>(struct device *dev, int num_clks, struct clk_bulk_data *clks)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hj@lhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjah"]h$]h&]uh1j1hjah"]h$]h&]uh1j1hjah"]h$]h&]uh1j1hjlubj)}(hnum_clksh]hnum_clks}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj8lubj)}(hstruct clk_bulk_data *clksh](j)}(hjAh]hstruct}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmmodnameN classnameNj] j` )}jc ]jzlc.clk_bulk_getasbuh1hhjlubj2)}(h h]h }(hj#mhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjh]h*}(hj1mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hclksh]hclks}(hj>mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj8lubeh}(h]h ]h"]h$]h&]jjuh1jhjkhhhjlhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjkhhhjlhMubah}(h]jkah ](jjeh"]h$]h&]jj)jhuh1jhjlhMhjkhhubj)}(hhh]h)}(h;lookup and obtain a number of references to clock producer.h]h;lookup and obtain a number of references to clock producer.}(hjhmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjemhhubah}(h]h ]h"]h$]h&]uh1jhjkhhhjlhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjmjjmjjjuh1jhhhjChNhNubj)}(hXO**Parameters** ``struct device *dev`` device for clock "consumer" ``int num_clks`` the number of clk_bulk_data ``struct clk_bulk_data *clks`` the clk_bulk_data table of consumer **Description** This helper function allows drivers to get several clk consumers in one operation. If any of the clk cannot be acquired then any clks that were obtained will be freed before returning to the caller. Returns 0 if all clocks specified in clk_bulk_data table are obtained successfully, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **clk_bulk_data.id** to determine the clock consumer, and thereby the clock producer. The clock returned is stored in each **clk_bulk_data.clk** field. Drivers must assume that the clock source is not enabled. clk_bulk_get should not be called from within interrupt context.h](h)}(h**Parameters**h]j)}(hjmh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjmubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjmh]hstruct device *dev}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjmubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhMhjmubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjmhMhjmubj)}(h-``int num_clks`` the number of clk_bulk_data h](j)}(h``int num_clks``h]j)}(hjmh]h int num_clks}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjmubj2)}(hhh]h)}(hthe number of clk_bulk_datah]hthe number of clk_bulk_data}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhMhjmubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjmhMhjmubj)}(hC``struct clk_bulk_data *clks`` the clk_bulk_data table of consumer h](j)}(h``struct clk_bulk_data *clks``h]j)}(hjnh]hstruct clk_bulk_data *clks}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjnubj2)}(hhh]h)}(h#the clk_bulk_data table of consumerh]h#the clk_bulk_data table of consumer}(hj4nhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0nhMhj1nubah}(h]h ]h"]h$]h&]uh1j1hjnubeh}(h]h ]h"]h$]h&]uh1jhj0nhMhjmubeh}(h]h ]h"]h$]h&]uh1j hjmubh)}(h**Description**h]j)}(hjVnh]h Description}(hjXnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTnubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjmubh)}(hThis helper function allows drivers to get several clk consumers in one operation. If any of the clk cannot be acquired then any clks that were obtained will be freed before returning to the caller.h]hThis helper function allows drivers to get several clk consumers in one operation. If any of the clk cannot be acquired then any clks that were obtained will be freed before returning to the caller.}(hjlnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjmubh)}(hX=Returns 0 if all clocks specified in clk_bulk_data table are obtained successfully, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **clk_bulk_data.id** to determine the clock consumer, and thereby the clock producer. The clock returned is stored in each **clk_bulk_data.clk** field.h](hReturns 0 if all clocks specified in clk_bulk_data table are obtained successfully, or valid IS_ERR() condition containing errno. The implementation uses }(hj{nhhhNhNubj)}(h**dev**h]hdev}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{nubh and }(hj{nhhhNhNubj)}(h**clk_bulk_data.id**h]hclk_bulk_data.id}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{nubhg to determine the clock consumer, and thereby the clock producer. The clock returned is stored in each }(hj{nhhhNhNubj)}(h**clk_bulk_data.clk**h]hclk_bulk_data.clk}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{nubh field.}(hj{nhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjmubh)}(h9Drivers must assume that the clock source is not enabled.h]h9Drivers must assume that the clock source is not enabled.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjmubh)}(h@clk_bulk_get should not be called from within interrupt context.h]h@clk_bulk_get should not be called from within interrupt context.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_bulk_get_all (C function)c.clk_bulk_get_allhNtauh1hhjChhhNhNubj)}(hhh](j)}(hFint clk_bulk_get_all (struct device *dev, struct clk_bulk_data **clks)h]j)}(hEint clk_bulk_get_all(struct device *dev, struct clk_bulk_data **clks)h](j )}(hinth]hint}(hjnhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hj ohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnhhhj ohMubj{)}(hclk_bulk_get_allh]j)}(hclk_bulk_get_allh]hclk_bulk_get_all}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnhhhj ohMubj)}(h1(struct device *dev, struct clk_bulk_data **clks)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hj;ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7oubj2)}(h h]h }(hjHohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7oubh)}(hhh]j)}(hdeviceh]hdevice}(hjYohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj[omodnameN classnameNj] j` )}jc ]jf )}jY j!osbc.clk_bulk_get_allasbuh1hhj7oubj2)}(h h]h }(hjyohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7oubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7oubj)}(hdevh]hdev}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7oubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3oubj)}(hstruct clk_bulk_data **clksh](j)}(hjAh]hstruct}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjoubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjomodnameN classnameNj] j` )}jc ]juoc.clk_bulk_get_allasbuh1hhjoubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjoubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(hjh]h*}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(hclksh]hclks}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3oubeh}(h]h ]h"]h$]h&]jjuh1jhjnhhhj ohMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjnhhhj ohMubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1jhj ohMhjnhhubj)}(hhh]h)}(h=lookup and obtain all available references to clock producer.h]h=lookup and obtain all available references to clock producer.}(hj;phhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj8phhubah}(h]h ]h"]h$]h&]uh1jhjnhhhj ohMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjSpjjSpjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``struct clk_bulk_data **clks`` pointer to the clk_bulk_data table of consumer **Description** This helper function allows drivers to get all clk consumers in one operation. If any of the clk cannot be acquired then any clks that were obtained will be freed before returning to the caller. Returns a positive value for the number of clocks obtained while the clock references are stored in the clk_bulk_data table in **clks** field. Returns 0 if there're none and a negative value if something failed. Drivers must assume that the clock source is not enabled. clk_bulk_get should not be called from within interrupt context.h](h)}(h**Parameters**h]j)}(hj]ph]h Parameters}(hj_phhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[pubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjWpubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hj|ph]hstruct device *dev}(hj~phhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzpubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjvpubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphMhjpubah}(h]h ]h"]h$]h&]uh1j1hjvpubeh}(h]h ]h"]h$]h&]uh1jhjphMhjspubj)}(hO``struct clk_bulk_data **clks`` pointer to the clk_bulk_data table of consumer h](j)}(h``struct clk_bulk_data **clks``h]j)}(hjph]hstruct clk_bulk_data **clks}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjpubj2)}(hhh]h)}(h.pointer to the clk_bulk_data table of consumerh]h.pointer to the clk_bulk_data table of consumer}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphMhjpubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhjphMhjspubeh}(h]h ]h"]h$]h&]uh1j hjWpubh)}(h**Description**h]j)}(hjph]h Description}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjWpubh)}(hThis helper function allows drivers to get all clk consumers in one operation. If any of the clk cannot be acquired then any clks that were obtained will be freed before returning to the caller.h]hThis helper function allows drivers to get all clk consumers in one operation. If any of the clk cannot be acquired then any clks that were obtained will be freed before returning to the caller.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjWpubh)}(hReturns a positive value for the number of clocks obtained while the clock references are stored in the clk_bulk_data table in **clks** field. Returns 0 if there're none and a negative value if something failed.h](hReturns a positive value for the number of clocks obtained while the clock references are stored in the clk_bulk_data table in }(hjqhhhNhNubj)}(h**clks**h]hclks}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubhN field. Returns 0 if there’re none and a negative value if something failed.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjWpubh)}(h9Drivers must assume that the clock source is not enabled.h]h9Drivers must assume that the clock source is not enabled.}(hj6qhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjWpubh)}(h@clk_bulk_get should not be called from within interrupt context.h]h@clk_bulk_get should not be called from within interrupt context.}(hjEqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjWpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "clk_bulk_get_optional (C function)c.clk_bulk_get_optionalhNtauh1hhjChhhNhNubj)}(hhh](j)}(hXint clk_bulk_get_optional (struct device *dev, int num_clks, struct clk_bulk_data *clks)h]j)}(hWint clk_bulk_get_optional(struct device *dev, int num_clks, struct clk_bulk_data *clks)h](j )}(hinth]hint}(hjtqhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjpqhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpqhhhjqhMubj{)}(hclk_bulk_get_optionalh]j)}(hclk_bulk_get_optionalh]hclk_bulk_get_optional}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjpqhhhjqhMubj)}(h>(struct device *dev, int num_clks, struct clk_bulk_data *clks)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqubh)}(hhh]j)}(hdeviceh]hdevice}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjqmodnameN classnameNj] j` )}jc ]jf )}jY jqsbc.clk_bulk_get_optionalasbuh1hhjqubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqubj)}(hjh]h*}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(hdevh]hdev}(hj rhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjqubj)}(h int num_clksh](j )}(hinth]hint}(hj#rhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrubj2)}(h h]h }(hj1rhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hnum_clksh]hnum_clks}(hj?rhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjqubj)}(hstruct clk_bulk_data *clksh](j)}(hjAh]hstruct}(hjXrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTrubj2)}(h h]h }(hjerhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTrubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hjvrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsrubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjxrmodnameN classnameNj] j` )}jc ]jqc.clk_bulk_get_optionalasbuh1hhjTrubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjTrubj)}(hjh]h*}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTrubj)}(hclksh]hclks}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjqubeh}(h]h ]h"]h$]h&]jjuh1jhjpqhhhjqhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjlqhhhjqhMubah}(h]jgqah ](jjeh"]h$]h&]jj)jhuh1jhjqhMhjiqhhubj)}(hhh]h)}(h:lookup and obtain a number of references to clock producerh]h:lookup and obtain a number of references to clock producer}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjrhhubah}(h]h ]h"]h$]h&]uh1jhjiqhhhjqhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjrjjrjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``int num_clks`` the number of clk_bulk_data ``struct clk_bulk_data *clks`` the clk_bulk_data table of consumer **Description** Behaves the same as clk_bulk_get() except where there is no clock producer. In this case, instead of returning -ENOENT, the function returns 0 and NULL for a clk for which a clock producer could not be determined.h](h)}(h**Parameters**h]j)}(hjrh]h Parameters}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjrubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjsh]hstruct device *dev}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjsubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hj3shhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/shMhj0subah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhj/shMhjsubj)}(h-``int num_clks`` the number of clk_bulk_data h](j)}(h``int num_clks``h]j)}(hjSsh]h int num_clks}(hjUshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQsubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjMsubj2)}(hhh]h)}(hthe number of clk_bulk_datah]hthe number of clk_bulk_data}(hjlshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhshMhjisubah}(h]h ]h"]h$]h&]uh1j1hjMsubeh}(h]h ]h"]h$]h&]uh1jhjhshMhjsubj)}(hC``struct clk_bulk_data *clks`` the clk_bulk_data table of consumer h](j)}(h``struct clk_bulk_data *clks``h]j)}(hjsh]hstruct clk_bulk_data *clks}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjsubj2)}(hhh]h)}(h#the clk_bulk_data table of consumerh]h#the clk_bulk_data table of consumer}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshMhjsubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjshMhjsubeh}(h]h ]h"]h$]h&]uh1j hjrubh)}(h**Description**h]j)}(hjsh]h Description}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjrubh)}(hBehaves the same as clk_bulk_get() except where there is no clock producer. In this case, instead of returning -ENOENT, the function returns 0 and NULL for a clk for which a clock producer could not be determined.h]hBehaves the same as clk_bulk_get() except where there is no clock producer. In this case, instead of returning -ENOENT, the function returns 0 and NULL for a clk for which a clock producer could not be determined.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjrubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j devm_clk_bulk_get (C function)c.devm_clk_bulk_gethNtauh1hhjChhhNhNubj)}(hhh](j)}(hTint devm_clk_bulk_get (struct device *dev, int num_clks, struct clk_bulk_data *clks)h]j)}(hSint devm_clk_bulk_get(struct device *dev, int num_clks, struct clk_bulk_data *clks)h](j )}(hinth]hint}(hj thhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjthhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjthhhjthMubj{)}(hdevm_clk_bulk_geth]j)}(hdevm_clk_bulk_geth]hdevm_clk_bulk_get}(hj-thhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)tubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjthhhjthMubj)}(h>(struct device *dev, int num_clks, struct clk_bulk_data *clks)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjIthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEtubj2)}(h h]h }(hjVthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEtubh)}(hhh]j)}(hdeviceh]hdevice}(hjgthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdtubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjitmodnameN classnameNj] j` )}jc ]jf )}jY j/tsbc.devm_clk_bulk_getasbuh1hhjEtubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEtubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEtubj)}(hdevh]hdev}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEtubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjAtubj)}(h int num_clksh](j )}(hinth]hint}(hjthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjtubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubj)}(hnum_clksh]hnum_clks}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjAtubj)}(hstruct clk_bulk_data *clksh](j)}(hjAh]hstruct}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj uubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjumodnameN classnameNj] j` )}jc ]jtc.devm_clk_bulk_getasbuh1hhjtubj2)}(h h]h }(hj,uhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubj)}(hjh]h*}(hj:uhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(hclksh]hclks}(hjGuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjAtubeh}(h]h ]h"]h$]h&]jjuh1jhjthhhjthMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjthhhjthMubah}(h]jsah ](jjeh"]h$]h&]jj)jhuh1jhjthMhjthhubj)}(hhh]h)}(h"managed get multiple clk consumersh]h"managed get multiple clk consumers}(hjquhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjnuhhubah}(h]h ]h"]h$]h&]uh1jhjthhhjthMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjujjujjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``int num_clks`` the number of clk_bulk_data ``struct clk_bulk_data *clks`` the clk_bulk_data table of consumer **Description** Return 0 on success, an errno on failure. This helper function allows drivers to get several clk consumers in one operation with management, the clks will automatically be freed when the device is unbound.h](h)}(h**Parameters**h]j)}(hjuh]h Parameters}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjuubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjuh]hstruct device *dev}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjuubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhMhjuubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjuhMhjuubj)}(h-``int num_clks`` the number of clk_bulk_data h](j)}(h``int num_clks``h]j)}(hjuh]h int num_clks}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjuubj2)}(hhh]h)}(hthe number of clk_bulk_datah]hthe number of clk_bulk_data}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhMhjvubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjuubj)}(hC``struct clk_bulk_data *clks`` the clk_bulk_data table of consumer h](j)}(h``struct clk_bulk_data *clks``h]j)}(hj$vh]hstruct clk_bulk_data *clks}(hj&vhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"vubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjvubj2)}(hhh]h)}(h#the clk_bulk_data table of consumerh]h#the clk_bulk_data table of consumer}(hj=vhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9vhMhj:vubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhj9vhMhjuubeh}(h]h ]h"]h$]h&]uh1j hjuubh)}(h**Description**h]j)}(hj_vh]h Description}(hjavhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]vubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjuubh)}(h)Return 0 on success, an errno on failure.h]h)Return 0 on success, an errno on failure.}(hjuvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjuubh)}(hThis helper function allows drivers to get several clk consumers in one operation with management, the clks will automatically be freed when the device is unbound.h]hThis helper function allows drivers to get several clk consumers in one operation with management, the clks will automatically be freed when the device is unbound.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjuubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'devm_clk_bulk_get_optional (C function)c.devm_clk_bulk_get_optionalhNtauh1hhjChhhNhNubj)}(hhh](j)}(h]int devm_clk_bulk_get_optional (struct device *dev, int num_clks, struct clk_bulk_data *clks)h]j)}(h\int devm_clk_bulk_get_optional(struct device *dev, int num_clks, struct clk_bulk_data *clks)h](j )}(hinth]hint}(hjvhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjvhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvhhhjvhMubj{)}(hdevm_clk_bulk_get_optionalh]j)}(hdevm_clk_bulk_get_optionalh]hdevm_clk_bulk_get_optional}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjvhhhjvhMubj)}(h>(struct device *dev, int num_clks, struct clk_bulk_data *clks)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubh)}(hhh]j)}(hdeviceh]hdevice}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj wubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjwmodnameN classnameNj] j` )}jc ]jf )}jY jvsbc.devm_clk_bulk_get_optionalasbuh1hhjvubj2)}(h h]h }(hj.whhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubj)}(hjh]h*}(hjah"]h$]h&]uh1j1hj^wubj)}(hnum_clksh]hnum_clks}(hj~whhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^wubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubj)}(hstruct clk_bulk_data *clksh](j)}(hjAh]hstruct}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjwmodnameN classnameNj] j` )}jc ]j*wc.devm_clk_bulk_get_optionalasbuh1hhjwubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwubj)}(hjh]h*}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hclksh]hclks}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjvubeh}(h]h ]h"]h$]h&]jjuh1jhjvhhhjvhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjvhhhjvhMubah}(h]jvah ](jjeh"]h$]h&]jj)jhuh1jhjvhMhjvhhubj)}(hhh]h)}(h-managed get multiple optional consumer clocksh]h-managed get multiple optional consumer clocks}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjxhhubah}(h]h ]h"]h$]h&]uh1jhjvhhhjvhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj0xjj0xjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``int num_clks`` the number of clk_bulk_data ``struct clk_bulk_data *clks`` pointer to the clk_bulk_data table of consumer **Description** Behaves the same as devm_clk_bulk_get() except where there is no clock producer. In this case, instead of returning -ENOENT, the function returns NULL for given clk. It is assumed all clocks in clk_bulk_data are optional. Returns 0 if all clocks specified in clk_bulk_data table are obtained successfully or for any clk there was no clk provider available, otherwise returns valid IS_ERR() condition containing errno. The implementation uses **dev** and **clk_bulk_data.id** to determine the clock consumer, and thereby the clock producer. The clock returned is stored in each **clk_bulk_data.clk** field. Drivers must assume that the clock source is not enabled. clk_bulk_get should not be called from within interrupt context.h](h)}(h**Parameters**h]j)}(hj:xh]h Parameters}(hjah"]h$]h&]uh1j1hjyhhhjyhMubj{)}(h!devm_clk_bulk_get_optional_enableh]j)}(h!devm_clk_bulk_get_optional_enableh]h!devm_clk_bulk_get_optional_enable}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjyhhhjyhMubj)}(h>(struct device *dev, int num_clks, struct clk_bulk_data *clks)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyubh)}(hhh]j)}(hdeviceh]hdevice}(hj zhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj zmodnameN classnameNj] j` )}jc ]jf )}jY jysb#c.devm_clk_bulk_get_optional_enableasbuh1hhjyubj2)}(h h]h }(hj)zhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyubj)}(hjh]h*}(hj7zhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(hdevh]hdev}(hjDzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubj)}(h int num_clksh](j )}(hinth]hint}(hj]zhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjYzubj2)}(h h]h }(hjkzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYzubj)}(hnum_clksh]hnum_clks}(hjyzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYzubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubj)}(hstruct clk_bulk_data *clksh](j)}(hjAh]hstruct}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjzubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjzmodnameN classnameNj] j` )}jc ]j%z#c.devm_clk_bulk_get_optional_enableasbuh1hhjzubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjzubj)}(hjh]h*}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubj)}(hclksh]hclks}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubeh}(h]h ]h"]h$]h&]jjuh1jhjyhhhjyhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjyhhhjyhMubah}(h]jyah ](jjeh"]h$]h&]jj)jhuh1jhjyhMhjyhhubj)}(hhh]h)}(h-Get and enable optional bulk clocks (managed)h]h-Get and enable optional bulk clocks (managed)}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj{hhubah}(h]h ]h"]h$]h&]uh1jhjyhhhjyhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+{jj+{jjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``int num_clks`` the number of clk_bulk_data ``struct clk_bulk_data *clks`` pointer to the clk_bulk_data table of consumer **Description** Behaves the same as devm_clk_bulk_get_optional() but also prepares and enables the clocks in one operation with management. The clks will automatically be disabled, unprepared and freed when the device is unbound. **Return** 0 if all clocks specified in clk_bulk_data table are obtained and enabled successfully, or for any clk there was no clk provider available. Otherwise returns valid IS_ERR() condition containing errno.h](h)}(h**Parameters**h]j)}(hj5{h]h Parameters}(hj7{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3{ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj/{ubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjT{h]hstruct device *dev}(hjV{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR{ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjN{ubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjm{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhji{hMhjj{ubah}(h]h ]h"]h$]h&]uh1j1hjN{ubeh}(h]h ]h"]h$]h&]uh1jhji{hMhjK{ubj)}(h-``int num_clks`` the number of clk_bulk_data h](j)}(h``int num_clks``h]j)}(hj{h]h int num_clks}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj{ubj2)}(hhh]h)}(hthe number of clk_bulk_datah]hthe number of clk_bulk_data}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMhj{ubah}(h]h ]h"]h$]h&]uh1j1hj{ubeh}(h]h ]h"]h$]h&]uh1jhj{hMhjK{ubj)}(hN``struct clk_bulk_data *clks`` pointer to the clk_bulk_data table of consumer h](j)}(h``struct clk_bulk_data *clks``h]j)}(hj{h]hstruct clk_bulk_data *clks}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj{ubj2)}(hhh]h)}(h.pointer to the clk_bulk_data table of consumerh]h.pointer to the clk_bulk_data table of consumer}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMhj{ubah}(h]h ]h"]h$]h&]uh1j1hj{ubeh}(h]h ]h"]h$]h&]uh1jhj{hMhjK{ubeh}(h]h ]h"]h$]h&]uh1j hj/{ubh)}(h**Description**h]j)}(hj|h]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj/{ubh)}(hBehaves the same as devm_clk_bulk_get_optional() but also prepares and enables the clocks in one operation with management. The clks will automatically be disabled, unprepared and freed when the device is unbound.h]hBehaves the same as devm_clk_bulk_get_optional() but also prepares and enables the clocks in one operation with management. The clks will automatically be disabled, unprepared and freed when the device is unbound.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj/{ubh)}(h **Return**h]j)}(hj(|h]hReturn}(hj*|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&|ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj/{ubh)}(h0 if all clocks specified in clk_bulk_data table are obtained and enabled successfully, or for any clk there was no clk provider available. Otherwise returns valid IS_ERR() condition containing errno.h]h0 if all clocks specified in clk_bulk_data table are obtained and enabled successfully, or for any clk there was no clk provider available. Otherwise returns valid IS_ERR() condition containing errno.}(hj>|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj/{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "devm_clk_bulk_get_all (C function)c.devm_clk_bulk_get_allhNtauh1hhjChhhNhNubj)}(hhh](j)}(hKint devm_clk_bulk_get_all (struct device *dev, struct clk_bulk_data **clks)h]j)}(hJint devm_clk_bulk_get_all(struct device *dev, struct clk_bulk_data **clks)h](j )}(hinth]hint}(hjm|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhji|hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM ubj2)}(h h]h }(hj||hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hji|hhhj{|hM ubj{)}(hdevm_clk_bulk_get_allh]j)}(hdevm_clk_bulk_get_allh]hdevm_clk_bulk_get_all}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhji|hhhj{|hM ubj)}(h1(struct device *dev, struct clk_bulk_data **clks)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|ubh)}(hhh]j)}(hdeviceh]hdevice}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj|modnameN classnameNj] j` )}jc ]jf )}jY j|sbc.devm_clk_bulk_get_allasbuh1hhj|ubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|ubj)}(hjh]h*}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hdevh]hdev}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|ubj)}(hstruct clk_bulk_data **clksh](j)}(hjAh]hstruct}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hj)}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hj:}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7}ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj<}modnameN classnameNj] j` )}jc ]j|c.devm_clk_bulk_get_allasbuh1hhj}ubj2)}(h h]h }(hjX}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj)}(hjh]h*}(hjf}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj)}(hjh]h*}(hjs}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj)}(hclksh]hclks}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj|ubeh}(h]h ]h"]h$]h&]jjuh1jhji|hhhj{|hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhje|hhhj{|hM ubah}(h]j`|ah ](jjeh"]h$]h&]jj)jhuh1jhj{|hM hjb|hhubj)}(hhh]h)}(h"managed get multiple clk consumersh]h"managed get multiple clk consumers}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM hj}hhubah}(h]h ]h"]h$]h&]uh1jhjb|hhhj{|hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj}jj}jjjuh1jhhhjChNhNubj)}(hX!**Parameters** ``struct device *dev`` device for clock "consumer" ``struct clk_bulk_data **clks`` pointer to the clk_bulk_data table of consumer **Description** Returns a positive value for the number of clocks obtained while the clock references are stored in the clk_bulk_data table in **clks** field. Returns 0 if there're none and a negative value if something failed. This helper function allows drivers to get several clk consumers in one operation with management, the clks will automatically be freed when the device is unbound.h](h)}(h**Parameters**h]j)}(hj}h]h Parameters}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj}ubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hj}h]hstruct device *dev}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM hj}ubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hM hj~ubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhj~hM hj}ubj)}(hO``struct clk_bulk_data **clks`` pointer to the clk_bulk_data table of consumer h](j)}(h``struct clk_bulk_data **clks``h]j)}(hj$~h]hstruct clk_bulk_data **clks}(hj&~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"~ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM hj~ubj2)}(hhh]h)}(h.pointer to the clk_bulk_data table of consumerh]h.pointer to the clk_bulk_data table of consumer}(hj=~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9~hM hj:~ubah}(h]h ]h"]h$]h&]uh1j1hj~ubeh}(h]h ]h"]h$]h&]uh1jhj9~hM hj}ubeh}(h]h ]h"]h$]h&]uh1j hj}ubh)}(h**Description**h]j)}(hj_~h]h Description}(hja~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]~ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj}ubh)}(hReturns a positive value for the number of clocks obtained while the clock references are stored in the clk_bulk_data table in **clks** field. Returns 0 if there're none and a negative value if something failed.h](hReturns a positive value for the number of clocks obtained while the clock references are stored in the clk_bulk_data table in }(hju~hhhNhNubj)}(h**clks**h]hclks}(hj}~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju~ubhN field. Returns 0 if there’re none and a negative value if something failed.}(hju~hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM hj}ubh)}(hThis helper function allows drivers to get several clk consumers in one operation with management, the clks will automatically be freed when the device is unbound.h]hThis helper function allows drivers to get several clk consumers in one operation with management, the clks will automatically be freed when the device is unbound.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *devm_clk_bulk_get_all_enabled (C function)c.devm_clk_bulk_get_all_enabledhNtauh1hhjChhhNhNubj)}(hhh](j)}(hSint devm_clk_bulk_get_all_enabled (struct device *dev, struct clk_bulk_data **clks)h]j)}(hRint devm_clk_bulk_get_all_enabled(struct device *dev, struct clk_bulk_data **clks)h](j )}(hinth]hint}(hj~hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~hhhj~hMubj{)}(hdevm_clk_bulk_get_all_enabledh]j)}(hdevm_clk_bulk_get_all_enabledh]hdevm_clk_bulk_get_all_enabled}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj~hhhj~hMubj)}(h1(struct device *dev, struct clk_bulk_data **clks)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubh)}(hhh]j)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj"modnameN classnameNj] j` )}jc ]jf )}jY j~sbc.devm_clk_bulk_get_all_enabledasbuh1hhj~ubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj)}(hdevh]hdev}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~ubj)}(hstruct clk_bulk_data **clksh](j)}(hjAh]hstruct}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j<c.devm_clk_bulk_get_all_enabledasbuh1hhjpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj)}(hclksh]hclks}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~ubeh}(h]h ]h"]h$]h&]jjuh1jhj~hhhj~hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj~hhhj~hMubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhj~hMhj~hhubj)}(hhh]h)}(h3Get and enable all clocks of the consumer (managed)h]h3Get and enable all clocks of the consumer (managed)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhj~hhhj~hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hXD**Parameters** ``struct device *dev`` device for clock "consumer" ``struct clk_bulk_data **clks`` pointer to the clk_bulk_data table of consumer **Description** Returns a positive value for the number of clocks obtained while the clock references are stored in the clk_bulk_data table in **clks** field. Returns 0 if there're none and a negative value if something failed. This helper function allows drivers to get all clocks of the consumer and enables them in one operation with management. The clks will automatically be disabled and freed when the device is unbound.h](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjCh]hstruct device *dev}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj=ubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMhjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhMhj:ubj)}(hO``struct clk_bulk_data **clks`` pointer to the clk_bulk_data table of consumer h](j)}(h``struct clk_bulk_data **clks``h]j)}(hj|h]hstruct clk_bulk_data **clks}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjvubj2)}(hhh]h)}(h.pointer to the clk_bulk_data table of consumerh]h.pointer to the clk_bulk_data table of consumer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhMhj:ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hReturns a positive value for the number of clocks obtained while the clock references are stored in the clk_bulk_data table in **clks** field. Returns 0 if there're none and a negative value if something failed.h](hReturns a positive value for the number of clocks obtained while the clock references are stored in the clk_bulk_data table in }(hj̀hhhNhNubj)}(h**clks**h]hclks}(hjՀhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̀ubhN field. Returns 0 if there’re none and a negative value if something failed.}(hj̀hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hThis helper function allows drivers to get all clocks of the consumer and enables them in one operation with management. The clks will automatically be disabled and freed when the device is unbound.h]hThis helper function allows drivers to get all clocks of the consumer and enables them in one operation with management. The clks will automatically be disabled and freed when the device is unbound.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM"hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j devm_clk_get (C function)c.devm_clk_gethNtauh1hhjChhhNhNubj)}(hhh](j)}(h>struct clk * devm_clk_get (struct device *dev, const char *id)h]j)}(hah"]h$]h&]uh1j1hjhhhj*hM-ubh)}(hhh]j)}(hclkh]hclk}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj>modnameN classnameNj] j` )}jc ]jf )}jY devm_clk_getsbc.devm_clk_getasbuh1hhjhhhj*hM-ubj2)}(h h]h }(hj]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj*hM-ubj)}(hjh]h*}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj*hM-ubj{)}(h devm_clk_geth]j)}(hjZh]h devm_clk_get}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj*hM-ubj)}(h$(struct device *dev, const char *id)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jXc.devm_clk_getasbuh1hhjubj2)}(h h]h }(hjӁhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *idh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj"hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj0hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidh]hid}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj*hM-ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj*hM-ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj*hM-hjhhubj)}(hhh]h)}(h:lookup and obtain a managed reference to a clock producer.h]h:lookup and obtain a managed reference to a clock producer.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM-hjrhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj*hM-ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hX|**Parameters** ``struct device *dev`` device for clock "consumer" ``const char *id`` clock consumer ID **Context** May sleep. **Return** a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. (IOW, **id** may be identical strings, but clk_get may return different clock producers depending on **dev**.) **Description** Drivers must assume that the clock source is neither prepared nor enabled. The clock will automatically be freed when the device is unbound from the bus.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM1hjubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM.hjubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjςhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj˂hM.hĵubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj˂hM.hjubj)}(h%``const char *id`` clock consumer ID h](j)}(h``const char *id``h]j)}(hjh]hconst char *id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM/hjubj2)}(hhh]h)}(hclock consumer IDh]hclock consumer ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM/hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM/hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Context**h]j)}(hj*h]hContext}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM1hjubh)}(h May sleep.h]h May sleep.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM1hjubh)}(h **Return**h]j)}(hjQh]hReturn}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM3hjubh)}(hX<a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. (IOW, **id** may be identical strings, but clk_get may return different clock producers depending on **dev**.)h](hya struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses }(hjghhhNhNubj)}(h**dev**h]hdev}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubh and }(hjghhhNhNubj)}(h**id**h]hid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubhI to determine the clock consumer, and thereby the clock producer. (IOW, }(hjghhhNhNubj)}(h**id**h]hid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubhY may be identical strings, but clk_get may return different clock producers depending on }(hjghhhNhNubj)}(h**dev**h]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubh.)}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM3hjubh)}(h**Description**h]j)}(hjh]h Description}(hjƒhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM9hjubh)}(hJDrivers must assume that the clock source is neither prepared nor enabled.h]hJDrivers must assume that the clock source is neither prepared nor enabled.}(hjփhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM8hjubh)}(hNThe clock will automatically be freed when the device is unbound from the bus.h]hNThe clock will automatically be freed when the device is unbound from the bus.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM;hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "devm_clk_get_prepared (C function)c.devm_clk_get_preparedhNtauh1hhjChhhNhNubj)}(hhh](j)}(hGstruct clk * devm_clk_get_prepared (struct device *dev, const char *id)h]j)}(hEstruct clk *devm_clk_get_prepared(struct device *dev, const char *id)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMBubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj!hMBubh)}(hhh]j)}(hclkh]hclk}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj5modnameN classnameNj] j` )}jc ]jf )}jY devm_clk_get_preparedsbc.devm_clk_get_preparedasbuh1hhjhhhj!hMBubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj!hMBubj)}(hjh]h*}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj!hMBubj{)}(hdevm_clk_get_preparedh]j)}(hjQh]hdevm_clk_get_prepared}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj!hMBubj)}(h$(struct device *dev, const char *id)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jOc.devm_clk_get_preparedasbuh1hhjubj2)}(h h]h }(hjʄhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj؄hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *idh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidh]hid}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj!hMBubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj!hMBubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj!hMBhj hhubj)}(hhh]h)}(hdevm_clk_get() + clk_prepare()h]hdevm_clk_get() + clk_prepare()}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMBhjihhubah}(h]h ]h"]h$]h&]uh1jhj hhhj!hMBubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``const char *id`` clock consumer ID **Context** May sleep. **Return** a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. (IOW, **id** may be identical strings, but clk_get may return different clock producers depending on **dev**.) **Description** The returned clk (if valid) is prepared. Drivers must however assume that the clock is not enabled. The clock will automatically be unprepared and freed when the device is unbound from the bus.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMFhjubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMChjubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjƅhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj…hMChjÅubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj…hMChjubj)}(h%``const char *id`` clock consumer ID h](j)}(h``const char *id``h]j)}(hjh]hconst char *id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMDhjubj2)}(hhh]h)}(hclock consumer IDh]hclock consumer ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMDhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMDhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Context**h]j)}(hj!h]hContext}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMFhjubh)}(h May sleep.h]h May sleep.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMFhjubh)}(h **Return**h]j)}(hjHh]hReturn}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMHhjubh)}(hX<a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. (IOW, **id** may be identical strings, but clk_get may return different clock producers depending on **dev**.)h](hya struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses }(hj^hhhNhNubj)}(h**dev**h]hdev}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubh and }(hj^hhhNhNubj)}(h**id**h]hid}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubhI to determine the clock consumer, and thereby the clock producer. (IOW, }(hj^hhhNhNubj)}(h**id**h]hid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubhY may be identical strings, but clk_get may return different clock producers depending on }(hj^hhhNhNubj)}(h**dev**h]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubh.)}(hj^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMHhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMNhjubh)}(hcThe returned clk (if valid) is prepared. Drivers must however assume that the clock is not enabled.h]hcThe returned clk (if valid) is prepared. Drivers must however assume that the clock is not enabled.}(hj͆hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMMhjubh)}(h]The clock will automatically be unprepared and freed when the device is unbound from the bus.h]h]The clock will automatically be unprepared and freed when the device is unbound from the bus.}(hj܆hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMPhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !devm_clk_get_enabled (C function)c.devm_clk_get_enabledhNtauh1hhjChhhNhNubj)}(hhh](j)}(hFstruct clk * devm_clk_get_enabled (struct device *dev, const char *id)h]j)}(hDstruct clk *devm_clk_get_enabled(struct device *dev, const char *id)h](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMWubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMWubh)}(hhh]j)}(hclkh]hclk}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj,modnameN classnameNj] j` )}jc ]jf )}jY devm_clk_get_enabledsbc.devm_clk_get_enabledasbuh1hhjhhhjhMWubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMWubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMWubj{)}(hdevm_clk_get_enabledh]j)}(hjHh]hdevm_clk_get_enabled}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMWubj)}(h$(struct device *dev, const char *id)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jFc.devm_clk_get_enabledasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjχhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdevh]hdev}(hj܇hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj}ubj)}(hconst char *idh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidh]hid}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj}ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMWubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMWubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMWhjhhubj)}(hhh]h)}(h%devm_clk_get() + clk_prepare_enable()h]h%devm_clk_get() + clk_prepare_enable()}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMWhj`hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMWubeh}(h]h ](jfunctioneh"]h$]h&]jjjj{jj{jjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``const char *id`` clock consumer ID **Context** May sleep. **Return** a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. (IOW, **id** may be identical strings, but clk_get may return different clock producers depending on **dev**.) **Description** The returned clk (if valid) is prepared and enabled. The clock will automatically be disabled, unprepared and freed when the device is unbound from the bus.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM[hjubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMXhjubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMXhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMXhjubj)}(h%``const char *id`` clock consumer ID h](j)}(h``const char *id``h]j)}(hj݈h]hconst char *id}(hj߈hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjۈubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMYhj׈ubj2)}(hhh]h)}(hclock consumer IDh]hclock consumer ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMYhjubah}(h]h ]h"]h$]h&]uh1j1hj׈ubeh}(h]h ]h"]h$]h&]uh1jhjhMYhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM[hjubh)}(h May sleep.h]h May sleep.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM[hjubh)}(h **Return**h]j)}(hj?h]hReturn}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM]hjubh)}(hX<a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. (IOW, **id** may be identical strings, but clk_get may return different clock producers depending on **dev**.)h](hya struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses }(hjUhhhNhNubj)}(h**dev**h]hdev}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh and }(hjUhhhNhNubj)}(h**id**h]hid}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubhI to determine the clock consumer, and thereby the clock producer. (IOW, }(hjUhhhNhNubj)}(h**id**h]hid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubhY may be identical strings, but clk_get may return different clock producers depending on }(hjUhhhNhNubj)}(h**dev**h]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh.)}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM]hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMchjubh)}(h4The returned clk (if valid) is prepared and enabled.h]h4The returned clk (if valid) is prepared and enabled.}(hjĉhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMbhjubh)}(hgThe clock will automatically be disabled, unprepared and freed when the device is unbound from the bus.h]hgThe clock will automatically be disabled, unprepared and freed when the device is unbound from the bus.}(hjӉhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMdhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "devm_clk_get_optional (C function)c.devm_clk_get_optionalhNtauh1hhjChhhNhNubj)}(hhh](j)}(hGstruct clk * devm_clk_get_optional (struct device *dev, const char *id)h]j)}(hEstruct clk *devm_clk_get_optional(struct device *dev, const char *id)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMkubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMkubh)}(hhh]j)}(hclkh]hclk}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj#modnameN classnameNj] j` )}jc ]jf )}jY devm_clk_get_optionalsbc.devm_clk_get_optionalasbuh1hhjhhhjhMkubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMkubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMkubj{)}(hdevm_clk_get_optionalh]j)}(hj?h]hdevm_clk_get_optional}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMkubj)}(h$(struct device *dev, const char *id)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j=c.devm_clk_get_optionalasbuh1hhjxubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubj)}(hjh]h*}(hjƊhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(hdevh]hdev}(hjӊhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubj)}(hconst char *idh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidh]hid}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMkubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMkubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMkhjhhubj)}(hhh]h)}(hDlookup and obtain a managed reference to an optional clock producer.h]hDlookup and obtain a managed reference to an optional clock producer.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMkhjWhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMkubeh}(h]h ](jfunctioneh"]h$]h&]jjjjrjjrjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``const char *id`` clock consumer ID **Context** May sleep. **Return** a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That's the only difference compared to devm_clk_get(). **Description** Drivers must assume that the clock source is neither prepared nor enabled. The clock will automatically be freed when the device is unbound from the bus.h](h)}(h**Parameters**h]j)}(hj|h]h Parameters}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMohjvubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMmhjubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMmhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMmhjubj)}(h%``const char *id`` clock consumer ID h](j)}(h``const char *id``h]j)}(hjԋh]hconst char *id}(hj֋hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjҋubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMnhj΋ubj2)}(hhh]h)}(hclock consumer IDh]hclock consumer ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMnhjubah}(h]h ]h"]h$]h&]uh1j1hj΋ubeh}(h]h ]h"]h$]h&]uh1jhjhMnhjubeh}(h]h ]h"]h$]h&]uh1j hjvubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMphjvubh)}(h May sleep.h]h May sleep.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMphjvubh)}(h **Return**h]j)}(hj6h]hReturn}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMrhjvubh)}(hXKa struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That's the only difference compared to devm_clk_get().h](hya struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses }(hjLhhhNhNubj)}(h**dev**h]hdev}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh and }(hjLhhhNhNubj)}(h**id**h]hid}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That’s the only difference compared to devm_clk_get().}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMrhjvubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMyhjvubh)}(hJDrivers must assume that the clock source is neither prepared nor enabled.h]hJDrivers must assume that the clock source is neither prepared nor enabled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMxhjvubh)}(hNThe clock will automatically be freed when the device is unbound from the bus.h]hNThe clock will automatically be freed when the device is unbound from the bus.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM{hjvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j +devm_clk_get_optional_prepared (C function) c.devm_clk_get_optional_preparedhNtauh1hhjChhhNhNubj)}(hhh](j)}(hPstruct clk * devm_clk_get_optional_prepared (struct device *dev, const char *id)h]j)}(hNstruct clk *devm_clk_get_optional_prepared(struct device *dev, const char *id)h](j)}(hjAh]hstruct}(hjՌhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjьhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjьhhhjhMubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY devm_clk_get_optional_preparedsb c.devm_clk_get_optional_preparedasbuh1hhjьhhhjhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjьhhhjhMubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjьhhhjhMubj{)}(hdevm_clk_get_optional_preparedh]j)}(hjh]hdevm_clk_get_optional_prepared}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjьhhhjhMubj)}(h$(struct device *dev, const char *id)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubh)}(hhh]j)}(hdeviceh]hdevice}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjomodnameN classnameNj] j` )}jc ]j c.devm_clk_get_optional_preparedasbuh1hhjKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjGubj)}(hconst char *idh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj̍hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjڍhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidh]hid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjGubeh}(h]h ]h"]h$]h&]jjuh1jhjьhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj͌hhhjhMubah}(h]jȌah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjʌhhubj)}(hhh]h)}(h'devm_clk_get_optional() + clk_prepare()h]h'devm_clk_get_optional() + clk_prepare()}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj*hhubah}(h]h ]h"]h$]h&]uh1jhjʌhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjEjjEjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``const char *id`` clock consumer ID **Context** May sleep. **Return** a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That's the only difference compared to devm_clk_get_prepared(). **Description** The returned clk (if valid) is prepared. Drivers must however assume that the clock is not enabled. The clock will automatically be unprepared and freed when the device is unbound from the bus.h](h)}(h**Parameters**h]j)}(hjOh]h Parameters}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjIubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjnh]hstruct device *dev}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhjhMhjeubj)}(h%``const char *id`` clock consumer ID h](j)}(h``const char *id``h]j)}(hjh]hconst char *id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(hclock consumer IDh]hclock consumer ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjeubeh}(h]h ]h"]h$]h&]uh1j hjIubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjIubh)}(h May sleep.h]h May sleep.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjIubh)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjIubh)}(hXTa struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That's the only difference compared to devm_clk_get_prepared().h](hya struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses }(hjhhhNhNubj)}(h**dev**h]hdev}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**id**h]hid}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That’s the only difference compared to devm_clk_get_prepared().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjIubh)}(h**Description**h]j)}(hjTh]h Description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjIubh)}(hcThe returned clk (if valid) is prepared. Drivers must however assume that the clock is not enabled.h]hcThe returned clk (if valid) is prepared. Drivers must however assume that the clock is not enabled.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjIubh)}(h]The clock will automatically be unprepared and freed when the device is unbound from the bus.h]h]The clock will automatically be unprepared and freed when the device is unbound from the bus.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjIubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *devm_clk_get_optional_enabled (C function)c.devm_clk_get_optional_enabledhNtauh1hhjChhhNhNubj)}(hhh](j)}(hOstruct clk * devm_clk_get_optional_enabled (struct device *dev, const char *id)h]j)}(hMstruct clk *devm_clk_get_optional_enabled(struct device *dev, const char *id)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubh)}(hhh]j)}(hclkh]hclk}(hjǏhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjďubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjɏmodnameN classnameNj] j` )}jc ]jf )}jY devm_clk_get_optional_enabledsbc.devm_clk_get_optional_enabledasbuh1hhjhhhjhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj{)}(hdevm_clk_get_optional_enabledh]j)}(hjh]hdevm_clk_get_optional_enabled}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h$(struct device *dev, const char *id)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdeviceh]hdevice}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjBmodnameN classnameNj] j` )}jc ]jc.devm_clk_get_optional_enabledasbuh1hhjubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdevh]hdev}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *idh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjɐhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidh]hid}(hj֐hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h.devm_clk_get_optional() + clk_prepare_enable()h]h.devm_clk_get_optional() + clk_prepare_enable()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``const char *id`` clock consumer ID **Context** May sleep. **Return** a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That's the only difference compared to devm_clk_get_enabled(). **Description** The returned clk (if valid) is prepared and enabled. The clock will automatically be disabled, unprepared and freed when the device is unbound from the bus.h](h)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjAh]hstruct device *dev}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj;ubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjWubah}(h]h ]h"]h$]h&]uh1j1hj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhMhj8ubj)}(h%``const char *id`` clock consumer ID h](j)}(h``const char *id``h]j)}(hjzh]hconst char *id}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjtubj2)}(hhh]h)}(hclock consumer IDh]hclock consumer ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjtubeh}(h]h ]h"]h$]h&]uh1jhjhMhj8ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h May sleep.h]h May sleep.}(hjˑhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h **Return**h]j)}(hjܑh]hReturn}(hjޑhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjڑubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hXSa struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That's the only difference compared to devm_clk_get_enabled().h](hya struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses }(hjhhhNhNubj)}(h**dev**h]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**id**h]hid}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That’s the only difference compared to devm_clk_get_enabled().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h**Description**h]j)}(hj'h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h4The returned clk (if valid) is prepared and enabled.h]h4The returned clk (if valid) is prepared and enabled.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hgThe clock will automatically be disabled, unprepared and freed when the device is unbound from the bus.h]hgThe clock will automatically be disabled, unprepared and freed when the device is unbound from the bus.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 4devm_clk_get_optional_enabled_with_rate (C function))c.devm_clk_get_optional_enabled_with_ratehNtauh1hhjChhhNhNubj)}(hhh](j)}(hmstruct clk * devm_clk_get_optional_enabled_with_rate (struct device *dev, const char *id, unsigned long rate)h]j)}(hkstruct clk *devm_clk_get_optional_enabled_with_rate(struct device *dev, const char *id, unsigned long rate)h](j)}(hjAh]hstruct}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwhhhjhMubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY 'devm_clk_get_optional_enabled_with_ratesb)c.devm_clk_get_optional_enabled_with_rateasbuh1hhjwhhhjhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjwhhhjhMubj)}(hjh]h*}(hjɒhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwhhhjhMubj{)}(h'devm_clk_get_optional_enabled_with_rateh]j)}(hjh]h'devm_clk_get_optional_enabled_with_rate}(hjڒhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֒ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjwhhhjhMubj)}(h8(struct device *dev, const char *id, unsigned long rate)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j)c.devm_clk_get_optional_enabled_with_rateasbuh1hhjubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdevh]hdev}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *idh](j)}(hjh]hconst}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj)}(hidh]hid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long rateh](j )}(hunsignedh]hunsigned}(hj“hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjГhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjޓhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hrateh]hrate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjwhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjshhhjhMubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjphhubj)}(hhh]h)}(h?devm_clk_get_optional() + clk_set_rate() + clk_prepare_enable()h]h?devm_clk_get_optional() + clk_set_rate() + clk_prepare_enable()}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj!hhubah}(h]h ]h"]h$]h&]uh1jhjphhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj<jj<jjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``const char *id`` clock consumer ID ``unsigned long rate`` new clock rate **Context** May sleep. **Return** a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That's the only difference compared to devm_clk_get_enabled(). **Description** The returned clk (if valid) is prepared and enabled and rate was set. The clock will automatically be disabled, unprepared and freed when the device is unbound from the bus.h](h)}(h**Parameters**h]j)}(hjFh]h Parameters}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj@ubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjeh]hstruct device *dev}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj_ubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhMhj{ubah}(h]h ]h"]h$]h&]uh1j1hj_ubeh}(h]h ]h"]h$]h&]uh1jhjzhMhj\ubj)}(h%``const char *id`` clock consumer ID h](j)}(h``const char *id``h]j)}(hjh]hconst char *id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(hclock consumer IDh]hclock consumer ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj\ubj)}(h&``unsigned long rate`` new clock rate h](j)}(h``unsigned long rate``h]j)}(hjהh]hunsigned long rate}(hjٔhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjՔubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjєubj2)}(hhh]h)}(hnew clock rateh]hnew clock rate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjєubeh}(h]h ]h"]h$]h&]uh1jhjhMhj\ubeh}(h]h ]h"]h$]h&]uh1j hj@ubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj@ubh)}(h May sleep.h]h May sleep.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj@ubh)}(h **Return**h]j)}(hj9h]hReturn}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj@ubh)}(hXSa struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev** and **id** to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That's the only difference compared to devm_clk_get_enabled().h](hya struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses }(hjOhhhNhNubj)}(h**dev**h]hdev}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh and }(hjOhhhNhNubj)}(h**id**h]hid}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh to determine the clock consumer, and thereby the clock producer. If no such clk is found, it returns NULL which serves as a dummy clk. That’s the only difference compared to devm_clk_get_enabled().}(hjOhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj@ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj@ubh)}(hEThe returned clk (if valid) is prepared and enabled and rate was set.h]hEThe returned clk (if valid) is prepared and enabled and rate was set.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj@ubh)}(hgThe clock will automatically be disabled, unprepared and freed when the device is unbound from the bus.h]hgThe clock will automatically be disabled, unprepared and freed when the device is unbound from the bus.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $devm_get_clk_from_child (C function)c.devm_get_clk_from_childhNtauh1hhjChhhNhNubj)}(hhh](j)}(hestruct clk * devm_get_clk_from_child (struct device *dev, struct device_node *np, const char *con_id)h]j)}(hcstruct clk *devm_get_clk_from_child(struct device *dev, struct device_node *np, const char *con_id)h](j)}(hjAh]hstruct}(hjؕhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԕhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjԕhhhjhMubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY devm_get_clk_from_childsbc.devm_get_clk_from_childasbuh1hhjԕhhhjhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjԕhhhjhMubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԕhhhjhMubj{)}(hdevm_get_clk_from_childh]j)}(hjh]hdevm_get_clk_from_child}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjԕhhhjhMubj)}(h@(struct device *dev, struct device_node *np, const char *con_id)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj2)}(h h]h }(hj_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubh)}(hhh]j)}(hdeviceh]hdevice}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjrmodnameN classnameNj] j` )}jc ]jc.devm_get_clk_from_childasbuh1hhjNubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubj)}(hstruct device_node *nph](j)}(hjAh]hstruct}(hj–hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjϖhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h device_nodeh]h device_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjݖubah}(h]h ]h"]h$]h&] refdomainj2reftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.devm_get_clk_from_childasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnph]hnp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubj)}(hconst char *con_idh](j)}(hjh]hconst}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj )}(hcharh]hchar}(hjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.ubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.ubj)}(hjh]h*}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hcon_idh]hcon_id}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjJubeh}(h]h ]h"]h$]h&]jjuh1jhjԕhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjЕhhhjhMubah}(h]j˕ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhj͕hhubj)}(hhh]h)}(hJlookup and obtain a managed reference to a clock producer from child node.h]hJlookup and obtain a managed reference to a clock producer from child node.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhj͕hhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct device *dev`` device for clock "consumer" ``struct device_node *np`` pointer to clock consumer node ``const char *con_id`` clock consumer ID **Description** This function parses the clocks, and uses them to look up the struct clk from the registered list of clock providers by using **np** and **con_id** The clock will automatically be freed when the device is unbound from the bus.h](h)}(h**Parameters**h]j)}(hj—h]h Parameters}(hjėhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj )}(hhh](j)}(h3``struct device *dev`` device for clock "consumer" h](j)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjߗubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjۗubj2)}(hhh]h)}(hdevice for clock "consumer"h]hdevice for clock “consumer”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjۗubeh}(h]h ]h"]h$]h&]uh1jhjhMhjؗubj)}(h:``struct device_node *np`` pointer to clock consumer node h](j)}(h``struct device_node *np``h]j)}(hjh]hstruct device_node *np}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(hpointer to clock consumer nodeh]hpointer to clock consumer node}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hMhj0ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj/hMhjؗubj)}(h)``const char *con_id`` clock consumer ID h](j)}(h``const char *con_id``h]j)}(hjSh]hconst char *con_id}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjMubj2)}(hhh]h)}(hclock consumer IDh]hclock consumer ID}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMhjiubah}(h]h ]h"]h$]h&]uh1j1hjMubeh}(h]h ]h"]h$]h&]uh1jhjhhMhjؗubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hThis function parses the clocks, and uses them to look up the struct clk from the registered list of clock providers by using **np** and **con_id**h](h~This function parses the clocks, and uses them to look up the struct clk from the registered list of clock providers by using }(hjhhhNhNubj)}(h**np**h]hnp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h **con_id**h]hcon_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hNThe clock will automatically be freed when the device is unbound from the bus.h]hNThe clock will automatically be freed when the device is unbound from the bus.}(hjӘhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_enable (C function) c.clk_enablehNtauh1hhjChhhNhNubj)}(hhh](j)}(h int clk_enable (struct clk *clk)h]j)}(hint clk_enable(struct clk *clk)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(h clk_enableh]j)}(h clk_enableh]h clk_enable}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;ubh)}(hhh]j)}(hclkh]hclk}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj_modnameN classnameNj] j` )}jc ]jf )}jY j%sb c.clk_enableasbuh1hhj;ubj2)}(h h]h }(hj}hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj7ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h:inform the system when the clock source should be running.h]h:inform the system when the clock source should be running.}(hj™hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjڙjjڙjjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock source **Description** If the clock can not be enabled/disabled, this should return success. May be called from atomic contexts. Returns success (0) or negative errno.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjޙubj )}(hhh]j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjh]hstruct clk *clk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjޙubh)}(h**Description**h]j)}(hj>h]h Description}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjޙubh)}(hEIf the clock can not be enabled/disabled, this should return success.h]hEIf the clock can not be enabled/disabled, this should return success.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjޙubh)}(h#May be called from atomic contexts.h]h#May be called from atomic contexts.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjޙubh)}(h&Returns success (0) or negative errno.h]h&Returns success (0) or negative errno.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjޙubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_bulk_enable (C function)c.clk_bulk_enablehNtauh1hhjChhhNhNubj)}(hhh](j)}(hDint clk_bulk_enable (int num_clks, const struct clk_bulk_data *clks)h]j)}(hCint clk_bulk_enable(int num_clks, const struct clk_bulk_data *clks)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hclk_bulk_enableh]j)}(hclk_bulk_enableh]hclk_bulk_enable}(hjšhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h0(int num_clks, const struct clk_bulk_data *clks)h](j)}(h int num_clksh](j )}(hinth]hint}(hjޚhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjښubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjښubj)}(hnum_clksh]hnum_clks}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjښubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj֚ubj)}(h const struct clk_bulk_data *clksh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjNmodnameN classnameNj] j` )}jc ]jf )}jY jĚsbc.clk_bulk_enableasbuh1hhjubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hclksh]hclks}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj֚ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h9inform the system when the set of clks should be running.h]h9inform the system when the set of clks should be running.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjɛjjɛjjjuh1jhhhjChNhNubj)}(h**Parameters** ``int num_clks`` the number of clk_bulk_data ``const struct clk_bulk_data *clks`` the clk_bulk_data table of consumer **Description** May be called from atomic contexts. Returns success (0) or negative errno.h](h)}(h**Parameters**h]j)}(hjӛh]h Parameters}(hj՛hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjћubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj͛ubj )}(hhh](j)}(h-``int num_clks`` the number of clk_bulk_data h](j)}(h``int num_clks``h]j)}(hjh]h int num_clks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(hthe number of clk_bulk_datah]hthe number of clk_bulk_data}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hI``const struct clk_bulk_data *clks`` the clk_bulk_data table of consumer h](j)}(h$``const struct clk_bulk_data *clks``h]j)}(hj+h]h const struct clk_bulk_data *clks}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj%ubj2)}(hhh]h)}(h#the clk_bulk_data table of consumerh]h#the clk_bulk_data table of consumer}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhjAubah}(h]h ]h"]h$]h&]uh1j1hj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhjubeh}(h]h ]h"]h$]h&]uh1j hj͛ubh)}(h**Description**h]j)}(hjfh]h Description}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj͛ubh)}(h#May be called from atomic contexts.h]h#May be called from atomic contexts.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj͛ubh)}(h&Returns success (0) or negative errno.h]h&Returns success (0) or negative errno.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj͛ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_disable (C function) c.clk_disablehNtauh1hhjChhhNhNubj)}(hhh](j)}(h"void clk_disable (struct clk *clk)h]j)}(h!void clk_disable(struct clk *clk)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjɜhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjȜhMubj{)}(h clk_disableh]j)}(h clk_disableh]h clk_disable}(hjۜhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjלubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjȜhMubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jݜsb c.clk_disableasbuh1hhjubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hclkh]hclk}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjȜhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjȜhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjȜhMhjhhubj)}(hhh]h)}(h>inform the system when the clock source is no longer required.h]h>inform the system when the clock source is no longer required.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjwhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjȜhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct clk *clk`` clock source **Description** Inform the system that a clock source is no longer required by a driver and may be shut down. May be called from atomic contexts. Implementation detail: if the clock source is shared between multiple drivers, clk_enable() calls must be balanced by the same number of clk_disable() calls for the clock source to be disabled.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj )}(hhh]j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjh]hstruct clk *clk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjԝhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjНhMhjѝubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjНhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h]Inform the system that a clock source is no longer required by a driver and may be shut down.h]h]Inform the system that a clock source is no longer required by a driver and may be shut down.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h#May be called from atomic contexts.h]h#May be called from atomic contexts.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hImplementation detail: if the clock source is shared between multiple drivers, clk_enable() calls must be balanced by the same number of clk_disable() calls for the clock source to be disabled.h]hImplementation detail: if the clock source is shared between multiple drivers, clk_enable() calls must be balanced by the same number of clk_disable() calls for the clock source to be disabled.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_bulk_disable (C function)c.clk_bulk_disablehNtauh1hhjChhhNhNubj)}(hhh](j)}(hFvoid clk_bulk_disable (int num_clks, const struct clk_bulk_data *clks)h]j)}(hEvoid clk_bulk_disable(int num_clks, const struct clk_bulk_data *clks)h](j )}(hvoidh]hvoid}(hjYhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUhhhjghMubj{)}(hclk_bulk_disableh]j)}(hclk_bulk_disableh]hclk_bulk_disable}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjUhhhjghMubj)}(h0(int num_clks, const struct clk_bulk_data *clks)h](j)}(h int num_clksh](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnum_clksh]hnum_clks}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(h const struct clk_bulk_data *clksh](j)}(hjh]hconst}(hj˞hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǞubj2)}(h h]h }(hj؞hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjǞubj)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǞubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjǞubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j|sbc.clk_bulk_disableasbuh1hhjǞubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjǞubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǞubj)}(hclksh]hclks}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǞubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjUhhhjghMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjQhhhjghMubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1jhjghMhjNhhubj)}(hhh]h)}(h=inform the system when the set of clks is no longer required.h]h=inform the system when the set of clks is no longer required.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjfhhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjghMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``int num_clks`` the number of clk_bulk_data ``const struct clk_bulk_data *clks`` the clk_bulk_data table of consumer **Description** Inform the system that a set of clks is no longer required by a driver and may be shut down. May be called from atomic contexts. Implementation detail: if the set of clks is shared between multiple drivers, clk_bulk_enable() calls must be balanced by the same number of clk_bulk_disable() calls for the clock source to be disabled.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj )}(hhh](j)}(h-``int num_clks`` the number of clk_bulk_data h](j)}(h``int num_clks``h]j)}(hjh]h int num_clks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(hthe number of clk_bulk_datah]hthe number of clk_bulk_data}(hjßhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hI``const struct clk_bulk_data *clks`` the clk_bulk_data table of consumer h](j)}(h$``const struct clk_bulk_data *clks``h]j)}(hjh]h const struct clk_bulk_data *clks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjݟubj2)}(hhh]h)}(h#the clk_bulk_data table of consumerh]h#the clk_bulk_data table of consumer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjݟubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h\Inform the system that a set of clks is no longer required by a driver and may be shut down.h]h\Inform the system that a set of clks is no longer required by a driver and may be shut down.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h#May be called from atomic contexts.h]h#May be called from atomic contexts.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hImplementation detail: if the set of clks is shared between multiple drivers, clk_bulk_enable() calls must be balanced by the same number of clk_bulk_disable() calls for the clock source to be disabled.h]hImplementation detail: if the set of clks is shared between multiple drivers, clk_bulk_enable() calls must be balanced by the same number of clk_bulk_disable() calls for the clock source to be disabled.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_get_rate (C function)c.clk_get_ratehNtauh1hhjChhhNhNubj)}(hhh](j)}(h,unsigned long clk_get_rate (struct clk *clk)h]j)}(h+unsigned long clk_get_rate(struct clk *clk)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}hhhjhMubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj}hhhjhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}hhhjhMubj{)}(h clk_get_rateh]j)}(h clk_get_rateh]h clk_get_rate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj}hhhjhMubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjڠhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֠ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj֠ubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.clk_get_rateasbuh1hhj֠ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj֠ubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֠ubj)}(hclkh]hclk}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֠ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjҠubah}(h]h ]h"]h$]h&]jjuh1jhj}hhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjyhhhjhMubah}(h]jtah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjvhhubj)}(hhh]h)}(htobtain the current clock rate (in Hz) for a clock source. This is only valid once the clock source has been enabled.h]htobtain the current clock rate (in Hz) for a clock source. This is only valid once the clock source has been enabled.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjZhhubah}(h]h ]h"]h$]h&]uh1jhjvhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjujjujjjuh1jhhhjChNhNubj)}(h2**Parameters** ``struct clk *clk`` clock sourceh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjyubj )}(hhh]j)}(h ``struct clk *clk`` clock sourceh](j)}(h``struct clk *clk``h]j)}(hjh]hstruct clk *clk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjyubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_put (C function) c.clk_puthNtauh1hhjChhhNhNubj)}(hhh](j)}(hvoid clk_put (struct clk *clk)h]j)}(hvoid clk_put(struct clk *clk)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hclk_puth]j)}(hclk_puth]hclk_put}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1ubh)}(hhh]j)}(hclkh]hclk}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjUmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.clk_putasbuh1hhj1ubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj-ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h"free" the clock sourceh]h“free” the clock source}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjТjjТjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct clk *clk`` clock source **Note** drivers must ensure that all clk_enable calls made on this clock source are balanced by clk_disable calls prior to calling this function. clk_put should not be called from within interrupt context.h](h)}(h**Parameters**h]j)}(hjڢh]h Parameters}(hjܢhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjآubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjԢubj )}(hhh]j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjh]hstruct clk *clk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjԢubh)}(h**Note**h]j)}(hj4h]hNote}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjԢubh)}(hdrivers must ensure that all clk_enable calls made on this clock source are balanced by clk_disable calls prior to calling this function.h]hdrivers must ensure that all clk_enable calls made on this clock source are balanced by clk_disable calls prior to calling this function.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjԢubh)}(h;clk_put should not be called from within interrupt context.h]h;clk_put should not be called from within interrupt context.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM!hjԢubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_bulk_put (C function)c.clk_bulk_puthNtauh1hhjChhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjhhhjhM&ubj{)}(h clk_bulk_puth]j)}(h clk_bulk_puth]h clk_bulk_put}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM&ubj)}(h*(int num_clks, struct clk_bulk_data *clks)h](j)}(h int num_clksh](j )}(hinth]hint}(hjţhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjӣhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnum_clksh]hnum_clks}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct clk_bulk_data *clksh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.clk_bulk_putasbuh1hhjubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hclksh]hclks}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM&ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM&ubah}(h]j{ah ](jjeh"]h$]h&]jj)jhuh1jhjhM&hj}hhubj)}(hhh]h)}(h"free" the clock sourceh]h“free” the clock source}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM&hjzhhubah}(h]h ]h"]h$]h&]uh1jhj}hhhjhM&ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hXe**Parameters** ``int num_clks`` the number of clk_bulk_data ``struct clk_bulk_data *clks`` the clk_bulk_data table of consumer **Note** drivers must ensure that all clk_bulk_enable calls made on this clock source are balanced by clk_bulk_disable calls prior to calling this function. clk_bulk_put should not be called from within interrupt context.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM*hjubj )}(hhh](j)}(h-``int num_clks`` the number of clk_bulk_data h](j)}(h``int num_clks``h]j)}(hjh]h int num_clks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM'hjubj2)}(hhh]h)}(hthe number of clk_bulk_datah]hthe number of clk_bulk_data}(hjפhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjӤhM'hjԤubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjӤhM'hjubj)}(hC``struct clk_bulk_data *clks`` the clk_bulk_data table of consumer h](j)}(h``struct clk_bulk_data *clks``h]j)}(hjh]hstruct clk_bulk_data *clks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM(hjubj2)}(hhh]h)}(h#the clk_bulk_data table of consumerh]h#the clk_bulk_data table of consumer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM(hj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hM(hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Note**h]j)}(hj2h]hNote}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM*hjubh)}(hdrivers must ensure that all clk_bulk_enable calls made on this clock source are balanced by clk_bulk_disable calls prior to calling this function.h]hdrivers must ensure that all clk_bulk_enable calls made on this clock source are balanced by clk_bulk_disable calls prior to calling this function.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM*hjubh)}(h@clk_bulk_put should not be called from within interrupt context.h]h@clk_bulk_put should not be called from within interrupt context.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM.hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_bulk_put_all (C function)c.clk_bulk_put_allhNtauh1hhjChhhNhNubj)}(hhh](j)}(h@void clk_bulk_put_all (int num_clks, struct clk_bulk_data *clks)h]j)}(h?void clk_bulk_put_all(int num_clks, struct clk_bulk_data *clks)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM3ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM3ubj{)}(hclk_bulk_put_allh]j)}(hclk_bulk_put_allh]hclk_bulk_put_all}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM3ubj)}(h*(int num_clks, struct clk_bulk_data *clks)h](j)}(h int num_clksh](j )}(hinth]hint}(hjåhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjѥhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hnum_clksh]hnum_clks}(hjߥhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct clk_bulk_data *clksh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h clk_bulk_datah]h clk_bulk_data}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.clk_bulk_put_allasbuh1hhjubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hclksh]hclks}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM3ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj~hhhjhM3ubah}(h]jyah ](jjeh"]h$]h&]jj)jhuh1jhjhM3hj{hhubj)}(hhh]h)}(h"free" all the clock sourceh]h“free” all the clock source}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM3hjxhhubah}(h]h ]h"]h$]h&]uh1jhj{hhhjhM3ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hXi**Parameters** ``int num_clks`` the number of clk_bulk_data ``struct clk_bulk_data *clks`` the clk_bulk_data table of consumer **Note** drivers must ensure that all clk_bulk_enable calls made on this clock source are balanced by clk_bulk_disable calls prior to calling this function. clk_bulk_put_all should not be called from within interrupt context.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM7hjubj )}(hhh](j)}(h-``int num_clks`` the number of clk_bulk_data h](j)}(h``int num_clks``h]j)}(hjh]h int num_clks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM4hjubj2)}(hhh]h)}(hthe number of clk_bulk_datah]hthe number of clk_bulk_data}(hjզhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjѦhM4hjҦubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjѦhM4hjubj)}(hC``struct clk_bulk_data *clks`` the clk_bulk_data table of consumer h](j)}(h``struct clk_bulk_data *clks``h]j)}(hjh]hstruct clk_bulk_data *clks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM5hjubj2)}(hhh]h)}(h#the clk_bulk_data table of consumerh]h#the clk_bulk_data table of consumer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM5hj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hM5hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Note**h]j)}(hj0h]hNote}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM7hjubh)}(hdrivers must ensure that all clk_bulk_enable calls made on this clock source are balanced by clk_bulk_disable calls prior to calling this function.h]hdrivers must ensure that all clk_bulk_enable calls made on this clock source are balanced by clk_bulk_disable calls prior to calling this function.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM7hjubh)}(hDclk_bulk_put_all should not be called from within interrupt context.h]hDclk_bulk_put_all should not be called from within interrupt context.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM;hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j devm_clk_put (C function)c.devm_clk_puthNtauh1hhjChhhNhNubj)}(hhh](j)}(h7void devm_clk_put (struct device *dev, struct clk *clk)h]j)}(h6void devm_clk_put(struct device *dev, struct clk *clk)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM@ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM@ubj{)}(h devm_clk_puth]j)}(h devm_clk_puth]h devm_clk_put}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM@ubj)}(h%(struct device *dev, struct clk *clk)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjΧhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdeviceh]hdevice}(hjߧhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjܧubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.devm_clk_putasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubh)}(hhh]j)}(hclkh]hclk}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjSmodnameN classnameNj] j` )}jc ]jc.devm_clk_putasbuh1hhj/ubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM@ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj|hhhjhM@ubah}(h]jwah ](jjeh"]h$]h&]jj)jhuh1jhjhM@hjyhhubj)}(hhh]h)}(h"free" a managed clock sourceh]h!“free” a managed clock source}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM@hjhhubah}(h]h ]h"]h$]h&]uh1jhjyhhhjhM@ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj̨jj̨jjjuh1jhhhjChNhNubj)}(hX\**Parameters** ``struct device *dev`` device used to acquire the clock ``struct clk *clk`` clock source acquired with devm_clk_get() **Note** drivers must ensure that all clk_enable calls made on this clock source are balanced by clk_disable calls prior to calling this function. clk_put should not be called from within interrupt context.h](h)}(h**Parameters**h]j)}(hj֨h]h Parameters}(hjبhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԨubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMDhjШubj )}(hhh](j)}(h8``struct device *dev`` device used to acquire the clock h](j)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMAhjubj2)}(hhh]h)}(h device used to acquire the clockh]h device used to acquire the clock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMAhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMAhjubj)}(h>``struct clk *clk`` clock source acquired with devm_clk_get() h](j)}(h``struct clk *clk``h]j)}(hj.h]hstruct clk *clk}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMBhj(ubj2)}(hhh]h)}(h)clock source acquired with devm_clk_get()h]h)clock source acquired with devm_clk_get()}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMBhjDubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhjChMBhjubeh}(h]h ]h"]h$]h&]uh1j hjШubh)}(h**Note**h]j)}(hjih]hNote}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMDhjШubh)}(hdrivers must ensure that all clk_enable calls made on this clock source are balanced by clk_disable calls prior to calling this function.h]hdrivers must ensure that all clk_enable calls made on this clock source are balanced by clk_disable calls prior to calling this function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMDhjШubh)}(h;clk_put should not be called from within interrupt context.h]h;clk_put should not be called from within interrupt context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMHhjШubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_round_rate (C function)c.clk_round_ratehNtauh1hhjChhhNhNubj)}(hhh](j)}(h9long clk_round_rate (struct clk *clk, unsigned long rate)h]j)}(h8long clk_round_rate(struct clk *clk, unsigned long rate)h](j )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMRubj2)}(h h]h }(hj̩hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj˩hMRubj{)}(hclk_round_rateh]j)}(hclk_round_rateh]hclk_round_rate}(hjީhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjکubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj˩hMRubj)}(h%(struct clk *clk, unsigned long rate)h](j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.clk_round_rateasbuh1hhjubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hclkh]hclk}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long rateh](j )}(hunsignedh]hunsigned}(hjlhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhubj)}(hrateh]hrate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj˩hMRubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj˩hMRubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj˩hMRhjhhubj)}(hhh]h)}(h3adjust a rate to the exact rate a clock can provideh]h3adjust a rate to the exact rate a clock can provide}(hjΪhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMRhj˪hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj˩hMRubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct clk *clk`` clock source ``unsigned long rate`` desired clock rate in Hz **Description** This answers the question "if I were to pass **rate** to clk_set_rate(), what clock rate would I end up with?" without changing the hardware in any way. In other words: rate = clk_round_rate(clk, r); and: clk_set_rate(clk, r); rate = clk_get_rate(clk); are equivalent except the former does not modify the clock hardware in any way. Returns rounded clock rate in Hz, or negative errno.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMVhjubj )}(hhh](j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjh]hstruct clk *clk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMShj ubj2)}(hhh]h)}(h clock sourceh]h clock source}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMShj%ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj$hMShjubj)}(h0``unsigned long rate`` desired clock rate in Hz h](j)}(h``unsigned long rate``h]j)}(hjHh]hunsigned long rate}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMThjBubj2)}(hhh]h)}(hdesired clock rate in Hzh]hdesired clock rate in Hz}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hMThj^ubah}(h]h ]h"]h$]h&]uh1j1hjBubeh}(h]h ]h"]h$]h&]uh1jhj]hMThjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMVhjubh)}(hThis answers the question "if I were to pass **rate** to clk_set_rate(), what clock rate would I end up with?" without changing the hardware in any way. In other words:h](h/This answers the question “if I were to pass }(hjhhhNhNubj)}(h**rate**h]hrate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhv to clk_set_rate(), what clock rate would I end up with?” without changing the hardware in any way. In other words:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMUhjubj)}(hrate = clk_round_rate(clk, r); h]h)}(hrate = clk_round_rate(clk, r);h]hrate = clk_round_rate(clk, r);}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMYhjubah}(h]h ]h"]h$]h&]uh1jhj̫hMYhjubh)}(hand:h]hand:}(hjӫhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM[hjubj)}(h0clk_set_rate(clk, r); rate = clk_get_rate(clk); h]h)}(h/clk_set_rate(clk, r); rate = clk_get_rate(clk);h]h/clk_set_rate(clk, r); rate = clk_get_rate(clk);}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM]hjubah}(h]h ]h"]h$]h&]uh1jhjhM]hjubh)}(hOare equivalent except the former does not modify the clock hardware in any way.h]hOare equivalent except the former does not modify the clock hardware in any way.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM`hjubh)}(h4Returns rounded clock rate in Hz, or negative errno.h]h4Returns rounded clock rate in Hz, or negative errno.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMchjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_set_rate (C function)c.clk_set_ratehNtauh1hhjChhhNhNubj)}(hhh](j)}(h6int clk_set_rate (struct clk *clk, unsigned long rate)h]j)}(h5int clk_set_rate(struct clk *clk, unsigned long rate)h](j )}(hinth]hint}(hj9hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj5hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMiubj2)}(h h]h }(hjHhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5hhhjGhMiubj{)}(h clk_set_rateh]j)}(h clk_set_rateh]h clk_set_rate}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj5hhhjGhMiubj)}(h%(struct clk *clk, unsigned long rate)h](j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j\sbc.clk_set_rateasbuh1hhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hjh]h*}(hj¬hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hclkh]hclk}(hjϬhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnubj)}(hunsigned long rateh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hrateh]hrate}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjnubeh}(h]h ]h"]h$]h&]jjuh1jhj5hhhjGhMiubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj1hhhjGhMiubah}(h]j,ah ](jjeh"]h$]h&]jj)jhuh1jhjGhMihj.hhubj)}(hhh]h)}(h%set the clock rate for a clock sourceh]h%set the clock rate for a clock source}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMihjGhhubah}(h]h ]h"]h$]h&]uh1jhj.hhhjGhMiubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbjjbjjjuh1jhhhjChNhNubj)}(hX"**Parameters** ``struct clk *clk`` clock source ``unsigned long rate`` desired clock rate in Hz **Description** Updating the rate starts at the top-most affected clock and then walks the tree down to the bottom-most clock that needs updating. Returns success (0) or negative errno.h](h)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMmhjfubj )}(hhh](j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjh]hstruct clk *clk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMjhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMjhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMjhjubj)}(h0``unsigned long rate`` desired clock rate in Hz h](j)}(h``unsigned long rate``h]j)}(hjĭh]hunsigned long rate}(hjƭhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj­ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMkhjubj2)}(hhh]h)}(hdesired clock rate in Hzh]hdesired clock rate in Hz}(hjݭhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj٭hMkhjڭubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj٭hMkhjubeh}(h]h ]h"]h$]h&]uh1j hjfubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMmhjfubh)}(hUpdating the rate starts at the top-most affected clock and then walks the tree down to the bottom-most clock that needs updating.h]hUpdating the rate starts at the top-most affected clock and then walks the tree down to the bottom-most clock that needs updating.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMlhjfubh)}(h&Returns success (0) or negative errno.h]h&Returns success (0) or negative errno.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMohjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #clk_set_rate_exclusive (C function)c.clk_set_rate_exclusivehNtauh1hhjChhhNhNubj)}(hhh](j)}(h@int clk_set_rate_exclusive (struct clk *clk, unsigned long rate)h]j)}(h?int clk_set_rate_exclusive(struct clk *clk, unsigned long rate)h](j )}(hinth]hint}(hjShhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjOhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMuubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOhhhjahMuubj{)}(hclk_set_rate_exclusiveh]j)}(hclk_set_rate_exclusiveh]hclk_set_rate_exclusive}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjOhhhjahMuubj)}(h%(struct clk *clk, unsigned long rate)h](j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jvsbc.clk_set_rate_exclusiveasbuh1hhjubj2)}(h h]h }(hjήhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjܮhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long rateh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hrateh]hrate}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjOhhhjahMuubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjKhhhjahMuubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhjahMuhjHhhubj)}(hhh]h)}(h:set the clock rate and claim exclusivity over clock sourceh]h:set the clock rate and claim exclusivity over clock source}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMuhjahhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjahMuubeh}(h]h ](jfunctioneh"]h$]h&]jjjj|jj|jjjuh1jhhhjChNhNubj)}(hX**Parameters** ``struct clk *clk`` clock source ``unsigned long rate`` desired clock rate in Hz **Description** This helper function allows drivers to atomically set the rate of a producer and claim exclusivity over the rate control of the producer. It is essentially a combination of clk_set_rate() and clk_rate_exclusite_get(). Caller must balance this call with a call to clk_rate_exclusive_put() Returns success (0) or negative errno.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMyhjubj )}(hhh](j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjh]hstruct clk *clk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMwhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMwhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMwhjubj)}(h0``unsigned long rate`` desired clock rate in Hz h](j)}(h``unsigned long rate``h]j)}(hjޯh]hunsigned long rate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjܯubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMxhjدubj2)}(hhh]h)}(hdesired clock rate in Hzh]hdesired clock rate in Hz}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMxhjubah}(h]h ]h"]h$]h&]uh1j1hjدubeh}(h]h ]h"]h$]h&]uh1jhjhMxhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMzhjubh)}(hThis helper function allows drivers to atomically set the rate of a producer and claim exclusivity over the rate control of the producer.h]hThis helper function allows drivers to atomically set the rate of a producer and claim exclusivity over the rate control of the producer.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMyhjubh)}(hIt is essentially a combination of clk_set_rate() and clk_rate_exclusite_get(). Caller must balance this call with a call to clk_rate_exclusive_put()h]hIt is essentially a combination of clk_set_rate() and clk_rate_exclusite_get(). Caller must balance this call with a call to clk_rate_exclusive_put()}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhM|hjubh)}(h&Returns success (0) or negative errno.h]h&Returns success (0) or negative errno.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_has_parent (C function)c.clk_has_parenthNtauh1hhjChhhNhNubj)}(hhh](j)}(hEbool clk_has_parent (const struct clk *clk, const struct clk *parent)h]j)}(hDbool clk_has_parent(const struct clk *clk, const struct clk *parent)h](j )}(hj8h]hbool}(hj|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjxhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxhhhjhMubj{)}(hclk_has_parenth]j)}(hclk_has_parenth]hclk_has_parent}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjxhhhjhMubj)}(h1(const struct clk *clk, const struct clk *parent)h](j)}(hconst struct clk *clkh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjŰhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjAh]hstruct}(hjӰhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.clk_has_parentasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hclkh]hclk}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst struct clk *parenth](j)}(hjh]hconst}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubj)}(hjAh]hstruct}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubh)}(hhh]j)}(hclkh]hclk}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.clk_has_parentasbuh1hhjAubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjAubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(hparenth]hparent}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjxhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjthhhjhMubah}(h]joah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjqhhubj)}(hhh]h)}(h1check if a clock is a possible parent for anotherh]h1check if a clock is a possible parent for another}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjޱhhubah}(h]h ]h"]h$]h&]uh1jhjqhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hXU**Parameters** ``const struct clk *clk`` clock source ``const struct clk *parent`` parent clock source **Description** This function can be used in drivers that need to check that a clock can be the parent of another without actually changing the parent. Returns true if **parent** is a possible parent for **clk**, false otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj )}(hhh](j)}(h'``const struct clk *clk`` clock source h](j)}(h``const struct clk *clk``h]j)}(hj"h]hconst struct clk *clk}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMhj8ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj7hMhjubj)}(h1``const struct clk *parent`` parent clock source h](j)}(h``const struct clk *parent``h]j)}(hj[h]hconst struct clk *parent}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjUubj2)}(hhh]h)}(hparent clock sourceh]hparent clock source}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphMhjqubah}(h]h ]h"]h$]h&]uh1j1hjUubeh}(h]h ]h"]h$]h&]uh1jhjphMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hThis function can be used in drivers that need to check that a clock can be the parent of another without actually changing the parent.h]hThis function can be used in drivers that need to check that a clock can be the parent of another without actually changing the parent.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hMReturns true if **parent** is a possible parent for **clk**, false otherwise.h](hReturns true if }(hjhhhNhNubj)}(h **parent**h]hparent}(hjòhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is a possible parent for }(hjhhhNhNubj)}(h**clk**h]hclk}(hjղhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, false otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_set_rate_range (C function)c.clk_set_rate_rangehNtauh1hhjChhhNhNubj)}(hhh](j)}(hNint clk_set_rate_range (struct clk *clk, unsigned long min, unsigned long max)h]j)}(hMint clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhMubj{)}(hclk_set_rate_rangeh]j)}(hclk_set_rate_rangeh]hclk_set_rate_range}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhMubj)}(h7(struct clk *clk, unsigned long min, unsigned long max)h](j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj2)}(h h]h }(hjXhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubh)}(hhh]j)}(hclkh]hclk}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjkmodnameN classnameNj] j` )}jc ]jf )}jY j1sbc.clk_set_rate_rangeasbuh1hhjGubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubj)}(hunsigned long minh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hj˳hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjٳhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hminh]hmin}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubj)}(hunsigned long maxh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hlongh]hlong}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hmaxh]hmax}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h#set a rate range for a clock sourceh]h#set a rate range for a clock source}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjmhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock source ``unsigned long min`` desired minimum clock rate in Hz, inclusive ``unsigned long max`` desired maximum clock rate in Hz, inclusive **Description** Returns success (0) or negative errno.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj )}(hhh](j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjh]hstruct clk *clk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjʴhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjƴhMhjǴubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjƴhMhjubj)}(hB``unsigned long min`` desired minimum clock rate in Hz, inclusive h](j)}(h``unsigned long min``h]j)}(hjh]hunsigned long min}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h+desired minimum clock rate in Hz, inclusiveh]h+desired minimum clock rate in Hz, inclusive}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hB``unsigned long max`` desired maximum clock rate in Hz, inclusive h](j)}(h``unsigned long max``h]j)}(hj#h]hunsigned long max}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h+desired maximum clock rate in Hz, inclusiveh]h+desired maximum clock rate in Hz, inclusive}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj9ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj8hMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj^h]h Description}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h&Returns success (0) or negative errno.h]h&Returns success (0) or negative errno.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_set_min_rate (C function)c.clk_set_min_ratehNtauh1hhjChhhNhNubj)}(hhh](j)}(h:int clk_set_min_rate (struct clk *clk, unsigned long rate)h]j)}(h9int clk_set_min_rate(struct clk *clk, unsigned long rate)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hclk_set_min_rateh]j)}(hclk_set_min_rateh]hclk_set_min_rate}(hjĵhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h%(struct clk *clk, unsigned long rate)h](j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjܵubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjܵubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jƵsbc.clk_set_min_rateasbuh1hhjܵubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjܵubj)}(hjh]h*}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjܵubj)}(hclkh]hclk}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjܵubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjصubj)}(hunsigned long rateh](j )}(hunsignedh]hunsigned}(hjRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjNubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj )}(hlongh]hlong}(hjnhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjNubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj)}(hrateh]hrate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjصubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h+set a minimum clock rate for a clock sourceh]h+set a minimum clock rate for a clock source}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj̶jj̶jjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock source ``unsigned long rate`` desired minimum clock rate in Hz, inclusive **Description** Returns success (0) or negative errno.h](h)}(h**Parameters**h]j)}(hjֶh]h Parameters}(hjضhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԶubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjжubj )}(hhh](j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjh]hstruct clk *clk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubj)}(hC``unsigned long rate`` desired minimum clock rate in Hz, inclusive h](j)}(h``unsigned long rate``h]j)}(hj.h]hunsigned long rate}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj(ubj2)}(hhh]h)}(h+desired minimum clock rate in Hz, inclusiveh]h+desired minimum clock rate in Hz, inclusive}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMhjDubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhjChMhjubeh}(h]h ]h"]h$]h&]uh1j hjжubh)}(h**Description**h]j)}(hjih]h Description}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjжubh)}(h&Returns success (0) or negative errno.h]h&Returns success (0) or negative errno.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjжubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_set_max_rate (C function)c.clk_set_max_ratehNtauh1hhjChhhNhNubj)}(hhh](j)}(h:int clk_set_max_rate (struct clk *clk, unsigned long rate)h]j)}(h9int clk_set_max_rate(struct clk *clk, unsigned long rate)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hclk_set_max_rateh]j)}(hclk_set_max_rateh]hclk_set_max_rate}(hjϷhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj˷ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h%(struct clk *clk, unsigned long rate)h](j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hclkh]hclk}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY jѷsbc.clk_set_max_rateasbuh1hhjubj2)}(h h]h }(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hclkh]hclk}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned long rateh](j )}(hunsignedh]hunsigned}(hj]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjYubj2)}(h h]h }(hjkhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj )}(hlongh]hlong}(hjyhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjYubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj)}(hrateh]hrate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h+set a maximum clock rate for a clock sourceh]h+set a maximum clock rate for a clock source}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj׸jj׸jjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock source ``unsigned long rate`` desired maximum clock rate in Hz, inclusive **Description** Returns success (0) or negative errno.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj߸ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj۸ubj )}(hhh](j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjh]hstruct clk *clk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hC``unsigned long rate`` desired maximum clock rate in Hz, inclusive h](j)}(h``unsigned long rate``h]j)}(hj9h]hunsigned long rate}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj3ubj2)}(hhh]h)}(h+desired maximum clock rate in Hz, inclusiveh]h+desired maximum clock rate in Hz, inclusive}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMhjOubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhjNhMhjubeh}(h]h ]h"]h$]h&]uh1j hj۸ubh)}(h**Description**h]j)}(hjth]h Description}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj۸ubh)}(h&Returns success (0) or negative errno.h]h&Returns success (0) or negative errno.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj۸ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_set_parent (C function)c.clk_set_parenthNtauh1hhjChhhNhNubj)}(hhh](j)}(h8int clk_set_parent (struct clk *clk, struct clk *parent)h]j)}(h7int clk_set_parent(struct clk *clk, struct clk *parent)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjȹhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjǹhMubj{)}(hclk_set_parenth]j)}(hclk_set_parenth]hclk_set_parent}(hjڹhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjֹubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjǹhMubj)}(h%(struct clk *clk, struct clk *parent)h](j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jܹsbc.clk_set_parentasbuh1hhjubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hclkh]hclk}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct clk *parenth](j)}(hjAh]hstruct}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j0c.clk_set_parentasbuh1hhjdubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hparenth]hparent}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjǹhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjǹhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjǹhMhjhhubj)}(hhh]h)}(h*set the parent clock source for this clockh]h*set the parent clock source for this clock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjǹhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock source ``struct clk *parent`` parent clock source **Description** Returns success (0) or negative errno.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj )}(hhh](j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hj*h]hstruct clk *clk}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj$ubj2)}(hhh]h)}(h clock sourceh]h clock source}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMhj@ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj?hMhj!ubj)}(h+``struct clk *parent`` parent clock source h](j)}(h``struct clk *parent``h]j)}(hjch]hstruct clk *parent}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhj]ubj2)}(hhh]h)}(hparent clock sourceh]hparent clock source}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhMhjyubah}(h]h ]h"]h$]h&]uh1j1hj]ubeh}(h]h ]h"]h$]h&]uh1jhjxhMhj!ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h&Returns success (0) or negative errno.h]h&Returns success (0) or negative errno.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_get_parent (C function)c.clk_get_parenthNtauh1hhjChhhNhNubj)}(hhh](j)}(h-struct clk * clk_get_parent (struct clk *clk)h]j)}(h+struct clk *clk_get_parent(struct clk *clk)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj߻hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj߻hhhjhMubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY clk_get_parentsbc.clk_get_parentasbuh1hhj߻hhhjhMubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj߻hhhjhMubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj߻hhhjhMubj{)}(hclk_get_parenth]j)}(hj h]hclk_get_parent}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj߻hhhjhMubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubh)}(hhh]j)}(hclkh]hclk}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj}modnameN classnameNj] j` )}jc ]jc.clk_get_parentasbuh1hhjYubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubah}(h]h ]h"]h$]h&]jjuh1jhj߻hhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjۻhhhjhMubah}(h]jֻah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjػhhubj)}(hhh]h)}(h*get the parent clock source for this clockh]h*get the parent clock source for this clock}(hj޼hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjۼhhubah}(h]h ]h"]h$]h&]uh1jhjػhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(h**Parameters** ``struct clk *clk`` clock source **Description** Returns struct clk corresponding to parent clock source, or valid IS_ERR() condition containing errno.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj )}(hhh]j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hjh]hstruct clk *clk}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hMhj5ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj4hMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjZh]h Description}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hfReturns struct clk corresponding to parent clock source, or valid IS_ERR() condition containing errno.h]hfReturns struct clk corresponding to parent clock source, or valid IS_ERR() condition containing errno.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_get_sys (C function) c.clk_get_syshNtauh1hhjChhhNhNubj)}(hhh](j)}(hAstruct clk * clk_get_sys (const char *dev_id, const char *con_id)h]j)}(h?struct clk *clk_get_sys(const char *dev_id, const char *con_id)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY clk_get_syssb c.clk_get_sysasbuh1hhjhhhjhMubj2)}(h h]h }(hj߽hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj{)}(h clk_get_sysh]j)}(hjܽh]h clk_get_sys}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h((const char *dev_id, const char *con_id)h](j)}(hconst char *dev_idh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hj4hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdev_idh]hdev_id}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *con_idh](j)}(hjh]hconst}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hcon_idh]hcon_id}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h&get a clock based upon the device nameh]h&get a clock based upon the device name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hX4**Parameters** ``const char *dev_id`` device name ``const char *con_id`` connection ID **Description** Returns a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev_id** and **con_id** to determine the clock consumer, and thereby the clock producer. In contrast to clk_get() this function takes the device name instead of the device itself for identification. Drivers must assume that the clock source is not enabled. clk_get_sys should not be called from within interrupt context.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj )}(hhh](j)}(h#``const char *dev_id`` device name h](j)}(h``const char *dev_id``h]j)}(hj%h]hconst char *dev_id}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h device nameh]h device name}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hMhj;ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj:hMhjubj)}(h%``const char *con_id`` connection ID h](j)}(h``const char *con_id``h]j)}(hj^h]hconst char *con_id}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjXubj2)}(hhh]h)}(h connection IDh]h connection ID}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshMhjtubah}(h]h ]h"]h$]h&]uh1j1hjXubeh}(h]h ]h"]h$]h&]uh1jhjshMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(hXIReturns a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses **dev_id** and **con_id** to determine the clock consumer, and thereby the clock producer. In contrast to clk_get() this function takes the device name instead of the device itself for identification.h](hReturns a struct clk corresponding to the clock producer, or valid IS_ERR() condition containing errno. The implementation uses }(hjhhhNhNubj)}(h **dev_id**h]hdev_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h **con_id**h]hcon_id}(hjɿhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to determine the clock consumer, and thereby the clock producer. In contrast to clk_get() this function takes the device name instead of the device itself for identification.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h9Drivers must assume that the clock source is not enabled.h]h9Drivers must assume that the clock source is not enabled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h?clk_get_sys should not be called from within interrupt context.h]h?clk_get_sys should not be called from within interrupt context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_drop_range (C function)c.clk_drop_rangehNtauh1hhjChhhNhNubj)}(hhh](j)}(h$int clk_drop_range (struct clk *clk)h]j)}(h#int clk_drop_range(struct clk *clk)h](j )}(hinth]hint}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj.hMubj{)}(hclk_drop_rangeh]j)}(hclk_drop_rangeh]hclk_drop_range}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj.hMubj)}(h(struct clk *clk)h]j)}(hstruct clk *clkh](j)}(hjAh]hstruct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj2)}(h h]h }(hjjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubh)}(hhh]j)}(hclkh]hclk}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj}modnameN classnameNj] j` )}jc ]jf )}jY jCsbc.clk_drop_rangeasbuh1hhjYubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj.hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj.hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj.hMhjhhubj)}(hhh]h)}(h!Reset any range set on that clockh]h!Reset any range set on that clock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj.hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjChNhNubj)}(hk**Parameters** ``struct clk *clk`` clock source **Description** Returns success (0) or negative errno.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj )}(hhh]j)}(h!``struct clk *clk`` clock source h](j)}(h``struct clk *clk``h]j)}(hj!h]hstruct clk *clk}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubj2)}(hhh]h)}(h clock sourceh]h clock source}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj6hMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj\h]h Description}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubh)}(h&Returns success (0) or negative errno.h]h&Returns success (0) or negative errno.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjChhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j clk_get_optional (C function)c.clk_get_optionalhNtauh1hhjChhhNhNubj)}(hhh](j)}(hBstruct clk * clk_get_optional (struct device *dev, const char *id)h]j)}(h@struct clk *clk_get_optional(struct device *dev, const char *id)h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:390: ./include/linux/clk.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubh)}(hhh]j)}(hclkh]hclk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY clk_get_optionalsbc.clk_get_optionalasbuh1hhjhhhjhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj{)}(hclk_get_optionalh]j)}(hjh]hclk_get_optional}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h$(struct device *dev, const char *id)h](j)}(hstruct device *devh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hdeviceh]hdevice}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj;modnameN classnameNj] j` )}jc ]jc.clk_get_optionalasbuh1hhjubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdevh]hdev}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hconst char *idh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidh]hid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hah"]h$]h&]uh1j1hjhhhj*hK@ubj{)}(hsame_state_synchronize_rcuh]j)}(hsame_state_synchronize_rcuh]hsame_state_synchronize_rcu}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj*hK@ubj)}(h2(unsigned long oldstate1, unsigned long oldstate2)h](j)}(hunsigned long oldstate1h](j )}(hunsignedh]hunsigned}(hjYhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj )}(hlongh]hlong}(hjuhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj)}(h oldstate1h]h oldstate1}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubj)}(hunsigned long oldstate2h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h oldstate2h]h oldstate2}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj*hK@ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj*hK@ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj*hK@hjhhubj)}(hhh]h)}(h#Are two old-state values identical?h]h#Are two old-state values identical?}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhK@hj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj*hK@ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj$jj$jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``unsigned long oldstate1`` First old-state value. ``unsigned long oldstate2`` Second old-state value. **Description** The two old-state values must have been obtained from either get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or get_completed_synchronize_rcu(). Returns **true** if the two values are identical and **false** otherwise. This allows structures whose lifetimes are tracked by old-state values to push these values to a list header, allowing those structures to be slightly smaller.h](h)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKDhj(ubj )}(hhh](j)}(h3``unsigned long oldstate1`` First old-state value. h](j)}(h``unsigned long oldstate1``h]j)}(hjMh]hunsigned long oldstate1}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKAhjGubj2)}(hhh]h)}(hFirst old-state value.h]hFirst old-state value.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhKAhjcubah}(h]h ]h"]h$]h&]uh1j1hjGubeh}(h]h ]h"]h$]h&]uh1jhjbhKAhjDubj)}(h4``unsigned long oldstate2`` Second old-state value. h](j)}(h``unsigned long oldstate2``h]j)}(hjh]hunsigned long oldstate2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKBhjubj2)}(hhh]h)}(hSecond old-state value.h]hSecond old-state value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKBhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKBhjDubeh}(h]h ]h"]h$]h&]uh1j hj(ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKDhj(ubh)}(hXThe two old-state values must have been obtained from either get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or get_completed_synchronize_rcu(). Returns **true** if the two values are identical and **false** otherwise. This allows structures whose lifetimes are tracked by old-state values to push these values to a list header, allowing those structures to be slightly smaller.h](hThe two old-state values must have been obtained from either get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or get_completed_synchronize_rcu(). Returns }(hjhhhNhNubj)}(h**true**h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh% if the two values are identical and }(hjhhhNhNubj)}(h **false**h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh otherwise. This allows structures whose lifetimes are tracked by old-state values to push these values to a list header, allowing those structures to be slightly smaller.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKChj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #cond_resched_tasks_rcu_qs (C macro)c.cond_resched_tasks_rcu_qshNtauh1hhjhhhNhNubj)}(hhh](j)}(hcond_resched_tasks_rcu_qsh]j)}(hcond_resched_tasks_rcu_qsh]j{)}(hcond_resched_tasks_rcu_qsh]j)}(hj$h]hcond_resched_tasks_rcu_qs}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj&hhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhj"hhhjAhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjAhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjAhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjZjjZjjjuh1jhhhjhNhNubh)}(h ``cond_resched_tasks_rcu_qs ()``h]j)}(hj`h]hcond_resched_tasks_rcu_qs ()}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjhhubj)}(hX Report potential quiescent states to RCU **Description** This macro resembles cond_resched(), except that it is defined to report potential quiescent states to RCU-tasks even if the cond_resched() machinery were to be shut off, as some advocate for PREEMPTION kernels. h](j)}(h)Report potential quiescent states to RCU h]h)}(h(Report potential quiescent states to RCUh]h(Report potential quiescent states to RCU}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjzubah}(h]h ]h"]h$]h&]uh1jhjhKhjvubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjvubh)}(hThis macro resembles cond_resched(), except that it is defined to report potential quiescent states to RCU-tasks even if the cond_resched() machinery were to be shut off, as some advocate for PREEMPTION kernels.h]hThis macro resembles cond_resched(), except that it is defined to report potential quiescent states to RCU-tasks even if the cond_resched() machinery were to be shut off, as some advocate for PREEMPTION kernels.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjvubeh}(h]h ]h"]h$]h&]uh1jhjhKhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !rcu_softirq_qs_periodic (C macro)c.rcu_softirq_qs_periodichNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_softirq_qs_periodich]j)}(hrcu_softirq_qs_periodich]j{)}(hrcu_softirq_qs_periodich]j)}(hjh]hrcu_softirq_qs_periodic}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubh)}(h$``rcu_softirq_qs_periodic (old_ts)``h]j)}(hjh]h rcu_softirq_qs_periodic (old_ts)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjhhubj)}(h*Report RCU and RCU-Tasks quiescent states h]h)}(h)Report RCU and RCU-Tasks quiescent statesh]h)Report RCU and RCU-Tasks quiescent states}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhj%ubah}(h]h ]h"]h$]h&]uh1jhj7hKhjhhubj)}(hX**Parameters** ``old_ts`` jiffies at start of processing. **Description** This helper is for long-running softirq handlers, such as NAPI threads in networking. The caller should initialize the variable passed in as **old_ts** at the beginning of the softirq handler. When invoked frequently, this macro will invoke rcu_softirq_qs() every 100 milliseconds thereafter, which will provide both RCU and RCU-Tasks quiescent states. Note that this macro modifies its old_ts argument. Because regions of code that have disabled softirq act as RCU read-side critical sections, this macro should be invoked with softirq (and preemption) enabled. The macro is not needed when CONFIG_PREEMPT_RT is defined. RT kernels would have more chance to invoke schedule() calls and provide necessary quiescent states. As a contrast, calling cond_resched() only won't achieve the same effect because cond_resched() does not provide RCU-Tasks quiescent states.h](h)}(h**Parameters**h]j)}(hjDh]h Parameters}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhj>ubj )}(hhh]j)}(h+``old_ts`` jiffies at start of processing. h](j)}(h ``old_ts``h]j)}(hjch]hold_ts}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhj]ubj2)}(hhh]h)}(hjiffies at start of processing.h]hjiffies at start of processing.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhKhjyubah}(h]h ]h"]h$]h&]uh1j1hj]ubeh}(h]h ]h"]h$]h&]uh1jhjxhKhjZubah}(h]h ]h"]h$]h&]uh1j hj>ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhj>ubh)}(hXThis helper is for long-running softirq handlers, such as NAPI threads in networking. The caller should initialize the variable passed in as **old_ts** at the beginning of the softirq handler. When invoked frequently, this macro will invoke rcu_softirq_qs() every 100 milliseconds thereafter, which will provide both RCU and RCU-Tasks quiescent states. Note that this macro modifies its old_ts argument.h](hThis helper is for long-running softirq handlers, such as NAPI threads in networking. The caller should initialize the variable passed in as }(hjhhhNhNubj)}(h **old_ts**h]hold_ts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh at the beginning of the softirq handler. When invoked frequently, this macro will invoke rcu_softirq_qs() every 100 milliseconds thereafter, which will provide both RCU and RCU-Tasks quiescent states. Note that this macro modifies its old_ts argument.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhj>ubh)}(hBecause regions of code that have disabled softirq act as RCU read-side critical sections, this macro should be invoked with softirq (and preemption) enabled.h]hBecause regions of code that have disabled softirq act as RCU read-side critical sections, this macro should be invoked with softirq (and preemption) enabled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhj>ubh)}(hX,The macro is not needed when CONFIG_PREEMPT_RT is defined. RT kernels would have more chance to invoke schedule() calls and provide necessary quiescent states. As a contrast, calling cond_resched() only won't achieve the same effect because cond_resched() does not provide RCU-Tasks quiescent states.h]hX.The macro is not needed when CONFIG_PREEMPT_RT is defined. RT kernels would have more chance to invoke schedule() calls and provide necessary quiescent states. As a contrast, calling cond_resched() only won’t achieve the same effect because cond_resched() does not provide RCU-Tasks quiescent states.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j RCU_LOCKDEP_WARN (C macro)c.RCU_LOCKDEP_WARNhNtauh1hhjhhhNhNubj)}(hhh](j)}(hRCU_LOCKDEP_WARNh]j)}(hRCU_LOCKDEP_WARNh]j{)}(hRCU_LOCKDEP_WARNh]j)}(hj h]hRCU_LOCKDEP_WARN}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMcubah}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj*hMcubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj*hMchjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj*hMcubeh}(h]h ](jmacroeh"]h$]h&]jjjjCjjCjjjuh1jhhhjhNhNubh)}(h``RCU_LOCKDEP_WARN (c, s)``h]j)}(hjIh]hRCU_LOCKDEP_WARN (c, s)}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMehjhhubj)}(h1emit lockdep splat if specified condition is met h]h)}(h0emit lockdep splat if specified condition is meth]h0emit lockdep splat if specified condition is met}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMchj_ubah}(h]h ]h"]h$]h&]uh1jhjqhMchjhhubj)}(hX**Parameters** ``c`` condition to check ``s`` informative message **Description** This checks debug_lockdep_rcu_enabled() before checking (c) to prevent early boot splats due to lockdep not yet being initialized, and rechecks it after checking (c) to prevent false-positive splats due to races with lockdep being disabled. See commit 3066820034b5dd ("rcu: Reject RCU_LOCKDEP_WARN() false positives") for more detail.h](h)}(h**Parameters**h]j)}(hj~h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMghjxubj )}(hhh](j)}(h``c`` condition to check h](j)}(h``c``h]j)}(hjh]hc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMdhjubj2)}(hhh]h)}(hcondition to checkh]hcondition to check}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMdhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMdhjubj)}(h``s`` informative message h](j)}(h``s``h]j)}(hjh]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMehjubj2)}(hhh]h)}(hinformative messageh]hinformative message}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMehjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMehjubeh}(h]h ]h"]h$]h&]uh1j hjxubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMghjxubh)}(hXOThis checks debug_lockdep_rcu_enabled() before checking (c) to prevent early boot splats due to lockdep not yet being initialized, and rechecks it after checking (c) to prevent false-positive splats due to races with lockdep being disabled. See commit 3066820034b5dd ("rcu: Reject RCU_LOCKDEP_WARN() false positives") for more detail.h]hXSThis checks debug_lockdep_rcu_enabled() before checking (c) to prevent early boot splats due to lockdep not yet being initialized, and rechecks it after checking (c) to prevent false-positive splats due to races with lockdep being disabled. See commit 3066820034b5dd (“rcu: Reject RCU_LOCKDEP_WARN() false positives”) for more detail.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMfhjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )lockdep_assert_in_rcu_read_lock (C macro)!c.lockdep_assert_in_rcu_read_lockhNtauh1hhjhhhNhNubj)}(hhh](j)}(hlockdep_assert_in_rcu_read_lockh]j)}(hlockdep_assert_in_rcu_read_lockh]j{)}(hlockdep_assert_in_rcu_read_lockh]j)}(hjPh]hlockdep_assert_in_rcu_read_lock}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjRhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjNhhhjmhMubah}(h]jIah ](jjeh"]h$]h&]jj)jhuh1jhjmhMhjKhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjKhhhjmhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h&``lockdep_assert_in_rcu_read_lock ()``h]j)}(hjh]h"lockdep_assert_in_rcu_read_lock ()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h WARN if not protected by rcu_read_lock() **Description** Splats if lockdep is enabled and there is no rcu_read_lock() in effect. h](j)}(h)WARN if not protected by rcu_read_lock() h]h)}(h(WARN if not protected by rcu_read_lock()h]h(WARN if not protected by rcu_read_lock()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hGSplats if lockdep is enabled and there is no rcu_read_lock() in effect.h]hGSplats if lockdep is enabled and there is no rcu_read_lock() in effect.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ,lockdep_assert_in_rcu_read_lock_bh (C macro)$c.lockdep_assert_in_rcu_read_lock_bhhNtauh1hhjhhhNhNubj)}(hhh](j)}(h"lockdep_assert_in_rcu_read_lock_bhh]j)}(h"lockdep_assert_in_rcu_read_lock_bhh]j{)}(h"lockdep_assert_in_rcu_read_lock_bhh]j)}(hjh]h"lockdep_assert_in_rcu_read_lock_bh}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjj5jj5jjjuh1jhhhjhNhNubh)}(h)``lockdep_assert_in_rcu_read_lock_bh ()``h]j)}(hj;h]h%lockdep_assert_in_rcu_read_lock_bh ()}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h WARN if not protected by rcu_read_lock_bh() **Description** Splats if lockdep is enabled and there is no rcu_read_lock_bh() in effect. Note that local_bh_disable() and friends do not suffice here, instead an actual rcu_read_lock_bh() is required. h](j)}(h,WARN if not protected by rcu_read_lock_bh() h]h)}(h+WARN if not protected by rcu_read_lock_bh()h]h+WARN if not protected by rcu_read_lock_bh()}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjUubah}(h]h ]h"]h$]h&]uh1jhjghMhjQubh)}(h**Description**h]j)}(hjph]h Description}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjQubh)}(hSplats if lockdep is enabled and there is no rcu_read_lock_bh() in effect. Note that local_bh_disable() and friends do not suffice here, instead an actual rcu_read_lock_bh() is required.h]hSplats if lockdep is enabled and there is no rcu_read_lock_bh() in effect. Note that local_bh_disable() and friends do not suffice here, instead an actual rcu_read_lock_bh() is required.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjQubeh}(h]h ]h"]h$]h&]uh1jhjghMhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j /lockdep_assert_in_rcu_read_lock_sched (C macro)'c.lockdep_assert_in_rcu_read_lock_schedhNtauh1hhjhhhNhNubj)}(hhh](j)}(h%lockdep_assert_in_rcu_read_lock_schedh]j)}(h%lockdep_assert_in_rcu_read_lock_schedh]j{)}(h%lockdep_assert_in_rcu_read_lock_schedh]j)}(hjh]h%lockdep_assert_in_rcu_read_lock_sched}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h,``lockdep_assert_in_rcu_read_lock_sched ()``h]j)}(hjh]h(lockdep_assert_in_rcu_read_lock_sched ()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(hX WARN if not protected by rcu_read_lock_sched() **Description** Splats if lockdep is enabled and there is no rcu_read_lock_sched() in effect. Note that preempt_disable() and friends do not suffice here, instead an actual rcu_read_lock_sched() is required. h](j)}(h/WARN if not protected by rcu_read_lock_sched() h]h)}(h.WARN if not protected by rcu_read_lock_sched()h]h.WARN if not protected by rcu_read_lock_sched()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjubh)}(h**Description**h]j)}(hjh]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hSplats if lockdep is enabled and there is no rcu_read_lock_sched() in effect. Note that preempt_disable() and friends do not suffice here, instead an actual rcu_read_lock_sched() is required.h]hSplats if lockdep is enabled and there is no rcu_read_lock_sched() in effect. Note that preempt_disable() and friends do not suffice here, instead an actual rcu_read_lock_sched() is required.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &lockdep_assert_in_rcu_reader (C macro)c.lockdep_assert_in_rcu_readerhNtauh1hhjhhhNhNubj)}(hhh](j)}(hlockdep_assert_in_rcu_readerh]j)}(hlockdep_assert_in_rcu_readerh]j{)}(hlockdep_assert_in_rcu_readerh]j)}(hj]h]hlockdep_assert_in_rcu_reader}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj_hhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj[hhhjzhMubah}(h]jVah ](jjeh"]h$]h&]jj)jhuh1jhjzhMhjXhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjXhhhjzhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h#``lockdep_assert_in_rcu_reader ()``h]j)}(hjh]hlockdep_assert_in_rcu_reader ()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(hX WARN if not within some type of RCU reader **Description** Splats if lockdep is enabled and there is no RCU reader of any type in effect. Note that regions of code protected by things like preempt_disable, local_bh_disable(), and local_irq_disable() all qualify as RCU readers. Note that this will never trigger in PREEMPT_NONE or PREEMPT_VOLUNTARY kernels that are not also built with PREEMPT_COUNT. But if you have lockdep enabled, you might as well also enable PREEMPT_COUNT. h](j)}(h+WARN if not within some type of RCU reader h]h)}(h*WARN if not within some type of RCU readerh]h*WARN if not within some type of RCU reader}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hSplats if lockdep is enabled and there is no RCU reader of any type in effect. Note that regions of code protected by things like preempt_disable, local_bh_disable(), and local_irq_disable() all qualify as RCU readers.h]hSplats if lockdep is enabled and there is no RCU reader of any type in effect. Note that regions of code protected by things like preempt_disable, local_bh_disable(), and local_irq_disable() all qualify as RCU readers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hNote that this will never trigger in PREEMPT_NONE or PREEMPT_VOLUNTARY kernels that are not also built with PREEMPT_COUNT. But if you have lockdep enabled, you might as well also enable PREEMPT_COUNT.h]hNote that this will never trigger in PREEMPT_NONE or PREEMPT_VOLUNTARY kernels that are not also built with PREEMPT_COUNT. But if you have lockdep enabled, you might as well also enable PREEMPT_COUNT.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j unrcu_pointer (C macro)c.unrcu_pointerhNtauh1hhjhhhNhNubj)}(hhh](j)}(h unrcu_pointerh]j)}(h unrcu_pointerh]j{)}(h unrcu_pointerh]j)}(hjh]h unrcu_pointer}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj8hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj8hMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj8hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjQjjQjjjuh1jhhhjhNhNubh)}(h``unrcu_pointer (p)``h]j)}(hjWh]hunrcu_pointer (p)}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h*mark a pointer as not being RCU protected h]h)}(h)mark a pointer as not being RCU protectedh]h)mark a pointer as not being RCU protected}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjmubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(h**Parameters** ``p`` pointer needing to lose its __rcu property **Description** Converts **p** from an __rcu pointer to a __kernel pointer. This allows an __rcu pointer to be used with xchg() and friends.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh]j)}(h1``p`` pointer needing to lose its __rcu property h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h*pointer needing to lose its __rcu propertyh]h*pointer needing to lose its __rcu property}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(h|Converts **p** from an __rcu pointer to a __kernel pointer. This allows an __rcu pointer to be used with xchg() and friends.h](h Converts }(hjhhhNhNubj)}(h**p**h]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhn from an __rcu pointer to a __kernel pointer. This allows an __rcu pointer to be used with xchg() and friends.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j RCU_INITIALIZER (C macro)c.RCU_INITIALIZERhNtauh1hhjhhhNhNubj)}(hhh](j)}(hRCU_INITIALIZERh]j)}(hRCU_INITIALIZERh]j{)}(hRCU_INITIALIZERh]j)}(hj7h]hRCU_INITIALIZER}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj9hhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM ubah}(h]h ]h"]h$]h&]jjjuh1jjjhj5hhhjThM ubah}(h]j0ah ](jjeh"]h$]h&]jj)jhuh1jhjThM hj2hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj2hhhjThM ubeh}(h]h ](jmacroeh"]h$]h&]jjjjmjjmjjjuh1jhhhjhNhNubh)}(h``RCU_INITIALIZER (v)``h]j)}(hjsh]hRCU_INITIALIZER (v)}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM hjhhubj)}(h7statically initialize an RCU-protected global variable h]h)}(h6statically initialize an RCU-protected global variableh]h6statically initialize an RCU-protected global variable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM hjubah}(h]h ]h"]h$]h&]uh1jhjhM hjhhubj)}(h@**Parameters** ``v`` The value to statically initialize with.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh]j)}(h.``v`` The value to statically initialize with.h](j)}(h``v``h]j)}(hjh]hv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h(The value to statically initialize with.h]h(The value to statically initialize with.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_assign_pointer (C macro)c.rcu_assign_pointerhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_assign_pointerh]j)}(hrcu_assign_pointerh]j{)}(hrcu_assign_pointerh]j)}(hjh]hrcu_assign_pointer}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj8hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj8hMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj8hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjQjjQjjjuh1jhhhjhNhNubh)}(h``rcu_assign_pointer (p, v)``h]j)}(hjWh]hrcu_assign_pointer (p, v)}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h assign to RCU-protected pointer h]h)}(hassign to RCU-protected pointerh]hassign to RCU-protected pointer}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjmubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(hX**Parameters** ``p`` pointer to assign to ``v`` value to assign (publish) **Description** Assigns the specified value to the specified RCU-protected pointer, ensuring that any concurrent RCU readers will see any prior initialization. Inserts memory barriers on architectures that require them (which is most of them), and also prevents the compiler from reordering the code that initializes the structure after the pointer assignment. More importantly, this call documents which pointers will be dereferenced by RCU read-side code. In some special cases, you may use RCU_INIT_POINTER() instead of rcu_assign_pointer(). RCU_INIT_POINTER() is a bit faster due to the fact that it does not constrain either the CPU or the compiler. That said, using RCU_INIT_POINTER() when you should have used rcu_assign_pointer() is a very bad thing that results in impossible-to-diagnose memory corruption. So please be careful. See the RCU_INIT_POINTER() comment header for details. Note that rcu_assign_pointer() evaluates each of its arguments only once, appearances notwithstanding. One of the "extra" evaluations is in typeof() and the other visible only to sparse (__CHECKER__), neither of which actually execute the argument. As with most cpp macros, this execute-arguments-only-once property is important, so please be careful when making changes to rcu_assign_pointer() and the other macros that it invokes.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh](j)}(h``p`` pointer to assign to h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(hpointer to assign toh]hpointer to assign to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h ``v`` value to assign (publish) h](j)}(h``v``h]j)}(hjh]hv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(hvalue to assign (publish)h]hvalue to assign (publish)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hAssigns the specified value to the specified RCU-protected pointer, ensuring that any concurrent RCU readers will see any prior initialization.h]hAssigns the specified value to the specified RCU-protected pointer, ensuring that any concurrent RCU readers will see any prior initialization.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hX*Inserts memory barriers on architectures that require them (which is most of them), and also prevents the compiler from reordering the code that initializes the structure after the pointer assignment. More importantly, this call documents which pointers will be dereferenced by RCU read-side code.h]hX*Inserts memory barriers on architectures that require them (which is most of them), and also prevents the compiler from reordering the code that initializes the structure after the pointer assignment. More importantly, this call documents which pointers will be dereferenced by RCU read-side code.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hXIn some special cases, you may use RCU_INIT_POINTER() instead of rcu_assign_pointer(). RCU_INIT_POINTER() is a bit faster due to the fact that it does not constrain either the CPU or the compiler. That said, using RCU_INIT_POINTER() when you should have used rcu_assign_pointer() is a very bad thing that results in impossible-to-diagnose memory corruption. So please be careful. See the RCU_INIT_POINTER() comment header for details.h]hXIn some special cases, you may use RCU_INIT_POINTER() instead of rcu_assign_pointer(). RCU_INIT_POINTER() is a bit faster due to the fact that it does not constrain either the CPU or the compiler. That said, using RCU_INIT_POINTER() when you should have used rcu_assign_pointer() is a very bad thing that results in impossible-to-diagnose memory corruption. So please be careful. See the RCU_INIT_POINTER() comment header for details.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hXNote that rcu_assign_pointer() evaluates each of its arguments only once, appearances notwithstanding. One of the "extra" evaluations is in typeof() and the other visible only to sparse (__CHECKER__), neither of which actually execute the argument. As with most cpp macros, this execute-arguments-only-once property is important, so please be careful when making changes to rcu_assign_pointer() and the other macros that it invokes.h]hXNote that rcu_assign_pointer() evaluates each of its arguments only once, appearances notwithstanding. One of the “extra” evaluations is in typeof() and the other visible only to sparse (__CHECKER__), neither of which actually execute the argument. As with most cpp macros, this execute-arguments-only-once property is important, so please be careful when making changes to rcu_assign_pointer() and the other macros that it invokes.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM%hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_replace_pointer (C macro)c.rcu_replace_pointerhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_replace_pointerh]j)}(hrcu_replace_pointerh]j{)}(hrcu_replace_pointerh]j)}(hjh]hrcu_replace_pointer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM:ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM:ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM:hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhM:ubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h)``rcu_replace_pointer (rcu_ptr, ptr, c)``h]j)}(hjh]h%rcu_replace_pointer (rcu_ptr, ptr, c)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM<hjhhubj)}(h0replace an RCU pointer, returning its old value h]h)}(h/replace an RCU pointer, returning its old valueh]h/replace an RCU pointer, returning its old value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM:hjubah}(h]h ]h"]h$]h&]uh1jhjhM:hjhhubj)}(hX**Parameters** ``rcu_ptr`` RCU pointer, whose old value is returned ``ptr`` regular pointer ``c`` the lockdep conditions under which the dereference will take place **Description** Perform a replacement, where **rcu_ptr** is an RCU-annotated pointer and **c** is the lockdep argument that is passed to the rcu_dereference_protected() call used to read that pointer. The old value of **rcu_ptr** is returned, and **rcu_ptr** is set to **ptr**.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM>hjubj )}(hhh](j)}(h5``rcu_ptr`` RCU pointer, whose old value is returned h](j)}(h ``rcu_ptr``h]j)}(hjh]hrcu_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM;hjubj2)}(hhh]h)}(h(RCU pointer, whose old value is returnedh]h(RCU pointer, whose old value is returned}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hM;hj1ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj0hM;hjubj)}(h``ptr`` regular pointer h](j)}(h``ptr``h]j)}(hjTh]hptr}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM<hjNubj2)}(hhh]h)}(hregular pointerh]hregular pointer}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihM<hjjubah}(h]h ]h"]h$]h&]uh1j1hjNubeh}(h]h ]h"]h$]h&]uh1jhjihM<hjubj)}(hI``c`` the lockdep conditions under which the dereference will take place h](j)}(h``c``h]j)}(hjh]hc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM=hjubj2)}(hhh]h)}(hBthe lockdep conditions under which the dereference will take placeh]hBthe lockdep conditions under which the dereference will take place}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM=hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM=hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM?hjubh)}(hXPerform a replacement, where **rcu_ptr** is an RCU-annotated pointer and **c** is the lockdep argument that is passed to the rcu_dereference_protected() call used to read that pointer. The old value of **rcu_ptr** is returned, and **rcu_ptr** is set to **ptr**.h](hPerform a replacement, where }(hjhhhNhNubj)}(h **rcu_ptr**h]hrcu_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh! is an RCU-annotated pointer and }(hjhhhNhNubj)}(h**c**h]hc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh} is the lockdep argument that is passed to the rcu_dereference_protected() call used to read that pointer. The old value of }(hjhhhNhNubj)}(h **rcu_ptr**h]hrcu_ptr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is returned, and }(hjhhhNhNubj)}(h **rcu_ptr**h]hrcu_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is set to }(hjhhhNhNubj)}(h**ptr**h]hptr}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM>hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_access_pointer (C macro)c.rcu_access_pointerhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_access_pointerh]j)}(hrcu_access_pointerh]j{)}(hrcu_access_pointerh]j)}(hjah]hrcu_access_pointer}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjchhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMLubah}(h]h ]h"]h$]h&]jjjuh1jjjhj_hhhj~hMLubah}(h]jZah ](jjeh"]h$]h&]jj)jhuh1jhj~hMLhj\hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj\hhhj~hMLubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h``rcu_access_pointer (p)``h]j)}(hjh]hrcu_access_pointer (p)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMNhjhhubj)}(h(fetch RCU pointer with no dereferencing h]h)}(h'fetch RCU pointer with no dereferencingh]h'fetch RCU pointer with no dereferencing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMLhjubah}(h]h ]h"]h$]h&]uh1jhjhMLhjhhubj)}(hX**Parameters** ``p`` The pointer to read **Description** Return the value of the specified RCU-protected pointer, but omit the lockdep checks for being in an RCU read-side critical section. This is useful when the value of this pointer is accessed, but the pointer is not dereferenced, for example, when testing an RCU-protected pointer against NULL. Within an RCU read-side critical section, there is little reason to use rcu_access_pointer(). Although rcu_access_pointer() may also be used in cases where update-side locks prevent the value of the pointer from changing, you should instead use rcu_dereference_protected() for this use case. It is also permissible to use rcu_access_pointer() within lockless updaters to obtain the old value for an atomic operation, for example, for cmpxchg(). It is usually best to test the rcu_access_pointer() return value directly in order to avoid accidental dereferences being introduced by later inattentive changes. In other words, assigning the rcu_access_pointer() return value to a local variable results in an accident waiting to happen. It is also permissible to use rcu_access_pointer() when read-side access to the pointer was removed at least one grace period ago, as is the case in the context of the RCU callback that is freeing up the data, or after a synchronize_rcu() returns. This can be useful when tearing down multi-linked structures after a grace period has elapsed. However, rcu_dereference_protected() is normally preferred for this use case.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMPhjubj )}(hhh]j)}(h``p`` The pointer to read h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMMhjubj2)}(hhh]h)}(hThe pointer to readh]hThe pointer to read}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj,h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMOhjubh)}(hXReturn the value of the specified RCU-protected pointer, but omit the lockdep checks for being in an RCU read-side critical section. This is useful when the value of this pointer is accessed, but the pointer is not dereferenced, for example, when testing an RCU-protected pointer against NULL. Within an RCU read-side critical section, there is little reason to use rcu_access_pointer(). Although rcu_access_pointer() may also be used in cases where update-side locks prevent the value of the pointer from changing, you should instead use rcu_dereference_protected() for this use case. It is also permissible to use rcu_access_pointer() within lockless updaters to obtain the old value for an atomic operation, for example, for cmpxchg().h]hXReturn the value of the specified RCU-protected pointer, but omit the lockdep checks for being in an RCU read-side critical section. This is useful when the value of this pointer is accessed, but the pointer is not dereferenced, for example, when testing an RCU-protected pointer against NULL. Within an RCU read-side critical section, there is little reason to use rcu_access_pointer(). Although rcu_access_pointer() may also be used in cases where update-side locks prevent the value of the pointer from changing, you should instead use rcu_dereference_protected() for this use case. It is also permissible to use rcu_access_pointer() within lockless updaters to obtain the old value for an atomic operation, for example, for cmpxchg().}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMNhjubh)}(hX!It is usually best to test the rcu_access_pointer() return value directly in order to avoid accidental dereferences being introduced by later inattentive changes. In other words, assigning the rcu_access_pointer() return value to a local variable results in an accident waiting to happen.h]hX!It is usually best to test the rcu_access_pointer() return value directly in order to avoid accidental dereferences being introduced by later inattentive changes. In other words, assigning the rcu_access_pointer() return value to a local variable results in an accident waiting to happen.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMZhjubh)}(hXIt is also permissible to use rcu_access_pointer() when read-side access to the pointer was removed at least one grace period ago, as is the case in the context of the RCU callback that is freeing up the data, or after a synchronize_rcu() returns. This can be useful when tearing down multi-linked structures after a grace period has elapsed. However, rcu_dereference_protected() is normally preferred for this use case.h]hXIt is also permissible to use rcu_access_pointer() when read-side access to the pointer was removed at least one grace period ago, as is the case in the context of the RCU callback that is freeing up the data, or after a synchronize_rcu() returns. This can be useful when tearing down multi-linked structures after a grace period has elapsed. However, rcu_dereference_protected() is normally preferred for this use case.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM`hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_dereference_check (C macro)c.rcu_dereference_checkhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_dereference_checkh]j)}(hrcu_dereference_checkh]j{)}(hrcu_dereference_checkh]j)}(hjh]hrcu_dereference_check}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMkubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMkubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMkhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMkubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h ``rcu_dereference_check (p, c)``h]j)}(hjh]hrcu_dereference_check (p, c)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMmhjhhubj)}(h$rcu_dereference with debug checking h]h)}(h#rcu_dereference with debug checkingh]h#rcu_dereference with debug checking}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMkhjubah}(h]h ]h"]h$]h&]uh1jhjhMkhjhhubj)}(hX**Parameters** ``p`` The pointer to read, prior to dereferencing ``c`` The conditions under which the dereference will take place **Description** Do an rcu_dereference(), but check that the conditions under which the dereference will take place are correct. Typically the conditions indicate the various locking conditions that should be held at that point. The check should return true if the conditions are satisfied. An implicit check for being in an RCU read-side critical section (rcu_read_lock()) is included. For example: bar = rcu_dereference_check(foo->bar, lockdep_is_held(:c:type:`foo->lock `)); could be used to indicate to lockdep that foo->bar may only be dereferenced if either rcu_read_lock() is held, or that the lock required to replace the bar struct at foo->bar is held. Note that the list of conditions may also include indications of when a lock need not be held, for example during initialisation or destruction of the target struct: bar = rcu_dereference_check(foo->bar, lockdep_is_held(:c:type:`foo->lock `) || atomic_read(:c:type:`foo->usage `) == 0); Inserts memory barriers on architectures that require them (currently only the Alpha), prevents the compiler from refetching (and from merging fetches), and, more importantly, documents exactly which pointers are protected by RCU and checks that the pointer is annotated as __rcu.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMohjubj )}(hhh](j)}(h2``p`` The pointer to read, prior to dereferencing h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMlhjubj2)}(hhh]h)}(h+The pointer to read, prior to dereferencingh]h+The pointer to read, prior to dereferencing}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hMlhj/ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj.hMlhjubj)}(hA``c`` The conditions under which the dereference will take place h](j)}(h``c``h]j)}(hjRh]hc}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMmhjLubj2)}(hhh]h)}(h:The conditions under which the dereference will take placeh]h:The conditions under which the dereference will take place}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMmhjhubah}(h]h ]h"]h$]h&]uh1j1hjLubeh}(h]h ]h"]h$]h&]uh1jhjghMmhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMohjubh)}(hXsDo an rcu_dereference(), but check that the conditions under which the dereference will take place are correct. Typically the conditions indicate the various locking conditions that should be held at that point. The check should return true if the conditions are satisfied. An implicit check for being in an RCU read-side critical section (rcu_read_lock()) is included.h]hXsDo an rcu_dereference(), but check that the conditions under which the dereference will take place are correct. Typically the conditions indicate the various locking conditions that should be held at that point. The check should return true if the conditions are satisfied. An implicit check for being in an RCU read-side critical section (rcu_read_lock()) is included.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMnhjubh)}(h For example:h]h For example:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMuhjubj)}(hSbar = rcu_dereference_check(foo->bar, lockdep_is_held(:c:type:`foo->lock `)); h]h)}(hRbar = rcu_dereference_check(foo->bar, lockdep_is_held(:c:type:`foo->lock `));h](h6bar = rcu_dereference_check(foo->bar, lockdep_is_held(}(hjhhhNhNubh)}(h:c:type:`foo->lock `h]j)}(hjh]h foo->lock}(hjhhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjfoouh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMwhjubh));}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMwhjubah}(h]h ]h"]h$]h&]uh1jhjhMwhjubh)}(hcould be used to indicate to lockdep that foo->bar may only be dereferenced if either rcu_read_lock() is held, or that the lock required to replace the bar struct at foo->bar is held.h]hcould be used to indicate to lockdep that foo->bar may only be dereferenced if either rcu_read_lock() is held, or that the lock required to replace the bar struct at foo->bar is held.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMyhjubh)}(hNote that the list of conditions may also include indications of when a lock need not be held, for example during initialisation or destruction of the target struct:h]hNote that the list of conditions may also include indications of when a lock need not be held, for example during initialisation or destruction of the target struct:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM}hjubj)}(hbar = rcu_dereference_check(foo->bar, lockdep_is_held(:c:type:`foo->lock `) || atomic_read(:c:type:`foo->usage `) == 0); h]j )}(hhh]j)}(hbar = rcu_dereference_check(foo->bar, lockdep_is_held(:c:type:`foo->lock `) || atomic_read(:c:type:`foo->usage `) == 0); h](j)}(hSbar = rcu_dereference_check(foo->bar, lockdep_is_held(:c:type:`foo->lock `) ||h](h6bar = rcu_dereference_check(foo->bar, lockdep_is_held(}(hj&hhhNhNubh)}(h:c:type:`foo->lock `h]j)}(hj0h]h foo->lock}(hj2hhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjfoouh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhj&ubh) ||}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjMhMhj"ubj2)}(hhh]h)}(h.atomic_read(:c:type:`foo->usage `) == 0);h](h atomic_read(}(hj[hhhNhNubh)}(h:c:type:`foo->usage `h]j)}(hjeh]h foo->usage}(hjghhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjfoouh1hhjMhMhj[ubh) == 0);}(hj[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjMhMhjXubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhjMhMhjubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hXInserts memory barriers on architectures that require them (currently only the Alpha), prevents the compiler from refetching (and from merging fetches), and, more importantly, documents exactly which pointers are protected by RCU and checks that the pointer is annotated as __rcu.h]hXInserts memory barriers on architectures that require them (currently only the Alpha), prevents the compiler from refetching (and from merging fetches), and, more importantly, documents exactly which pointers are protected by RCU and checks that the pointer is annotated as __rcu.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "rcu_dereference_bh_check (C macro)c.rcu_dereference_bh_checkhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_dereference_bh_checkh]j)}(hrcu_dereference_bh_checkh]j{)}(hrcu_dereference_bh_checkh]j)}(hjh]hrcu_dereference_bh_check}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h#``rcu_dereference_bh_check (p, c)``h]j)}(hj h]hrcu_dereference_bh_check (p, c)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h'rcu_dereference_bh with debug checking h]h)}(h&rcu_dereference_bh with debug checkingh]h&rcu_dereference_bh with debug checking}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhj ubah}(h]h ]h"]h$]h&]uh1jhj2hMhjhhubj)}(hX'**Parameters** ``p`` The pointer to read, prior to dereferencing ``c`` The conditions under which the dereference will take place **Description** This is the RCU-bh counterpart to rcu_dereference_check(). However, please note that starting in v5.0 kernels, vanilla RCU grace periods wait for local_bh_disable() regions of code in addition to regions of code demarked by rcu_read_lock() and rcu_read_unlock(). This means that synchronize_rcu(), call_rcu, and friends all take not only rcu_read_lock() but also rcu_read_lock_bh() into account.h](h)}(h**Parameters**h]j)}(hj?h]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhj9ubj )}(hhh](j)}(h2``p`` The pointer to read, prior to dereferencing h](j)}(h``p``h]j)}(hj^h]hp}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjXubj2)}(hhh]h)}(h+The pointer to read, prior to dereferencingh]h+The pointer to read, prior to dereferencing}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshMhjtubah}(h]h ]h"]h$]h&]uh1j1hjXubeh}(h]h ]h"]h$]h&]uh1jhjshMhjUubj)}(hA``c`` The conditions under which the dereference will take place h](j)}(h``c``h]j)}(hjh]hc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h:The conditions under which the dereference will take placeh]h:The conditions under which the dereference will take place}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjUubeh}(h]h ]h"]h$]h&]uh1j hj9ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhj9ubh)}(hXThis is the RCU-bh counterpart to rcu_dereference_check(). However, please note that starting in v5.0 kernels, vanilla RCU grace periods wait for local_bh_disable() regions of code in addition to regions of code demarked by rcu_read_lock() and rcu_read_unlock(). This means that synchronize_rcu(), call_rcu, and friends all take not only rcu_read_lock() but also rcu_read_lock_bh() into account.h]hXThis is the RCU-bh counterpart to rcu_dereference_check(). However, please note that starting in v5.0 kernels, vanilla RCU grace periods wait for local_bh_disable() regions of code in addition to regions of code demarked by rcu_read_lock() and rcu_read_unlock(). This means that synchronize_rcu(), call_rcu, and friends all take not only rcu_read_lock() but also rcu_read_lock_bh() into account.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %rcu_dereference_sched_check (C macro)c.rcu_dereference_sched_checkhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_dereference_sched_checkh]j)}(hrcu_dereference_sched_checkh]j{)}(hrcu_dereference_sched_checkh]j)}(hjh]hrcu_dereference_sched_check}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj.hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj.hMhj hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj hhhj.hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjGjjGjjjuh1jhhhjhNhNubh)}(h&``rcu_dereference_sched_check (p, c)``h]j)}(hjMh]h"rcu_dereference_sched_check (p, c)}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h*rcu_dereference_sched with debug checking h]h)}(h)rcu_dereference_sched with debug checkingh]h)rcu_dereference_sched with debug checking}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjcubah}(h]h ]h"]h$]h&]uh1jhjuhMhjhhubj)}(hX***Parameters** ``p`` The pointer to read, prior to dereferencing ``c`` The conditions under which the dereference will take place **Description** This is the RCU-sched counterpart to rcu_dereference_check(). However, please note that starting in v5.0 kernels, vanilla RCU grace periods wait for preempt_disable() regions of code in addition to regions of code demarked by rcu_read_lock() and rcu_read_unlock(). This means that synchronize_rcu(), call_rcu, and friends all take not only rcu_read_lock() but also rcu_read_lock_sched() into account.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhj|ubj )}(hhh](j)}(h2``p`` The pointer to read, prior to dereferencing h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h+The pointer to read, prior to dereferencingh]h+The pointer to read, prior to dereferencing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hA``c`` The conditions under which the dereference will take place h](j)}(h``c``h]j)}(hjh]hc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h:The conditions under which the dereference will take placeh]h:The conditions under which the dereference will take place}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hj|ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhj|ubh)}(hXThis is the RCU-sched counterpart to rcu_dereference_check(). However, please note that starting in v5.0 kernels, vanilla RCU grace periods wait for preempt_disable() regions of code in addition to regions of code demarked by rcu_read_lock() and rcu_read_unlock(). This means that synchronize_rcu(), call_rcu, and friends all take not only rcu_read_lock() but also rcu_read_lock_sched() into account.h]hXThis is the RCU-sched counterpart to rcu_dereference_check(). However, please note that starting in v5.0 kernels, vanilla RCU grace periods wait for preempt_disable() regions of code in addition to regions of code demarked by rcu_read_lock() and rcu_read_unlock(). This means that synchronize_rcu(), call_rcu, and friends all take not only rcu_read_lock() but also rcu_read_lock_sched() into account.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhj|ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #rcu_dereference_all_check (C macro)c.rcu_dereference_all_checkhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_dereference_all_checkh]j)}(hrcu_dereference_all_checkh]j{)}(hrcu_dereference_all_checkh]j)}(hjTh]hrcu_dereference_all_check}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjVhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjRhhhjqhMubah}(h]jMah ](jjeh"]h$]h&]jj)jhuh1jhjqhMhjOhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjOhhhjqhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h$``rcu_dereference_all_check (p, c)``h]j)}(hjh]h rcu_dereference_all_check (p, c)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h(rcu_dereference_all with debug checking h]h)}(h'rcu_dereference_all with debug checkingh]h'rcu_dereference_all with debug checking}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(hXD**Parameters** ``p`` The pointer to read, prior to dereferencing ``c`` The conditions under which the dereference will take place **Description** This is similar to rcu_dereference_check(), but allows protection by all forms of vanilla RCU readers, including preemption disabled, bh-disabled, and interrupt-disabled regions of code. Note that "vanilla RCU" excludes SRCU and the various Tasks RCU flavors. Please note that this macro should not be backported to any Linux-kernel version preceding v5.0 due to changes in synchronize_rcu() semantics prior to that version.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh](j)}(h2``p`` The pointer to read, prior to dereferencing h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h+The pointer to read, prior to dereferencingh]h+The pointer to read, prior to dereferencing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hA``c`` The conditions under which the dereference will take place h](j)}(h``c``h]j)}(hjh]hc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h:The conditions under which the dereference will take placeh]h:The conditions under which the dereference will take place}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj3ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj2hMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjXh]h Description}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hXThis is similar to rcu_dereference_check(), but allows protection by all forms of vanilla RCU readers, including preemption disabled, bh-disabled, and interrupt-disabled regions of code. Note that "vanilla RCU" excludes SRCU and the various Tasks RCU flavors. Please note that this macro should not be backported to any Linux-kernel version preceding v5.0 due to changes in synchronize_rcu() semantics prior to that version.h]hXThis is similar to rcu_dereference_check(), but allows protection by all forms of vanilla RCU readers, including preemption disabled, bh-disabled, and interrupt-disabled regions of code. Note that “vanilla RCU” excludes SRCU and the various Tasks RCU flavors. Please note that this macro should not be backported to any Linux-kernel version preceding v5.0 due to changes in synchronize_rcu() semantics prior to that version.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #rcu_dereference_protected (C macro)c.rcu_dereference_protectedhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_dereference_protectedh]j)}(hrcu_dereference_protectedh]j{)}(hrcu_dereference_protectedh]j)}(hjh]hrcu_dereference_protected}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h$``rcu_dereference_protected (p, c)``h]j)}(hjh]h rcu_dereference_protected (p, c)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h)fetch RCU pointer when updates prevented h]h)}(h(fetch RCU pointer when updates preventedh]h(fetch RCU pointer when updates prevented}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(hX**Parameters** ``p`` The pointer to read, prior to dereferencing ``c`` The conditions under which the dereference will take place **Description** Return the value of the specified RCU-protected pointer, but omit the READ_ONCE(). This is useful in cases where update-side locks prevent the value of the pointer from changing. Please note that this primitive does *not* prevent the compiler from repeating this reference or combining it with other references, so it should not be used without protection of appropriate locks. This function is only for update-side use. Using this function when protected only by rcu_read_lock() will result in infrequent but very ugly failures.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh](j)}(h2``p`` The pointer to read, prior to dereferencing h](j)}(h``p``h]j)}(hj'h]hp}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhj!ubj2)}(hhh]h)}(h+The pointer to read, prior to dereferencingh]h+The pointer to read, prior to dereferencing}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj=ubah}(h]h ]h"]h$]h&]uh1j1hj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhjubj)}(hA``c`` The conditions under which the dereference will take place h](j)}(h``c``h]j)}(hj`h]hc}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjZubj2)}(hhh]h)}(h:The conditions under which the dereference will take placeh]h:The conditions under which the dereference will take place}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhMhjvubah}(h]h ]h"]h$]h&]uh1j1hjZubeh}(h]h ]h"]h$]h&]uh1jhjuhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hX{Return the value of the specified RCU-protected pointer, but omit the READ_ONCE(). This is useful in cases where update-side locks prevent the value of the pointer from changing. Please note that this primitive does *not* prevent the compiler from repeating this reference or combining it with other references, so it should not be used without protection of appropriate locks.h](hReturn the value of the specified RCU-protected pointer, but omit the READ_ONCE(). This is useful in cases where update-side locks prevent the value of the pointer from changing. Please note that this primitive does }(hjhhhNhNubj)}(h*not*h]hnot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh prevent the compiler from repeating this reference or combining it with other references, so it should not be used without protection of appropriate locks.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hThis function is only for update-side use. Using this function when protected only by rcu_read_lock() will result in infrequent but very ugly failures.h]hThis function is only for update-side use. Using this function when protected only by rcu_read_lock() will result in infrequent but very ugly failures.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_dereference (C macro)c.rcu_dereferencehNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_dereferenceh]j)}(hrcu_dereferenceh]j{)}(hrcu_dereferenceh]j)}(hjh]hrcu_dereference}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjj1jj1jjjuh1jhhhjhNhNubh)}(h``rcu_dereference (p)``h]j)}(hj7h]hrcu_dereference (p)}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h.fetch RCU-protected pointer for dereferencing h]h)}(h-fetch RCU-protected pointer for dereferencingh]h-fetch RCU-protected pointer for dereferencing}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjMubah}(h]h ]h"]h$]h&]uh1jhj_hMhjhhubj)}(h**Parameters** ``p`` The pointer to read, prior to dereferencing **Description** This is a simple wrapper around rcu_dereference_check().h](h)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjfubj )}(hhh]j)}(h2``p`` The pointer to read, prior to dereferencing h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h+The pointer to read, prior to dereferencingh]h+The pointer to read, prior to dereferencing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjfubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjfubh)}(h8This is a simple wrapper around rcu_dereference_check().h]h8This is a simple wrapper around rcu_dereference_check().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_dereference_bh (C macro)c.rcu_dereference_bhhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_dereference_bhh]j)}(hrcu_dereference_bhh]j{)}(hrcu_dereference_bhh]j)}(hjh]hrcu_dereference_bh}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj"hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj"hMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj"hMubeh}(h]h ](jmacroeh"]h$]h&]jjjj;jj;jjjuh1jhhhjhNhNubh)}(h``rcu_dereference_bh (p)``h]j)}(hjAh]hrcu_dereference_bh (p)}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h4fetch an RCU-bh-protected pointer for dereferencing h]h)}(h3fetch an RCU-bh-protected pointer for dereferencingh]h3fetch an RCU-bh-protected pointer for dereferencing}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjWubah}(h]h ]h"]h$]h&]uh1jhjihMhjhhubj)}(h**Parameters** ``p`` The pointer to read, prior to dereferencing **Description** Makes rcu_dereference_check() do the dirty work.h](h)}(h**Parameters**h]j)}(hjvh]h Parameters}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjpubj )}(hhh]j)}(h2``p`` The pointer to read, prior to dereferencing h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h+The pointer to read, prior to dereferencingh]h+The pointer to read, prior to dereferencing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjpubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjpubh)}(h0Makes rcu_dereference_check() do the dirty work.h]h0Makes rcu_dereference_check() do the dirty work.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_dereference_sched (C macro)c.rcu_dereference_schedhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_dereference_schedh]j)}(hrcu_dereference_schedh]j{)}(hrcu_dereference_schedh]j)}(hjh]hrcu_dereference_sched}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj,hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj,hMhj hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj hhhj,hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjEjjEjjjuh1jhhhjhNhNubh)}(h``rcu_dereference_sched (p)``h]j)}(hjKh]hrcu_dereference_sched (p)}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h4fetch RCU-sched-protected pointer for dereferencing h]h)}(h3fetch RCU-sched-protected pointer for dereferencingh]h3fetch RCU-sched-protected pointer for dereferencing}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjaubah}(h]h ]h"]h$]h&]uh1jhjshMhjhhubj)}(h**Parameters** ``p`` The pointer to read, prior to dereferencing **Description** Makes rcu_dereference_check() do the dirty work.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjzubj )}(hhh]j)}(h2``p`` The pointer to read, prior to dereferencing h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h+The pointer to read, prior to dereferencingh]h+The pointer to read, prior to dereferencing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjzubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjzubh)}(h0Makes rcu_dereference_check() do the dirty work.h]h0Makes rcu_dereference_check() do the dirty work.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjzubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_dereference_all (C macro)c.rcu_dereference_allhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_dereference_allh]j)}(hrcu_dereference_allh]j{)}(hrcu_dereference_allh]j)}(hjh]hrcu_dereference_all}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj6hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj6hMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj6hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjOjjOjjjuh1jhhhjhNhNubh)}(h``rcu_dereference_all (p)``h]j)}(hjUh]hrcu_dereference_all (p)}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h2fetch RCU-all-protected pointer for dereferencing h]h)}(h1fetch RCU-all-protected pointer for dereferencingh]h1fetch RCU-all-protected pointer for dereferencing}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjkubah}(h]h ]h"]h$]h&]uh1jhj}hMhjhhubj)}(h**Parameters** ``p`` The pointer to read, prior to dereferencing **Description** Makes rcu_dereference_check() do the dirty work.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh]j)}(h2``p`` The pointer to read, prior to dereferencing h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h+The pointer to read, prior to dereferencingh]h+The pointer to read, prior to dereferencing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(h0Makes rcu_dereference_check() do the dirty work.h]h0Makes rcu_dereference_check() do the dirty work.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_pointer_handoff (C macro)c.rcu_pointer_handoffhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_pointer_handoffh]j)}(hrcu_pointer_handoffh]j{)}(hrcu_pointer_handoffh]j)}(hj#h]hrcu_pointer_handoff}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj%hhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj!hhhj@hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj@hMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj@hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjYjjYjjjuh1jhhhjhNhNubh)}(h``rcu_pointer_handoff (p)``h]j)}(hj_h]hrcu_pointer_handoff (p)}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h/Hand off a pointer from RCU to other mechanism h]h)}(h.Hand off a pointer from RCU to other mechanismh]h.Hand off a pointer from RCU to other mechanism}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjuubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(hXk**Parameters** ``p`` The pointer to hand off **Description** This is simply an identity function, but it documents where a pointer is handed off from RCU to some other synchronization mechanism, for example, reference counting or locking. In C11, it would map to kill_dependency(). It could be used as follows:: rcu_read_lock(); p = rcu_dereference(gp); long_lived = is_long_lived(p); if (long_lived) { if (!atomic_inc_not_zero(p->refcnt)) long_lived = false; else p = rcu_pointer_handoff(p); } rcu_read_unlock();h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh]j)}(h``p`` The pointer to hand off h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(hThe pointer to hand offh]hThe pointer to hand off}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hThis is simply an identity function, but it documents where a pointer is handed off from RCU to some other synchronization mechanism, for example, reference counting or locking. In C11, it would map to kill_dependency(). It could be used as follows::h]hThis is simply an identity function, but it documents where a pointer is handed off from RCU to some other synchronization mechanism, for example, reference counting or locking. In C11, it would map to kill_dependency(). It could be used as follows:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj7C)}(hrcu_read_lock(); p = rcu_dereference(gp); long_lived = is_long_lived(p); if (long_lived) { if (!atomic_inc_not_zero(p->refcnt)) long_lived = false; else p = rcu_pointer_handoff(p); } rcu_read_unlock();h]hrcu_read_lock(); p = rcu_dereference(gp); long_lived = is_long_lived(p); if (long_lived) { if (!atomic_inc_not_zero(p->refcnt)) long_lived = false; else p = rcu_pointer_handoff(p); } rcu_read_unlock();}hjsbah}(h]h ]h"]h$]h&]jjuh1j6Ch]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_read_lock (C function)c.rcu_read_lockhNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_read_lock (void)h]j)}(hvoid rcu_read_lock(void)h](j )}(hvoidh]hvoid}(hjBhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>hhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>hhhjPhMubj{)}(h rcu_read_lockh]j)}(h rcu_read_lockh]h rcu_read_lock}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj>hhhjPhMubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]noemphjjuh1jhjwubah}(h]h ]h"]h$]h&]jjuh1jhj>hhhjPhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj:hhhjPhMubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1jhjPhMhj7hhubj)}(hhh]h)}(h7mark the beginning of an RCU read-side critical sectionh]h7mark the beginning of an RCU read-side critical section}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhj7hhhjPhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX **Parameters** ``void`` no arguments **Description** When synchronize_rcu() is invoked on one CPU while other CPUs are within RCU read-side critical sections, then the synchronize_rcu() is guaranteed to block until after all the other CPUs exit their critical sections. Similarly, if call_rcu() is invoked on one CPU while other CPUs are within RCU read-side critical sections, invocation of the corresponding RCU callback is deferred until after the all the other CPUs exit their critical sections. Both synchronize_rcu() and call_rcu() also wait for regions of code with preemption disabled, including regions of code with interrupts or softirqs disabled. Note, however, that RCU callbacks are permitted to run concurrently with new RCU read-side critical sections. One way that this can happen is via the following sequence of events: (1) CPU 0 enters an RCU read-side critical section, (2) CPU 1 invokes call_rcu() to register an RCU callback, (3) CPU 0 exits the RCU read-side critical section, (4) CPU 2 enters a RCU read-side critical section, (5) the RCU callback is invoked. This is legal, because the RCU read-side critical section that was running concurrently with the call_rcu() (and which therefore might be referencing something that the corresponding RCU callback would free up) has completed before the corresponding RCU callback is invoked. RCU read-side critical sections may be nested. Any deferred actions will be deferred until the outermost RCU read-side critical section completes. You can avoid reading and understanding the next paragraph by following this rule: don't put anything in an rcu_read_lock() RCU read-side critical section that would block in a !PREEMPTION kernel. But if you want the full story, read on! In non-preemptible RCU implementations (pure TREE_RCU and TINY_RCU), it is illegal to block while in an RCU read-side critical section. In preemptible RCU implementations (PREEMPT_RCU) in CONFIG_PREEMPTION kernel builds, RCU read-side critical sections may be preempted, but explicit blocking is illegal. Finally, in preemptible RCU implementations in real-time (with -rt patchset) kernel builds, RCU read-side critical sections may be preempted and they may also block, but only when acquiring spinlocks that are subject to priority inheritance.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj%h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjubh)}(hXWhen synchronize_rcu() is invoked on one CPU while other CPUs are within RCU read-side critical sections, then the synchronize_rcu() is guaranteed to block until after all the other CPUs exit their critical sections. Similarly, if call_rcu() is invoked on one CPU while other CPUs are within RCU read-side critical sections, invocation of the corresponding RCU callback is deferred until after the all the other CPUs exit their critical sections.h]hXWhen synchronize_rcu() is invoked on one CPU while other CPUs are within RCU read-side critical sections, then the synchronize_rcu() is guaranteed to block until after all the other CPUs exit their critical sections. Similarly, if call_rcu() is invoked on one CPU while other CPUs are within RCU read-side critical sections, invocation of the corresponding RCU callback is deferred until after the all the other CPUs exit their critical sections.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hBoth synchronize_rcu() and call_rcu() also wait for regions of code with preemption disabled, including regions of code with interrupts or softirqs disabled.h]hBoth synchronize_rcu() and call_rcu() also wait for regions of code with preemption disabled, including regions of code with interrupts or softirqs disabled.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM hjubh)}(hXNote, however, that RCU callbacks are permitted to run concurrently with new RCU read-side critical sections. One way that this can happen is via the following sequence of events: (1) CPU 0 enters an RCU read-side critical section, (2) CPU 1 invokes call_rcu() to register an RCU callback, (3) CPU 0 exits the RCU read-side critical section, (4) CPU 2 enters a RCU read-side critical section, (5) the RCU callback is invoked. This is legal, because the RCU read-side critical section that was running concurrently with the call_rcu() (and which therefore might be referencing something that the corresponding RCU callback would free up) has completed before the corresponding RCU callback is invoked.h]hXNote, however, that RCU callbacks are permitted to run concurrently with new RCU read-side critical sections. One way that this can happen is via the following sequence of events: (1) CPU 0 enters an RCU read-side critical section, (2) CPU 1 invokes call_rcu() to register an RCU callback, (3) CPU 0 exits the RCU read-side critical section, (4) CPU 2 enters a RCU read-side critical section, (5) the RCU callback is invoked. This is legal, because the RCU read-side critical section that was running concurrently with the call_rcu() (and which therefore might be referencing something that the corresponding RCU callback would free up) has completed before the corresponding RCU callback is invoked.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM$hjubh)}(hRCU read-side critical sections may be nested. Any deferred actions will be deferred until the outermost RCU read-side critical section completes.h]hRCU read-side critical sections may be nested. Any deferred actions will be deferred until the outermost RCU read-side critical section completes.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM0hjubh)}(hYou can avoid reading and understanding the next paragraph by following this rule: don't put anything in an rcu_read_lock() RCU read-side critical section that would block in a !PREEMPTION kernel. But if you want the full story, read on!h]hYou can avoid reading and understanding the next paragraph by following this rule: don’t put anything in an rcu_read_lock() RCU read-side critical section that would block in a !PREEMPTION kernel. But if you want the full story, read on!}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM4hjubh)}(hX#In non-preemptible RCU implementations (pure TREE_RCU and TINY_RCU), it is illegal to block while in an RCU read-side critical section. In preemptible RCU implementations (PREEMPT_RCU) in CONFIG_PREEMPTION kernel builds, RCU read-side critical sections may be preempted, but explicit blocking is illegal. Finally, in preemptible RCU implementations in real-time (with -rt patchset) kernel builds, RCU read-side critical sections may be preempted and they may also block, but only when acquiring spinlocks that are subject to priority inheritance.h]hX#In non-preemptible RCU implementations (pure TREE_RCU and TINY_RCU), it is illegal to block while in an RCU read-side critical section. In preemptible RCU implementations (PREEMPT_RCU) in CONFIG_PREEMPTION kernel builds, RCU read-side critical sections may be preempted, but explicit blocking is illegal. Finally, in preemptible RCU implementations in real-time (with -rt patchset) kernel builds, RCU read-side critical sections may be preempted and they may also block, but only when acquiring spinlocks that are subject to priority inheritance.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM9hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_read_unlock (C function)c.rcu_read_unlockhNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_read_unlock (void)h]j)}(hvoid rcu_read_unlock(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMXubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMXubj{)}(hrcu_read_unlockh]j)}(hrcu_read_unlockh]hrcu_read_unlock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMXubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMXubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMXubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMXhjhhubj)}(hhh]h)}(h3marks the end of an RCU read-side critical section.h]h3marks the end of an RCU read-side critical section.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMXhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMXubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4jj4jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``void`` no arguments **Description** In almost all situations, rcu_read_unlock() is immune from deadlock. This deadlock immunity also extends to the scheduler's runqueue and priority-inheritance spinlocks, courtesy of the quiescent-state deferral that is carried out when rcu_read_unlock() is invoked with interrupts disabled. See rcu_read_lock() for more information.h](h)}(h**Parameters**h]j)}(hj>h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM\hj8ubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj]h]hvoid}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjWubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhKhjsubah}(h]h ]h"]h$]h&]uh1j1hjWubeh}(h]h ]h"]h$]h&]uh1jhjrhKhjTubah}(h]h ]h"]h$]h&]uh1j hj8ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhj8ubh)}(hX!In almost all situations, rcu_read_unlock() is immune from deadlock. This deadlock immunity also extends to the scheduler's runqueue and priority-inheritance spinlocks, courtesy of the quiescent-state deferral that is carried out when rcu_read_unlock() is invoked with interrupts disabled.h]hX#In almost all situations, rcu_read_unlock() is immune from deadlock. This deadlock immunity also extends to the scheduler’s runqueue and priority-inheritance spinlocks, courtesy of the quiescent-state deferral that is carried out when rcu_read_unlock() is invoked with interrupts disabled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMYhj8ubh)}(h)See rcu_read_lock() for more information.h]h)See rcu_read_lock() for more information.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM_hj8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_read_lock_bh (C function)c.rcu_read_lock_bhhNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_read_lock_bh (void)h]j)}(hvoid rcu_read_lock_bh(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMmubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMmubj{)}(hrcu_read_lock_bhh]j)}(hrcu_read_lock_bhh]hrcu_read_lock_bh}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMmubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMmubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMmubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMmhjhhubj)}(hhh]h)}(h0mark the beginning of an RCU-bh critical sectionh]h0mark the beginning of an RCU-bh critical section}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMmhjPhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMmubeh}(h]h ](jfunctioneh"]h$]h&]jjjjkjjkjjjuh1jhhhjhNhNubj)}(hXb**Parameters** ``void`` no arguments **Description** This is equivalent to rcu_read_lock(), but also disables softirqs. Note that anything else that disables softirqs can also serve as an RCU read-side critical section. However, please note that this equivalence applies only to v5.0 and later. Before v5.0, rcu_read_lock() and rcu_read_lock_bh() were unrelated. Note that rcu_read_lock_bh() and the matching rcu_read_unlock_bh() must occur in the same context, for example, it is illegal to invoke rcu_read_unlock_bh() from one task if the matching rcu_read_lock_bh() was invoked from some other task.h](h)}(h**Parameters**h]j)}(hjuh]h Parameters}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMqhjoubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjoubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjoubh)}(hX7This is equivalent to rcu_read_lock(), but also disables softirqs. Note that anything else that disables softirqs can also serve as an RCU read-side critical section. However, please note that this equivalence applies only to v5.0 and later. Before v5.0, rcu_read_lock() and rcu_read_lock_bh() were unrelated.h]hX7This is equivalent to rcu_read_lock(), but also disables softirqs. Note that anything else that disables softirqs can also serve as an RCU read-side critical section. However, please note that this equivalence applies only to v5.0 and later. Before v5.0, rcu_read_lock() and rcu_read_lock_bh() were unrelated.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMnhjoubh)}(hNote that rcu_read_lock_bh() and the matching rcu_read_unlock_bh() must occur in the same context, for example, it is illegal to invoke rcu_read_unlock_bh() from one task if the matching rcu_read_lock_bh() was invoked from some other task.h]hNote that rcu_read_lock_bh() and the matching rcu_read_unlock_bh() must occur in the same context, for example, it is illegal to invoke rcu_read_unlock_bh() from one task if the matching rcu_read_lock_bh() was invoked from some other task.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMthjoubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_read_unlock_bh (C function)c.rcu_read_unlock_bhhNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_read_unlock_bh (void)h]j)}(hvoid rcu_read_unlock_bh(void)h](j )}(hvoidh]hvoid}(hj#hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj1hMubj{)}(hrcu_read_unlock_bhh]j)}(hrcu_read_unlock_bhh]hrcu_read_unlock_bh}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj1hMubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]noemphjjuh1jhjXubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj1hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj1hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj1hMhjhhubj)}(hhh]h)}(h4marks the end of a softirq-only RCU critical sectionh]h4marks the end of a softirq-only RCU critical section}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj1hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hf**Parameters** ``void`` no arguments **Description** See rcu_read_lock_bh() for more information.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjubh)}(h,See rcu_read_lock_bh() for more information.h]h,See rcu_read_lock_bh() for more information.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  rcu_read_lock_sched (C function)c.rcu_read_lock_schedhNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_read_lock_sched (void)h]j)}(hvoid rcu_read_lock_sched(void)h](j )}(hvoidh]hvoid}(hjKhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjGhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGhhhjYhMubj{)}(hrcu_read_lock_schedh]j)}(hrcu_read_lock_schedh]hrcu_read_lock_sched}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjGhhhjYhMubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjGhhhjYhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjChhhjYhMubah}(h]j>ah ](jjeh"]h$]h&]jj)jhuh1jhjYhMhj@hhubj)}(hhh]h)}(h2mark the beginning of a RCU-sched critical sectionh]h2mark the beginning of a RCU-sched critical section}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhj@hhhjYhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``void`` no arguments **Description** This is equivalent to rcu_read_lock(), but also disables preemption. Read-side critical sections can also be introduced by anything else that disables preemption, including local_irq_disable() and friends. However, please note that the equivalence to rcu_read_lock() applies only to v5.0 and later. Before v5.0, rcu_read_lock() and rcu_read_lock_sched() were unrelated. Note that rcu_read_lock_sched() and the matching rcu_read_unlock_sched() must occur in the same context, for example, it is illegal to invoke rcu_read_unlock_sched() from process context if the matching rcu_read_lock_sched() was invoked from an NMI handler.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj.h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjubh)}(hXsThis is equivalent to rcu_read_lock(), but also disables preemption. Read-side critical sections can also be introduced by anything else that disables preemption, including local_irq_disable() and friends. However, please note that the equivalence to rcu_read_lock() applies only to v5.0 and later. Before v5.0, rcu_read_lock() and rcu_read_lock_sched() were unrelated.h]hXsThis is equivalent to rcu_read_lock(), but also disables preemption. Read-side critical sections can also be introduced by anything else that disables preemption, including local_irq_disable() and friends. However, please note that the equivalence to rcu_read_lock() applies only to v5.0 and later. Before v5.0, rcu_read_lock() and rcu_read_lock_sched() were unrelated.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hXNote that rcu_read_lock_sched() and the matching rcu_read_unlock_sched() must occur in the same context, for example, it is illegal to invoke rcu_read_unlock_sched() from process context if the matching rcu_read_lock_sched() was invoked from an NMI handler.h]hXNote that rcu_read_lock_sched() and the matching rcu_read_unlock_sched() must occur in the same context, for example, it is illegal to invoke rcu_read_unlock_sched() from process context if the matching rcu_read_lock_sched() was invoked from an NMI handler.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "rcu_read_unlock_sched (C function)c.rcu_read_unlock_schedhNtauh1hhjhhhNhNubj)}(hhh](j)}(h!void rcu_read_unlock_sched (void)h]j)}(h void rcu_read_unlock_sched(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~hhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~hhhjhMubj{)}(hrcu_read_unlock_schedh]j)}(hrcu_read_unlock_schedh]hrcu_read_unlock_sched}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj~hhhjhMubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhj~hhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjzhhhjhMubah}(h]juah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjwhhubj)}(hhh]h)}(h/marks the end of a RCU-classic critical sectionh]h/marks the end of a RCU-classic critical section}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjwhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hi**Parameters** ``void`` no arguments **Description** See rcu_read_lock_sched() for more information.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj*h]hvoid}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhj$ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hKhj@ubah}(h]h ]h"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]uh1jhj?hKhj!ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjeh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhKhjubh)}(h/See rcu_read_lock_sched() for more information.h]h/See rcu_read_lock_sched() for more information.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j RCU_INIT_POINTER (C macro)c.RCU_INIT_POINTERhNtauh1hhjhhhNhNubj)}(hhh](j)}(hRCU_INIT_POINTERh]j)}(hRCU_INIT_POINTERh]j{)}(hRCU_INIT_POINTERh]j)}(hjh]hRCU_INIT_POINTER}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h``RCU_INIT_POINTER (p, v)``h]j)}(hjh]hRCU_INIT_POINTER (p, v)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h$initialize an RCU protected pointer h]h)}(h#initialize an RCU protected pointerh]h#initialize an RCU protected pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(hX<**Parameters** ``p`` The pointer to be initialized. ``v`` The value to initialized the pointer to. **Description** Initialize an RCU-protected pointer in special cases where readers do not need ordering constraints on the CPU or the compiler. These special cases are: 1. This use of RCU_INIT_POINTER() is NULLing out the pointer *or* 2. The caller has taken whatever steps are required to prevent RCU readers from concurrently accessing this pointer *or* 3. The referenced data structure has already been exposed to readers either at compile time or via rcu_assign_pointer() *and* a. You have not made *any* reader-visible changes to this structure since then *or* b. It is OK for readers accessing this structure from its new location to see the old state of the structure. (For example, the changes were to statistical counters or to other state where exact synchronization is not required.) Failure to follow these rules governing use of RCU_INIT_POINTER() will result in impossible-to-diagnose memory corruption. As in the structures will look OK in crash dumps, but any concurrent RCU readers might see pre-initialized values of the referenced data structure. So please be very careful how you use RCU_INIT_POINTER()!!! If you are creating an RCU-protected linked structure that is accessed by a single external-to-structure RCU-protected pointer, then you may use RCU_INIT_POINTER() to initialize the internal RCU-protected pointers, but you must use rcu_assign_pointer() to initialize the external-to-structure pointer *after* you have completely initialized the reader-accessible portions of the linked structure. Note that unlike rcu_assign_pointer(), RCU_INIT_POINTER() provides no ordering guarantees for either the CPU or the compiler.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh](j)}(h%``p`` The pointer to be initialized. h](j)}(h``p``h]j)}(hj4h]hp}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhj.ubj2)}(hhh]h)}(hThe pointer to be initialized.h]hThe pointer to be initialized.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhMhjJubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhMhj+ubj)}(h/``v`` The value to initialized the pointer to. h](j)}(h``v``h]j)}(hjmh]hv}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjgubj2)}(hhh]h)}(h(The value to initialized the pointer to.h]h(The value to initialized the pointer to.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjgubeh}(h]h ]h"]h$]h&]uh1jhjhMhj+ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hInitialize an RCU-protected pointer in special cases where readers do not need ordering constraints on the CPU or the compiler. These special cases are:h]hInitialize an RCU-protected pointer in special cases where readers do not need ordering constraints on the CPU or the compiler. These special cases are:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubjG)}(hhh](j)}(h>This use of RCU_INIT_POINTER() is NULLing out the pointer *or*h]h)}(hjh](h:This use of RCU_INIT_POINTER() is NULLing out the pointer }(hjhhhNhNubj)}(h*or*h]hor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(huThe caller has taken whatever steps are required to prevent RCU readers from concurrently accessing this pointer *or*h]h)}(huThe caller has taken whatever steps are required to prevent RCU readers from concurrently accessing this pointer *or*h](hqThe caller has taken whatever steps are required to prevent RCU readers from concurrently accessing this pointer }(hjhhhNhNubj)}(h*or*h]hor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hXThe referenced data structure has already been exposed to readers either at compile time or via rcu_assign_pointer() *and* a. You have not made *any* reader-visible changes to this structure since then *or* b. It is OK for readers accessing this structure from its new location to see the old state of the structure. (For example, the changes were to statistical counters or to other state where exact synchronization is not required.) h](h)}(hzThe referenced data structure has already been exposed to readers either at compile time or via rcu_assign_pointer() *and*h](huThe referenced data structure has already been exposed to readers either at compile time or via rcu_assign_pointer() }(hj!hhhNhNubj)}(h*and*h]hand}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubjG)}(hhh](j)}(hPYou have not made *any* reader-visible changes to this structure since then *or*h]h)}(hPYou have not made *any* reader-visible changes to this structure since then *or*h](hYou have not made }(hjEhhhNhNubj)}(h*any*h]hany}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh5 reader-visible changes to this structure since then }(hjEhhhNhNubj)}(h*or*h]hor}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjAubah}(h]h ]h"]h$]h&]uh1jhj>ubj)}(hIt is OK for readers accessing this structure from its new location to see the old state of the structure. (For example, the changes were to statistical counters or to other state where exact synchronization is not required.) h]h)}(hIt is OK for readers accessing this structure from its new location to see the old state of the structure. (For example, the changes were to statistical counters or to other state where exact synchronization is not required.)h]hIt is OK for readers accessing this structure from its new location to see the old state of the structure. (For example, the changes were to statistical counters or to other state where exact synchronization is not required.)}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjzubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]j}HjjHhjHjHuh1jGhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]j}Hj~HjHhjHjHuh1jGhjubh)}(hXLFailure to follow these rules governing use of RCU_INIT_POINTER() will result in impossible-to-diagnose memory corruption. As in the structures will look OK in crash dumps, but any concurrent RCU readers might see pre-initialized values of the referenced data structure. So please be very careful how you use RCU_INIT_POINTER()!!!h]hXLFailure to follow these rules governing use of RCU_INIT_POINTER() will result in impossible-to-diagnose memory corruption. As in the structures will look OK in crash dumps, but any concurrent RCU readers might see pre-initialized values of the referenced data structure. So please be very careful how you use RCU_INIT_POINTER()!!!}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hXIf you are creating an RCU-protected linked structure that is accessed by a single external-to-structure RCU-protected pointer, then you may use RCU_INIT_POINTER() to initialize the internal RCU-protected pointers, but you must use rcu_assign_pointer() to initialize the external-to-structure pointer *after* you have completely initialized the reader-accessible portions of the linked structure.h](hX-If you are creating an RCU-protected linked structure that is accessed by a single external-to-structure RCU-protected pointer, then you may use RCU_INIT_POINTER() to initialize the internal RCU-protected pointers, but you must use rcu_assign_pointer() to initialize the external-to-structure pointer }(hjhhhNhNubj)}(h*after*h]hafter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX you have completely initialized the reader-accessible portions of the linked structure.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(h}Note that unlike rcu_assign_pointer(), RCU_INIT_POINTER() provides no ordering guarantees for either the CPU or the compiler.h]h}Note that unlike rcu_assign_pointer(), RCU_INIT_POINTER() provides no ordering guarantees for either the CPU or the compiler.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !RCU_POINTER_INITIALIZER (C macro)c.RCU_POINTER_INITIALIZERhNtauh1hhjhhhNhNubj)}(hhh](j)}(hRCU_POINTER_INITIALIZERh]j)}(hRCU_POINTER_INITIALIZERh]j{)}(hRCU_POINTER_INITIALIZERh]j)}(hjh]hRCU_POINTER_INITIALIZER}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjj4jj4jjjuh1jhhhjhNhNubh)}(h"``RCU_POINTER_INITIALIZER (p, v)``h]j)}(hj:h]hRCU_POINTER_INITIALIZER (p, v)}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h/statically initialize an RCU protected pointer h]h)}(h.statically initialize an RCU protected pointerh]h.statically initialize an RCU protected pointer}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjPubah}(h]h ]h"]h$]h&]uh1jhjbhMhjhhubj)}(h**Parameters** ``p`` The pointer to be initialized. ``v`` The value to initialized the pointer to. **Description** GCC-style initialization for an RCU-protected pointer in a structure field.h](h)}(h**Parameters**h]j)}(hjoh]h Parameters}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjiubj )}(hhh](j)}(h%``p`` The pointer to be initialized. h](j)}(h``p``h]j)}(hjh]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(hThe pointer to be initialized.h]hThe pointer to be initialized.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h/``v`` The value to initialized the pointer to. h](j)}(h``v``h]j)}(hjh]hv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h(The value to initialized the pointer to.h]h(The value to initialized the pointer to.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjiubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjiubh)}(hKGCC-style initialization for an RCU-protected pointer in a structure field.h]hKGCC-style initialization for an RCU-protected pointer in a structure field.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kfree_rcu (C macro) c.kfree_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h kfree_rcuh]j)}(h kfree_rcuh]j{)}(h kfree_rcuh]j)}(hjAh]h kfree_rcu}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjChhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj?hhhj^hMubah}(h]j:ah ](jjeh"]h$]h&]jj)jhuh1jhj^hMhj<hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj<hhhj^hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjwjjwjjjuh1jhhhjhNhNubh)}(h``kfree_rcu (ptr, rhf)``h]j)}(hj}h]hkfree_rcu (ptr, rhf)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubj)}(h&kfree an object after a grace period. h]h)}(h%kfree an object after a grace period.h]h%kfree an object after a grace period.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(hX?**Parameters** ``ptr`` pointer to kfree for double-argument invocations. ``rhf`` the name of the struct rcu_head within the type of **ptr**. **Description** Many rcu callbacks functions just call kfree() on the base structure. These functions are trivial, but their size adds up, and furthermore when they are used in a kernel module, that module must invoke the high-latency rcu_barrier() function at module-unload time. The kfree_rcu() function handles this issue. In order to have a universal callback function handling different offsets of rcu_head, the callback needs to determine the starting address of the freed object, which can be a large kmalloc or vmalloc allocation. To allow simply aligning the pointer down to page boundary for those, only offsets up to 4095 bytes can be accommodated. If the offset is larger than 4095 bytes, a compile-time error will be generated in kvfree_rcu_arg_2(). If this error is triggered, you can either fall back to use of call_rcu() or rearrange the structure to position the rcu_head structure into the first 4096 bytes. The object to be freed can be allocated either by kmalloc(), kmalloc_nolock(), or kmem_cache_alloc(). Note that the allowable offset might decrease in the future. The BUILD_BUG_ON check must not involve any function calls, hence the checks are done in macros here.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh](j)}(h:``ptr`` pointer to kfree for double-argument invocations. h](j)}(h``ptr``h]j)}(hjh]hptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h1pointer to kfree for double-argument invocations.h]h1pointer to kfree for double-argument invocations.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hD``rhf`` the name of the struct rcu_head within the type of **ptr**. h](j)}(h``rhf``h]j)}(hj h]hrhf}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(h;the name of the struct rcu_head within the type of **ptr**.h](h3the name of the struct rcu_head within the type of }(hj#hhhNhNubj)}(h**ptr**h]hptr}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjWh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hXMany rcu callbacks functions just call kfree() on the base structure. These functions are trivial, but their size adds up, and furthermore when they are used in a kernel module, that module must invoke the high-latency rcu_barrier() function at module-unload time.h]hXMany rcu callbacks functions just call kfree() on the base structure. These functions are trivial, but their size adds up, and furthermore when they are used in a kernel module, that module must invoke the high-latency rcu_barrier() function at module-unload time.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hXThe kfree_rcu() function handles this issue. In order to have a universal callback function handling different offsets of rcu_head, the callback needs to determine the starting address of the freed object, which can be a large kmalloc or vmalloc allocation. To allow simply aligning the pointer down to page boundary for those, only offsets up to 4095 bytes can be accommodated. If the offset is larger than 4095 bytes, a compile-time error will be generated in kvfree_rcu_arg_2(). If this error is triggered, you can either fall back to use of call_rcu() or rearrange the structure to position the rcu_head structure into the first 4096 bytes.h]hXThe kfree_rcu() function handles this issue. In order to have a universal callback function handling different offsets of rcu_head, the callback needs to determine the starting address of the freed object, which can be a large kmalloc or vmalloc allocation. To allow simply aligning the pointer down to page boundary for those, only offsets up to 4095 bytes can be accommodated. If the offset is larger than 4095 bytes, a compile-time error will be generated in kvfree_rcu_arg_2(). If this error is triggered, you can either fall back to use of call_rcu() or rearrange the structure to position the rcu_head structure into the first 4096 bytes.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM hjubh)}(heThe object to be freed can be allocated either by kmalloc(), kmalloc_nolock(), or kmem_cache_alloc().h]heThe object to be freed can be allocated either by kmalloc(), kmalloc_nolock(), or kmem_cache_alloc().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhM*hjubh)}(hah"]h$]h&]uh1j1hj9hhhjKhMuubj{)}(h rcu_head_inith]j)}(h rcu_head_inith]h rcu_head_init}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj9hhhjKhMuubj)}(h(struct rcu_head *rhp)h]j)}(hstruct rcu_head *rhph](j)}(hjAh]hstruct}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubh)}(hhh]j)}(hrcu_headh]hrcu_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j`sbc.rcu_head_initasbuh1hhjvubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj)}(hrhph]hrhp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjrubah}(h]h ]h"]h$]h&]jjuh1jhj9hhhjKhMuubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj5hhhjKhMuubah}(h]j0ah ](jjeh"]h$]h&]jj)jhuh1jhjKhMuhj2hhubj)}(hhh]h)}(h1Initialize rcu_head for rcu_head_after_call_rcu()h]h1Initialize rcu_head for rcu_head_after_call_rcu()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMuhjhhubah}(h]h ]h"]h$]h&]uh1jhj2hhhjKhMuubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_head *rhp`` The rcu_head structure to initialize. **Description** If you intend to invoke rcu_head_after_call_rcu() to test whether a given rcu_head structure has already been passed to call_rcu(), then you must also invoke this rcu_head_init() function on it just after allocating that structure. Calls to this function must not race with calls to call_rcu(), rcu_head_after_call_rcu(), or callback invocation.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMyhjubj )}(hhh]j)}(h?``struct rcu_head *rhp`` The rcu_head structure to initialize. h](j)}(h``struct rcu_head *rhp``h]j)}(hj>h]hstruct rcu_head *rhp}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMvhj8ubj2)}(hhh]h)}(h%The rcu_head structure to initialize.h]h%The rcu_head structure to initialize.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMvhjTubah}(h]h ]h"]h$]h&]uh1j1hj8ubeh}(h]h ]h"]h$]h&]uh1jhjShMvhj5ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjyh]h Description}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMxhjubh)}(hXZIf you intend to invoke rcu_head_after_call_rcu() to test whether a given rcu_head structure has already been passed to call_rcu(), then you must also invoke this rcu_head_init() function on it just after allocating that structure. Calls to this function must not race with calls to call_rcu(), rcu_head_after_call_rcu(), or callback invocation.h]hXZIf you intend to invoke rcu_head_after_call_rcu() to test whether a given rcu_head structure has already been passed to call_rcu(), then you must also invoke this rcu_head_init() function on it just after allocating that structure. Calls to this function must not race with calls to call_rcu(), rcu_head_after_call_rcu(), or callback invocation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMwhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $rcu_head_after_call_rcu (C function)c.rcu_head_after_call_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hEbool rcu_head_after_call_rcu (struct rcu_head *rhp, rcu_callback_t f)h]j)}(hDbool rcu_head_after_call_rcu(struct rcu_head *rhp, rcu_callback_t f)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hrcu_head_after_call_rcuh]j)}(hrcu_head_after_call_rcuh]hrcu_head_after_call_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h((struct rcu_head *rhp, rcu_callback_t f)h](j)}(hstruct rcu_head *rhph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hrcu_headh]hrcu_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.rcu_head_after_call_rcuasbuh1hhjubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrhph]hrhp}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hrcu_callback_t fh](h)}(hhh]j)}(hrcu_callback_th]hrcu_callback_t}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjqmodnameN classnameNj] j` )}jc ]j4c.rcu_head_after_call_rcuasbuh1hhjhubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhubj)}(hfh]hf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h,Has this rcu_head been passed to call_rcu()?h]h,Has this rcu_head been passed to call_rcu()?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_head *rhp`` The rcu_head structure to test. ``rcu_callback_t f`` The function passed to call_rcu() along with **rhp**. **Description** Returns **true** if the **rhp** has been passed to call_rcu() with **func**, and **false** otherwise. Emits a warning in any other case, including the case where **rhp** has already been invoked after a grace period. Calls to this function must not race with callback invocation. One way to avoid such races is to enclose the call to rcu_head_after_call_rcu() in an RCU read-side critical section that includes a read-side fetch of the pointer to the structure containing **rhp**.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj )}(hhh](j)}(h9``struct rcu_head *rhp`` The rcu_head structure to test. h](j)}(h``struct rcu_head *rhp``h]j)}(hjh]hstruct rcu_head *rhp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubj2)}(hhh]h)}(hThe rcu_head structure to test.h]hThe rcu_head structure to test.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hK``rcu_callback_t f`` The function passed to call_rcu() along with **rhp**. h](j)}(h``rcu_callback_t f``h]j)}(hj?h]hrcu_callback_t f}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhj9ubj2)}(hhh]h)}(h5The function passed to call_rcu() along with **rhp**.h](h-The function passed to call_rcu() along with }(hjXhhhNhNubj)}(h**rhp**h]hrhp}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh.}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjThMhjUubah}(h]h ]h"]h$]h&]uh1j1hj9ubeh}(h]h ]h"]h$]h&]uh1jhjThMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubh)}(hXReturns **true** if the **rhp** has been passed to call_rcu() with **func**, and **false** otherwise. Emits a warning in any other case, including the case where **rhp** has already been invoked after a grace period. Calls to this function must not race with callback invocation. One way to avoid such races is to enclose the call to rcu_head_after_call_rcu() in an RCU read-side critical section that includes a read-side fetch of the pointer to the structure containing **rhp**.h](hReturns }(hjhhhNhNubj)}(h**true**h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if the }(hjhhhNhNubj)}(h**rhp**h]hrhp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh$ has been passed to call_rcu() with }(hjhhhNhNubj)}(h**func**h]hfunc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, and }(hjhhhNhNubj)}(h **false**h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhI otherwise. Emits a warning in any other case, including the case where }(hjhhhNhNubj)}(h**rhp**h]hrhp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX0 has already been invoked after a grace period. Calls to this function must not race with callback invocation. One way to avoid such races is to enclose the call to rcu_head_after_call_rcu() in an RCU read-side critical section that includes a read-side fetch of the pointer to the structure containing }(hjhhhNhNubj)}(h**rhp**h]hrhp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:399: ./include/linux/rcupdate.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_softirq_qs (C function)c.rcu_softirq_qshNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_softirq_qs (void)h]j)}(hvoid rcu_softirq_qs(void)h](j )}(hvoidh]hvoid}(hj=hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj9hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj9hhhjKhKubj{)}(hrcu_softirq_qsh]j)}(hrcu_softirq_qsh]hrcu_softirq_qs}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj9hhhjKhKubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjzhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]noemphjjuh1jhjrubah}(h]h ]h"]h$]h&]jjuh1jhj9hhhjKhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj5hhhjKhKubah}(h]j0ah ](jjeh"]h$]h&]jj)jhuh1jhjKhKhj2hhubj)}(hhh]h)}(h;Provide a set of RCU quiescent states in softirq processingh]h;Provide a set of RCU quiescent states in softirq processing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhj2hhhjKhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX;**Parameters** ``void`` no arguments **Description** Mark a quiescent state for RCU, Tasks RCU, and Tasks Trace RCU. This is a special-purpose function to be used in the softirq infrastructure and perhaps the occasional long-running softirq handler. Note that from RCU's viewpoint, a call to rcu_softirq_qs() is equivalent to momentarily completely enabling preemption. For example, given this code:: local_bh_disable(); do_something(); rcu_softirq_qs(); // A do_something_else(); local_bh_enable(); // B A call to synchronize_rcu() that began concurrently with the call to do_something() would be guaranteed to wait only until execution reached statement A. Without that rcu_softirq_qs(), that same synchronize_rcu() would instead be guaranteed to wait until execution reached statement B.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj h]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubh)}(hMark a quiescent state for RCU, Tasks RCU, and Tasks Trace RCU. This is a special-purpose function to be used in the softirq infrastructure and perhaps the occasional long-running softirq handler.h]hMark a quiescent state for RCU, Tasks RCU, and Tasks Trace RCU. This is a special-purpose function to be used in the softirq infrastructure and perhaps the occasional long-running softirq handler.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubh)}(hNote that from RCU's viewpoint, a call to rcu_softirq_qs() is equivalent to momentarily completely enabling preemption. For example, given this code::h]hNote that from RCU’s viewpoint, a call to rcu_softirq_qs() is equivalent to momentarily completely enabling preemption. For example, given this code:}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubj7C)}(hilocal_bh_disable(); do_something(); rcu_softirq_qs(); // A do_something_else(); local_bh_enable(); // Bh]hilocal_bh_disable(); do_something(); rcu_softirq_qs(); // A do_something_else(); local_bh_enable(); // B}hjTsbah}(h]h ]h"]h$]h&]jjuh1j6ChV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubh)}(hXA call to synchronize_rcu() that began concurrently with the call to do_something() would be guaranteed to wait only until execution reached statement A. Without that rcu_softirq_qs(), that same synchronize_rcu() would instead be guaranteed to wait until execution reached statement B.h]hXA call to synchronize_rcu() that began concurrently with the call to do_something() would be guaranteed to wait only until execution reached statement A. Without that rcu_softirq_qs(), that same synchronize_rcu() would instead be guaranteed to wait until execution reached statement B.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ,rcu_watching_snap_stopped_since (C function)!c.rcu_watching_snap_stopped_sincehNtauh1hhjhhhNhNubj)}(hhh](j)}(hEbool rcu_watching_snap_stopped_since (struct rcu_data *rdp, int snap)h]j)}(hDbool rcu_watching_snap_stopped_since(struct rcu_data *rdp, int snap)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM,ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM,ubj{)}(hrcu_watching_snap_stopped_sinceh]j)}(hrcu_watching_snap_stopped_sinceh]hrcu_watching_snap_stopped_since}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM,ubj)}(h (struct rcu_data *rdp, int snap)h](j)}(hstruct rcu_data *rdph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hrcu_datah]hrcu_data}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb!c.rcu_watching_snap_stopped_sinceasbuh1hhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrdph]hrdp}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hint snaph](j )}(hinth]hint}(hj@hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj<ubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubj)}(hsnaph]hsnap}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM,ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM,ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM,hjhhubj)}(hhh]h)}(hBHas RCU stopped watching a given CPU since the specified **snap**?h](h9Has RCU stopped watching a given CPU since the specified }(hjhhhNhNubj)}(h**snap**h]hsnap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh?}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM,hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM,ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_data *rdp`` The rcu_data corresponding to the CPU for which to check EQS. ``int snap`` rcu_watching snapshot taken when the CPU wasn't in an EQS. **Description** Returns true if the CPU corresponding to **rdp** has spent some time in an extended quiescent state since **snap**. Note that this doesn't check if it /still/ is in an EQS, just that it went through one since **snap**. This is meant to be used in a loop waiting for a CPU to go through an EQS.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM0hjubj )}(hhh](j)}(hW``struct rcu_data *rdp`` The rcu_data corresponding to the CPU for which to check EQS. h](j)}(h``struct rcu_data *rdp``h]j)}(hjh]hstruct rcu_data *rdp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM/hjubj2)}(hhh]h)}(h=The rcu_data corresponding to the CPU for which to check EQS.h]h=The rcu_data corresponding to the CPU for which to check EQS.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM/hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM/hjubj)}(hH``int snap`` rcu_watching snapshot taken when the CPU wasn't in an EQS. h](j)}(h ``int snap``h]j)}(hjh]hint snap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM0hj ubj2)}(hhh]h)}(h:rcu_watching snapshot taken when the CPU wasn't in an EQS.h]hah"]h$]h&]uh1j1hjhhhjhMsubj{)}(hrcu_is_cpu_rrupt_from_idleh]j)}(hrcu_is_cpu_rrupt_from_idleh]hrcu_is_cpu_rrupt_from_idle}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMsubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMsubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMsubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMshjhhubj)}(hhh]h)}(hsee if 'interrupted' from idleh]h"see if ‘interrupted’ from idle}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMshj;hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMsubeh}(h]h ](jfunctioneh"]h$]h&]jjjjVjjVjjjuh1jhhhjhNhNubj)}(h**Parameters** ``void`` no arguments **Description** If the current CPU is idle and running at a first-level (not nested) interrupt, or directly, from idle, return true. The caller must have at least disabled IRQs.h](h)}(h**Parameters**h]j)}(hj`h]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMwhjZubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjyubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjyubeh}(h]h ]h"]h$]h&]uh1jhjhKhjvubah}(h]h ]h"]h$]h&]uh1j hjZubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjZubh)}(htIf the current CPU is idle and running at a first-level (not nested) interrupt, or directly, from idle, return true.h]htIf the current CPU is idle and running at a first-level (not nested) interrupt, or directly, from idle, return true.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMthjZubh)}(h,The caller must have at least disabled IRQs.h]h,The caller must have at least disabled IRQs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMwhjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'rcu_irq_exit_check_preempt (C function)c.rcu_irq_exit_check_preempthNtauh1hhjhhhNhNubj)}(hhh](j)}(h&void rcu_irq_exit_check_preempt (void)h]j)}(h%void rcu_irq_exit_check_preempt(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMkubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhMkubj{)}(hrcu_irq_exit_check_preempth]j)}(hrcu_irq_exit_check_preempth]hrcu_irq_exit_check_preempt}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhMkubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjKhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]noemphjjuh1jhjCubah}(h]h ]h"]h$]h&]jjuh1jhj hhhjhMkubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMkubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMkhjhhubj)}(hhh]h)}(h$Validate that scheduling is possibleh]h$Validate that scheduling is possible}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMkhjrhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMkubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h'**Parameters** ``void`` no argumentsh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMohjubj )}(hhh]j)}(h``void`` no argumentsh](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMqhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMqhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j '__rcu_irq_enter_check_tick (C function)c.__rcu_irq_enter_check_tickhNtauh1hhjhhhNhNubj)}(hhh](j)}(h&void __rcu_irq_enter_check_tick (void)h]j)}(h%void __rcu_irq_enter_check_tick(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhM}ubj{)}(h__rcu_irq_enter_check_tickh]j)}(h__rcu_irq_enter_check_tickh]h__rcu_irq_enter_check_tick}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhM}ubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjMhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]noemphjjuh1jhjEubah}(h]h ]h"]h$]h&]jjuh1jhj hhhjhM}ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM}ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM}hjhhubj)}(hhh]h)}(h-Enable scheduler tick on CPU if RCU needs it.h]h-Enable scheduler tick on CPU if RCU needs it.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM}hjthhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM}ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``void`` no arguments **Description** The scheduler tick is not normally enabled when CPUs enter the kernel from nohz_full userspace execution. After all, nohz_full userspace execution is an RCU quiescent state and the time executing in the kernel is quite short. Except of course when it isn't. And it is not hard to cause a large system to spend tens of seconds or even minutes looping in the kernel, which can cause a number of problems, include RCU CPU stall warnings. Therefore, if a nohz_full CPU fails to report a quiescent state in a timely manner, the RCU grace-period kthread sets that CPU's ->rcu_urgent_qs flag with the expectation that the next interrupt or exception will invoke this function, which will turn on the scheduler tick, which will enable RCU to detect that CPU's quiescent states, for example, due to cond_resched() calls in CONFIG_PREEMPT=n kernels. The tick will be disabled once a quiescent state is reported for this CPU. Of course, in carefully tuned systems, there might never be an interrupt or exception. In that case, the RCU grace-period kthread will eventually cause one to happen. However, in less carefully controlled environments, this function allows RCU to get what it needs without creating otherwise useless interruptions.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubh)}(hXThe scheduler tick is not normally enabled when CPUs enter the kernel from nohz_full userspace execution. After all, nohz_full userspace execution is an RCU quiescent state and the time executing in the kernel is quite short. Except of course when it isn't. And it is not hard to cause a large system to spend tens of seconds or even minutes looping in the kernel, which can cause a number of problems, include RCU CPU stall warnings.h]hXThe scheduler tick is not normally enabled when CPUs enter the kernel from nohz_full userspace execution. After all, nohz_full userspace execution is an RCU quiescent state and the time executing in the kernel is quite short. Except of course when it isn’t. And it is not hard to cause a large system to spend tens of seconds or even minutes looping in the kernel, which can cause a number of problems, include RCU CPU stall warnings.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM~hjubh)}(hXTherefore, if a nohz_full CPU fails to report a quiescent state in a timely manner, the RCU grace-period kthread sets that CPU's ->rcu_urgent_qs flag with the expectation that the next interrupt or exception will invoke this function, which will turn on the scheduler tick, which will enable RCU to detect that CPU's quiescent states, for example, due to cond_resched() calls in CONFIG_PREEMPT=n kernels. The tick will be disabled once a quiescent state is reported for this CPU.h]hXTherefore, if a nohz_full CPU fails to report a quiescent state in a timely manner, the RCU grace-period kthread sets that CPU’s ->rcu_urgent_qs flag with the expectation that the next interrupt or exception will invoke this function, which will turn on the scheduler tick, which will enable RCU to detect that CPU’s quiescent states, for example, due to cond_resched() calls in CONFIG_PREEMPT=n kernels. The tick will be disabled once a quiescent state is reported for this CPU.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjubh)}(hX<Of course, in carefully tuned systems, there might never be an interrupt or exception. In that case, the RCU grace-period kthread will eventually cause one to happen. However, in less carefully controlled environments, this function allows RCU to get what it needs without creating otherwise useless interruptions.h]hX<Of course, in carefully tuned systems, there might never be an interrupt or exception. In that case, the RCU grace-period kthread will eventually cause one to happen. However, in less carefully controlled environments, this function allows RCU to get what it needs without creating otherwise useless interruptions.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_is_watching (C function)c.rcu_is_watchinghNtauh1hhjhhhNhNubj)}(hhh](j)}(h#notrace bool rcu_is_watching (void)h]j)}(h"notrace bool rcu_is_watching(void)h](hnotrace}(hjRhhhNhNubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMubj )}(hj8h]hbool}(hjihhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjRhhhjhhMubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRhhhjhhMubj{)}(hrcu_is_watchingh]j)}(hrcu_is_watchingh]hrcu_is_watching}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjRhhhjhhMubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjRhhhjhhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjNhhhjhhMubah}(h]jIah ](jjeh"]h$]h&]jj)jhuh1jhjhhMhjKhhubj)}(hhh]h)}(h9RCU read-side critical sections permitted on current CPU?h]h9RCU read-side critical sections permitted on current CPU?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjKhhhjhhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXo**Parameters** ``void`` no arguments **Description** Return **true** if RCU is watching the running CPU and **false** otherwise. An **true** return means that this CPU can safely enter RCU read-side critical sections. Although calls to rcu_is_watching() from most parts of the kernel will return **true**, there are important exceptions. For example, if the current CPU is deep within its idle loop, in kernel entry/exit code, or offline, rcu_is_watching() will return **false**. Make notrace because it can be called by the internal functions of ftrace, and making this notrace removes unnecessary recursion calls.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhj ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hKhj%ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj$hKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjJh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubh)}(hReturn **true** if RCU is watching the running CPU and **false** otherwise. An **true** return means that this CPU can safely enter RCU read-side critical sections.h](hReturn }(hj`hhhNhNubj)}(h**true**h]htrue}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubh( if RCU is watching the running CPU and }(hj`hhhNhNubj)}(h **false**h]hfalse}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubh otherwise. An }(hj`hhhNhNubj)}(h**true**h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubhM return means that this CPU can safely enter RCU read-side critical sections.}(hj`hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjubh)}(hXAlthough calls to rcu_is_watching() from most parts of the kernel will return **true**, there are important exceptions. For example, if the current CPU is deep within its idle loop, in kernel entry/exit code, or offline, rcu_is_watching() will return **false**.h](hNAlthough calls to rcu_is_watching() from most parts of the kernel will return }(hjhhhNhNubj)}(h**true**h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, there are important exceptions. For example, if the current CPU is deep within its idle loop, in kernel entry/exit code, or offline, rcu_is_watching() will return }(hjhhhNhNubj)}(h **false**h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjubh)}(hMake notrace because it can be called by the internal functions of ftrace, and making this notrace removes unnecessary recursion calls.h]hMake notrace because it can be called by the internal functions of ftrace, and making this notrace removes unnecessary recursion calls.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_set_gpwrap_lag (C function)c.rcu_set_gpwrap_laghNtauh1hhjhhhNhNubj)}(hhh](j)}(h/void rcu_set_gpwrap_lag (unsigned long lag_gps)h]j)}(h.void rcu_set_gpwrap_lag(unsigned long lag_gps)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM ubj{)}(hrcu_set_gpwrap_lagh]j)}(hrcu_set_gpwrap_lagh]hrcu_set_gpwrap_lag}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM ubj)}(h(unsigned long lag_gps)h]j)}(hunsigned long lag_gpsh](j )}(hunsignedh]hunsigned}(hjDhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj@ubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@ubj )}(hlongh]hlong}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj@ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@ubj)}(hlag_gpsh]hlag_gps}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h'Set RCU GP sequence overflow lag value.h]h'Set RCU GP sequence overflow lag value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``unsigned long lag_gps`` Set overflow lag to this many grace period worth of counters which is used by rcutorture to quickly force a gpwrap situation. **lag_gps** = 0 means we reset it back to the boot-time value.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjubj )}(hhh]j)}(h``unsigned long lag_gps`` Set overflow lag to this many grace period worth of counters which is used by rcutorture to quickly force a gpwrap situation. **lag_gps** = 0 means we reset it back to the boot-time value.h](j)}(h``unsigned long lag_gps``h]j)}(hjh]hunsigned long lag_gps}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubj2)}(hhh]h)}(hSet overflow lag to this many grace period worth of counters which is used by rcutorture to quickly force a gpwrap situation. **lag_gps** = 0 means we reset it back to the boot-time value.h](h~Set overflow lag to this many grace period worth of counters which is used by rcutorture to quickly force a gpwrap situation. }(hjhhhNhNubj)}(h **lag_gps**h]hlag_gps}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh3 = 0 means we reset it back to the boot-time value.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j call_rcu_hurry (C function)c.call_rcu_hurryhNtauh1hhjhhhNhNubj)}(hhh](j)}(h@void call_rcu_hurry (struct rcu_head *head, rcu_callback_t func)h]j)}(h?void call_rcu_hurry(struct rcu_head *head, rcu_callback_t func)h](j )}(hvoidh]hvoid}(hjShhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjOhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMx ubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOhhhjahMx ubj{)}(hcall_rcu_hurryh]j)}(hcall_rcu_hurryh]hcall_rcu_hurry}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjOhhhjahMx ubj)}(h,(struct rcu_head *head, rcu_callback_t func)h](j)}(hstruct rcu_head *headh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hrcu_headh]hrcu_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jvsbc.call_rcu_hurryasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hheadh]hhead}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hrcu_callback_t funch](h)}(hhh]j)}(hrcu_callback_th]hrcu_callback_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.call_rcu_hurryasbuh1hhjubj2)}(h h]h }(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hfunch]hfunc}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjOhhhjahMx ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjKhhhjahMx ubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhjahMx hjHhhubj)}(hhh]h)}(hQueue RCU callback for invocation after grace period, and flush all lazy callbacks (including the new one) to the main ->cblist while doing so.h]hQueue RCU callback for invocation after grace period, and flush all lazy callbacks (including the new one) to the main ->cblist while doing so.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMx hjXhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjahMx ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjsjjsjjjuh1jhhhjhNhNubj)}(hXS**Parameters** ``struct rcu_head *head`` structure to be used for queueing the RCU updates. ``rcu_callback_t func`` actual callback function to be invoked after the grace period **Description** The callback function will be invoked some time after a full grace period elapses, in other words after all pre-existing RCU read-side critical sections have completed. Use this API instead of call_rcu() if you don't want the callback to be delayed for very long periods of time, which can happen on systems without memory pressure and on systems which are lightly loaded or mostly idle. This function will cause callbacks to be invoked sooner than later at the expense of extra power. Other than that, this function is identical to, and reuses call_rcu()'s logic. Refer to call_rcu() for more details about memory ordering and other functionality.h](h)}(h**Parameters**h]j)}(hj}h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM| hjwubj )}(hhh](j)}(hM``struct rcu_head *head`` structure to be used for queueing the RCU updates. h](j)}(h``struct rcu_head *head``h]j)}(hjh]hstruct rcu_head *head}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM| hjubj2)}(hhh]h)}(h2structure to be used for queueing the RCU updates.h]h2structure to be used for queueing the RCU updates.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM| hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM| hjubj)}(hV``rcu_callback_t func`` actual callback function to be invoked after the grace period h](j)}(h``rcu_callback_t func``h]j)}(hjh]hrcu_callback_t func}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM} hjubj2)}(hhh]h)}(h=actual callback function to be invoked after the grace periodh]h=actual callback function to be invoked after the grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM} hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM} hjubeh}(h]h ]h"]h$]h&]uh1j hjwubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjwubh)}(hThe callback function will be invoked some time after a full grace period elapses, in other words after all pre-existing RCU read-side critical sections have completed.h]hThe callback function will be invoked some time after a full grace period elapses, in other words after all pre-existing RCU read-side critical sections have completed.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM~ hjwubh)}(hXUse this API instead of call_rcu() if you don't want the callback to be delayed for very long periods of time, which can happen on systems without memory pressure and on systems which are lightly loaded or mostly idle. This function will cause callbacks to be invoked sooner than later at the expense of extra power. Other than that, this function is identical to, and reuses call_rcu()'s logic. Refer to call_rcu() for more details about memory ordering and other functionality.h]hXUse this API instead of call_rcu() if you don’t want the callback to be delayed for very long periods of time, which can happen on systems without memory pressure and on systems which are lightly loaded or mostly idle. This function will cause callbacks to be invoked sooner than later at the expense of extra power. Other than that, this function is identical to, and reuses call_rcu()’s logic. Refer to call_rcu() for more details about memory ordering and other functionality.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjwubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j call_rcu (C function) c.call_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h:void call_rcu (struct rcu_head *head, rcu_callback_t func)h]j)}(h9void call_rcu(struct rcu_head *head, rcu_callback_t func)h](j )}(hvoidh]hvoid}(hjdhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj`hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM ubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`hhhjrhM ubj{)}(hcall_rcuh]j)}(hcall_rcuh]hcall_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj`hhhjrhM ubj)}(h,(struct rcu_head *head, rcu_callback_t func)h](j)}(hstruct rcu_head *headh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hrcu_headh]hrcu_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.call_rcuasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hheadh]hhead}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hrcu_callback_t funch](h)}(hhh]j)}(hrcu_callback_th]hrcu_callback_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j c.call_rcuasbuh1hhjubj2)}(h h]h }(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hfunch]hfunc}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj`hhhjrhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj\hhhjrhM ubah}(h]jWah ](jjeh"]h$]h&]jj)jhuh1jhjrhM hjYhhubj)}(hhh]h)}(hQueue an RCU callback for invocation after a grace period. By default the callbacks are 'lazy' and are kept hidden from the main ->cblist to prevent starting of grace periods too soon. If you desire grace periods to start very soon, use call_rcu_hurry().h]hXQueue an RCU callback for invocation after a grace period. By default the callbacks are ‘lazy’ and are kept hidden from the main ->cblist to prevent starting of grace periods too soon. If you desire grace periods to start very soon, use call_rcu_hurry().}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjihhubah}(h]h ]h"]h$]h&]uh1jhjYhhhjrhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX& **Parameters** ``struct rcu_head *head`` structure to be used for queueing the RCU updates. ``rcu_callback_t func`` actual callback function to be invoked after the grace period **Description** The callback function will be invoked some time after a full grace period elapses, in other words after all pre-existing RCU read-side critical sections have completed. However, the callback function might well execute concurrently with RCU read-side critical sections that started after call_rcu() was invoked. It is perfectly legal to repost an RCU callback, potentially with a different callback function, from within its callback function. The specified function will be invoked after another full grace period has elapsed. This use case is similar in form to the common practice of reposting a timer from within its own handler. RCU read-side critical sections are delimited by rcu_read_lock() and rcu_read_unlock(), and may be nested. In addition, but only in v5.0 and later, regions of code across which interrupts, preemption, or softirqs have been disabled also serve as RCU read-side critical sections. This includes hardware interrupt handlers, softirq handlers, and NMI handlers. Note that all CPUs must agree that the grace period extended beyond all pre-existing RCU read-side critical section. On systems with more than one CPU, this means that when "func()" is invoked, each CPU is guaranteed to have executed a full memory barrier since the end of its last RCU read-side critical section whose beginning preceded the call to call_rcu(). It also means that each CPU executing an RCU read-side critical section that continues beyond the start of "func()" must have executed a memory barrier after the call_rcu() but before the beginning of that RCU read-side critical section. Note that these guarantees include CPUs that are offline, idle, or executing in user mode, as well as CPUs that are executing in the kernel. Furthermore, if CPU A invoked call_rcu() and CPU B invoked the resulting RCU callback function "func()", then both CPU A and CPU B are guaranteed to execute a full memory barrier during the time interval between the call to call_rcu() and the invocation of "func()" -- even if CPU A and CPU B are the same CPU (but again only if the system has more than one CPU). Implementation of these memory-ordering guarantees is described here: Documentation/RCU/Design/Memory-Ordering/Tree-RCU-Memory-Ordering.rst. Specific to call_rcu() (as opposed to the other call_rcu*() functions), in kernels built with CONFIG_RCU_LAZY=y, call_rcu() might delay for many seconds before starting the grace period needed by the corresponding callback. This delay can significantly improve energy-efficiency on low-utilization battery-powered devices. To avoid this delay, in latency-sensitive kernel code, use call_rcu_hurry().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubj )}(hhh](j)}(hM``struct rcu_head *head`` structure to be used for queueing the RCU updates. h](j)}(h``struct rcu_head *head``h]j)}(hjh]hstruct rcu_head *head}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubj2)}(hhh]h)}(h2structure to be used for queueing the RCU updates.h]h2structure to be used for queueing the RCU updates.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(hV``rcu_callback_t func`` actual callback function to be invoked after the grace period h](j)}(h``rcu_callback_t func``h]j)}(hjh]hrcu_callback_t func}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubj2)}(hhh]h)}(h=actual callback function to be invoked after the grace periodh]h=actual callback function to be invoked after the grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj!h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubh)}(hX8The callback function will be invoked some time after a full grace period elapses, in other words after all pre-existing RCU read-side critical sections have completed. However, the callback function might well execute concurrently with RCU read-side critical sections that started after call_rcu() was invoked.h]hX8The callback function will be invoked some time after a full grace period elapses, in other words after all pre-existing RCU read-side critical sections have completed. However, the callback function might well execute concurrently with RCU read-side critical sections that started after call_rcu() was invoked.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubh)}(hXBIt is perfectly legal to repost an RCU callback, potentially with a different callback function, from within its callback function. The specified function will be invoked after another full grace period has elapsed. This use case is similar in form to the common practice of reposting a timer from within its own handler.h]hXBIt is perfectly legal to repost an RCU callback, potentially with a different callback function, from within its callback function. The specified function will be invoked after another full grace period has elapsed. This use case is similar in form to the common practice of reposting a timer from within its own handler.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubh)}(hXgRCU read-side critical sections are delimited by rcu_read_lock() and rcu_read_unlock(), and may be nested. In addition, but only in v5.0 and later, regions of code across which interrupts, preemption, or softirqs have been disabled also serve as RCU read-side critical sections. This includes hardware interrupt handlers, softirq handlers, and NMI handlers.h]hXgRCU read-side critical sections are delimited by rcu_read_lock() and rcu_read_unlock(), and may be nested. In addition, but only in v5.0 and later, regions of code across which interrupts, preemption, or softirqs have been disabled also serve as RCU read-side critical sections. This includes hardware interrupt handlers, softirq handlers, and NMI handlers.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubh)}(hXNote that all CPUs must agree that the grace period extended beyond all pre-existing RCU read-side critical section. On systems with more than one CPU, this means that when "func()" is invoked, each CPU is guaranteed to have executed a full memory barrier since the end of its last RCU read-side critical section whose beginning preceded the call to call_rcu(). It also means that each CPU executing an RCU read-side critical section that continues beyond the start of "func()" must have executed a memory barrier after the call_rcu() but before the beginning of that RCU read-side critical section. Note that these guarantees include CPUs that are offline, idle, or executing in user mode, as well as CPUs that are executing in the kernel.h]hXNote that all CPUs must agree that the grace period extended beyond all pre-existing RCU read-side critical section. On systems with more than one CPU, this means that when “func()” is invoked, each CPU is guaranteed to have executed a full memory barrier since the end of its last RCU read-side critical section whose beginning preceded the call to call_rcu(). It also means that each CPU executing an RCU read-side critical section that continues beyond the start of “func()” must have executed a memory barrier after the call_rcu() but before the beginning of that RCU read-side critical section. Note that these guarantees include CPUs that are offline, idle, or executing in user mode, as well as CPUs that are executing in the kernel.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubh)}(hXkFurthermore, if CPU A invoked call_rcu() and CPU B invoked the resulting RCU callback function "func()", then both CPU A and CPU B are guaranteed to execute a full memory barrier during the time interval between the call to call_rcu() and the invocation of "func()" -- even if CPU A and CPU B are the same CPU (but again only if the system has more than one CPU).h]hXsFurthermore, if CPU A invoked call_rcu() and CPU B invoked the resulting RCU callback function “func()”, then both CPU A and CPU B are guaranteed to execute a full memory barrier during the time interval between the call to call_rcu() and the invocation of “func()” -- even if CPU A and CPU B are the same CPU (but again only if the system has more than one CPU).}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubh)}(hImplementation of these memory-ordering guarantees is described here: Documentation/RCU/Design/Memory-Ordering/Tree-RCU-Memory-Ordering.rst.h]hImplementation of these memory-ordering guarantees is described here: Documentation/RCU/Design/Memory-Ordering/Tree-RCU-Memory-Ordering.rst.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubh)}(hXSpecific to call_rcu() (as opposed to the other call_rcu*() functions), in kernels built with CONFIG_RCU_LAZY=y, call_rcu() might delay for many seconds before starting the grace period needed by the corresponding callback. This delay can significantly improve energy-efficiency on low-utilization battery-powered devices. To avoid this delay, in latency-sensitive kernel code, use call_rcu_hurry().h]hXSpecific to call_rcu() (as opposed to the other call_rcu*() functions), in kernels built with CONFIG_RCU_LAZY=y, call_rcu() might delay for many seconds before starting the grace period needed by the corresponding callback. This delay can significantly improve energy-efficiency on low-utilization battery-powered devices. To avoid this delay, in latency-sensitive kernel code, use call_rcu_hurry().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j synchronize_rcu (C function)c.synchronize_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid synchronize_rcu (void)h]j)}(hvoid synchronize_rcu(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM ubj{)}(hsynchronize_rcuh]j)}(hsynchronize_rcuh]hsynchronize_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM ubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h&wait until a grace period has elapsed.h]h&wait until a grace period has elapsed.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hj$hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj?jj?jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``void`` no arguments **Description** Control will return to the caller some time after a full grace period has elapsed, in other words after all currently executing RCU read-side critical sections have completed. Note, however, that upon return from synchronize_rcu(), the caller might well be executing concurrently with new RCU read-side critical sections that began while synchronize_rcu() was waiting. RCU read-side critical sections are delimited by rcu_read_lock() and rcu_read_unlock(), and may be nested. In addition, but only in v5.0 and later, regions of code across which interrupts, preemption, or softirqs have been disabled also serve as RCU read-side critical sections. This includes hardware interrupt handlers, softirq handlers, and NMI handlers. Note that this guarantee implies further memory-ordering guarantees. On systems with more than one CPU, when synchronize_rcu() returns, each CPU is guaranteed to have executed a full memory barrier since the end of its last RCU read-side critical section whose beginning preceded the call to synchronize_rcu(). In addition, each CPU having an RCU read-side critical section that extends beyond the return from synchronize_rcu() is guaranteed to have executed a full memory barrier after the beginning of synchronize_rcu() and before the beginning of that RCU read-side critical section. Note that these guarantees include CPUs that are offline, idle, or executing in user mode, as well as CPUs that are executing in the kernel. Furthermore, if CPU A invoked synchronize_rcu(), which returned to its caller on CPU B, then both CPU A and CPU B are guaranteed to have executed a full memory barrier during the execution of synchronize_rcu() -- even if CPU A and CPU B are the same CPU (but again only if the system has more than one CPU). Implementation of these memory-ordering guarantees is described here: Documentation/RCU/Design/Memory-Ordering/Tree-RCU-Memory-Ordering.rst.h](h)}(h**Parameters**h]j)}(hjIh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjCubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjhh]hvoid}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjbubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hKhj~ubah}(h]h ]h"]h$]h&]uh1j1hjbubeh}(h]h ]h"]h$]h&]uh1jhj}hKhj_ubah}(h]h ]h"]h$]h&]uh1j hjCubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjCubh)}(hXqControl will return to the caller some time after a full grace period has elapsed, in other words after all currently executing RCU read-side critical sections have completed. Note, however, that upon return from synchronize_rcu(), the caller might well be executing concurrently with new RCU read-side critical sections that began while synchronize_rcu() was waiting.h]hXqControl will return to the caller some time after a full grace period has elapsed, in other words after all currently executing RCU read-side critical sections have completed. Note, however, that upon return from synchronize_rcu(), the caller might well be executing concurrently with new RCU read-side critical sections that began while synchronize_rcu() was waiting.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjCubh)}(hXgRCU read-side critical sections are delimited by rcu_read_lock() and rcu_read_unlock(), and may be nested. In addition, but only in v5.0 and later, regions of code across which interrupts, preemption, or softirqs have been disabled also serve as RCU read-side critical sections. This includes hardware interrupt handlers, softirq handlers, and NMI handlers.h]hXgRCU read-side critical sections are delimited by rcu_read_lock() and rcu_read_unlock(), and may be nested. In addition, but only in v5.0 and later, regions of code across which interrupts, preemption, or softirqs have been disabled also serve as RCU read-side critical sections. This includes hardware interrupt handlers, softirq handlers, and NMI handlers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjCubh)}(hXNote that this guarantee implies further memory-ordering guarantees. On systems with more than one CPU, when synchronize_rcu() returns, each CPU is guaranteed to have executed a full memory barrier since the end of its last RCU read-side critical section whose beginning preceded the call to synchronize_rcu(). In addition, each CPU having an RCU read-side critical section that extends beyond the return from synchronize_rcu() is guaranteed to have executed a full memory barrier after the beginning of synchronize_rcu() and before the beginning of that RCU read-side critical section. Note that these guarantees include CPUs that are offline, idle, or executing in user mode, as well as CPUs that are executing in the kernel.h]hXNote that this guarantee implies further memory-ordering guarantees. On systems with more than one CPU, when synchronize_rcu() returns, each CPU is guaranteed to have executed a full memory barrier since the end of its last RCU read-side critical section whose beginning preceded the call to synchronize_rcu(). In addition, each CPU having an RCU read-side critical section that extends beyond the return from synchronize_rcu() is guaranteed to have executed a full memory barrier after the beginning of synchronize_rcu() and before the beginning of that RCU read-side critical section. Note that these guarantees include CPUs that are offline, idle, or executing in user mode, as well as CPUs that are executing in the kernel.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjCubh)}(hX3Furthermore, if CPU A invoked synchronize_rcu(), which returned to its caller on CPU B, then both CPU A and CPU B are guaranteed to have executed a full memory barrier during the execution of synchronize_rcu() -- even if CPU A and CPU B are the same CPU (but again only if the system has more than one CPU).h]hX3Furthermore, if CPU A invoked synchronize_rcu(), which returned to its caller on CPU B, then both CPU A and CPU B are guaranteed to have executed a full memory barrier during the execution of synchronize_rcu() -- even if CPU A and CPU B are the same CPU (but again only if the system has more than one CPU).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM( hjCubh)}(hImplementation of these memory-ordering guarantees is described here: Documentation/RCU/Design/Memory-Ordering/Tree-RCU-Memory-Ordering.rst.h]hImplementation of these memory-ordering guarantees is described here: Documentation/RCU/Design/Memory-Ordering/Tree-RCU-Memory-Ordering.rst.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM. hjCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j /get_completed_synchronize_rcu_full (C function)$c.get_completed_synchronize_rcu_fullhNtauh1hhjhhhNhNubj)}(hhh](j)}(hGvoid get_completed_synchronize_rcu_full (struct rcu_gp_oldstate *rgosp)h]j)}(hFvoid get_completed_synchronize_rcu_full(struct rcu_gp_oldstate *rgosp)h](j )}(hvoidh]hvoid}(hj$hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMZ ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj2hMZ ubj{)}(h"get_completed_synchronize_rcu_fullh]j)}(h"get_completed_synchronize_rcu_fullh]h"get_completed_synchronize_rcu_full}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj2hMZ ubj)}(h(struct rcu_gp_oldstate *rgosp)h]j)}(hstruct rcu_gp_oldstate *rgosph](j)}(hjAh]hstruct}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubh)}(hhh]j)}(hrcu_gp_oldstateh]hrcu_gp_oldstate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jGsb$c.get_completed_synchronize_rcu_fullasbuh1hhj]ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hrgosph]hrgosp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjYubah}(h]h ]h"]h$]h&]jjuh1jhj hhhj2hMZ ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj2hMZ ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj2hMZ hjhhubj)}(hhh]h)}(h/Return a full pre-completed polled state cookieh]h/Return a full pre-completed polled state cookie}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMZ hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj2hMZ ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_gp_oldstate *rgosp`` Place to put state cookie **Description** Stores into **rgosp** a value that will always be treated by functions like poll_state_synchronize_rcu_full() as a cookie whose grace period has already completed.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM^ hjubj )}(hhh]j)}(h<``struct rcu_gp_oldstate *rgosp`` Place to put state cookie h](j)}(h!``struct rcu_gp_oldstate *rgosp``h]j)}(hj%h]hstruct rcu_gp_oldstate *rgosp}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM[ hjubj2)}(hhh]h)}(hPlace to put state cookieh]hPlace to put state cookie}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hM[ hj;ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj:hM[ hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj`h]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM] hjubh)}(hStores into **rgosp** a value that will always be treated by functions like poll_state_synchronize_rcu_full() as a cookie whose grace period has already completed.h](h Stores into }(hjvhhhNhNubj)}(h **rgosp**h]hrgosp}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubh a value that will always be treated by functions like poll_state_synchronize_rcu_full() as a cookie whose grace period has already completed.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM\ hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &get_state_synchronize_rcu (C function)c.get_state_synchronize_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h.unsigned long get_state_synchronize_rcu (void)h]j)}(h-unsigned long get_state_synchronize_rcu(void)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMi ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMi ubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhMi ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMi ubj{)}(hget_state_synchronize_rcuh]j)}(hget_state_synchronize_rcuh]hget_state_synchronize_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMi ubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMi ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMi ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMi hjhhubj)}(hhh]h)}(hSnapshot current RCU stateh]hSnapshot current RCU state}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMi hj7hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMi ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjRjjRjjjuh1jhhhjhNhNubj)}(h**Parameters** ``void`` no arguments **Description** Returns a cookie that is used by a later call to cond_synchronize_rcu() or poll_state_synchronize_rcu() to determine whether or not a full grace period has elapsed in the meantime.h](h)}(h**Parameters**h]j)}(hj\h]h Parameters}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMm hjVubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj{h]hvoid}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjuubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjhKhjrubah}(h]h ]h"]h$]h&]uh1j hjVubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjVubh)}(hReturns a cookie that is used by a later call to cond_synchronize_rcu() or poll_state_synchronize_rcu() to determine whether or not a full grace period has elapsed in the meantime.h]hReturns a cookie that is used by a later call to cond_synchronize_rcu() or poll_state_synchronize_rcu() to determine whether or not a full grace period has elapsed in the meantime.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMj hjVubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j +get_state_synchronize_rcu_full (C function) c.get_state_synchronize_rcu_fullhNtauh1hhjhhhNhNubj)}(hhh](j)}(hCvoid get_state_synchronize_rcu_full (struct rcu_gp_oldstate *rgosp)h]j)}(hBvoid get_state_synchronize_rcu_full(struct rcu_gp_oldstate *rgosp)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM{ ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj hM{ ubj{)}(hget_state_synchronize_rcu_fullh]j)}(hget_state_synchronize_rcu_fullh]hget_state_synchronize_rcu_full}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj hM{ ubj)}(h(struct rcu_gp_oldstate *rgosp)h]j)}(hstruct rcu_gp_oldstate *rgosph](j)}(hjAh]hstruct}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4ubh)}(hhh]j)}(hrcu_gp_oldstateh]hrcu_gp_oldstate}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjXmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.get_state_synchronize_rcu_fullasbuh1hhj4ubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(hrgosph]hrgosp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj0ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj hM{ ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj hM{ ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hM{ hjhhubj)}(hhh]h)}(h-Snapshot RCU state, both normal and expeditedh]h-Snapshot RCU state, both normal and expedited}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM{ hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hM{ ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_gp_oldstate *rgosp`` location to place combined normal/expedited grace-period state **Description** Places the normal and expedited grace-period states in **rgosp**. This state value can be passed to a later call to cond_synchronize_rcu_full() or poll_state_synchronize_rcu_full() to determine whether or not a grace period (whether normal or expedited) has elapsed in the meantime. The rcu_gp_oldstate structure takes up twice the memory of an unsigned long, but is guaranteed to see all grace periods. In contrast, the combined state occupies less memory, but can sometimes fail to take grace periods into account. This does not guarantee that the needed grace period will actually start.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubj )}(hhh]j)}(ha``struct rcu_gp_oldstate *rgosp`` location to place combined normal/expedited grace-period state h](j)}(h!``struct rcu_gp_oldstate *rgosp``h]j)}(hjh]hstruct rcu_gp_oldstate *rgosp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM| hjubj2)}(hhh]h)}(h>location to place combined normal/expedited grace-period stateh]h>location to place combined normal/expedited grace-period state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM| hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM| hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj7h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM~ hjubh)}(hXPlaces the normal and expedited grace-period states in **rgosp**. This state value can be passed to a later call to cond_synchronize_rcu_full() or poll_state_synchronize_rcu_full() to determine whether or not a grace period (whether normal or expedited) has elapsed in the meantime. The rcu_gp_oldstate structure takes up twice the memory of an unsigned long, but is guaranteed to see all grace periods. In contrast, the combined state occupies less memory, but can sometimes fail to take grace periods into account.h](h7Places the normal and expedited grace-period states in }(hjMhhhNhNubj)}(h **rgosp**h]hrgosp}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubhX. This state value can be passed to a later call to cond_synchronize_rcu_full() or poll_state_synchronize_rcu_full() to determine whether or not a grace period (whether normal or expedited) has elapsed in the meantime. The rcu_gp_oldstate structure takes up twice the memory of an unsigned long, but is guaranteed to see all grace periods. In contrast, the combined state occupies less memory, but can sometimes fail to take grace periods into account.}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM} hjubh)}(hIThis does not guarantee that the needed grace period will actually start.h]hIThis does not guarantee that the needed grace period will actually start.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'start_poll_synchronize_rcu (C function)c.start_poll_synchronize_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h/unsigned long start_poll_synchronize_rcu (void)h]j)}(h.unsigned long start_poll_synchronize_rcu(void)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM ubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM ubj{)}(hstart_poll_synchronize_rcuh]j)}(hstart_poll_synchronize_rcuh]hstart_poll_synchronize_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM ubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h#Snapshot and start RCU grace periodh]h#Snapshot and start RCU grace period}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj8jj8jjjuh1jhhhjhNhNubj)}(hX_**Parameters** ``void`` no arguments **Description** Returns a cookie that is used by a later call to cond_synchronize_rcu() or poll_state_synchronize_rcu() to determine whether or not a full grace period has elapsed in the meantime. If the needed grace period is not already slated to start, notifies RCU core of the need for that grace period.h](h)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hj<ubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjah]hvoid}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhj[ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhKhjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhKhjXubah}(h]h ]h"]h$]h&]uh1j hj<ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhj<ubh)}(hX%Returns a cookie that is used by a later call to cond_synchronize_rcu() or poll_state_synchronize_rcu() to determine whether or not a full grace period has elapsed in the meantime. If the needed grace period is not already slated to start, notifies RCU core of the need for that grace period.h]hX%Returns a cookie that is used by a later call to cond_synchronize_rcu() or poll_state_synchronize_rcu() to determine whether or not a full grace period has elapsed in the meantime. If the needed grace period is not already slated to start, notifies RCU core of the need for that grace period.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ,start_poll_synchronize_rcu_full (C function)!c.start_poll_synchronize_rcu_fullhNtauh1hhjhhhNhNubj)}(hhh](j)}(hDvoid start_poll_synchronize_rcu_full (struct rcu_gp_oldstate *rgosp)h]j)}(hCvoid start_poll_synchronize_rcu_full(struct rcu_gp_oldstate *rgosp)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM ubj{)}(hstart_poll_synchronize_rcu_fullh]j)}(hstart_poll_synchronize_rcu_fullh]hstart_poll_synchronize_rcu_full}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM ubj)}(h(struct rcu_gp_oldstate *rgosp)h]j)}(hstruct rcu_gp_oldstate *rgosph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hrcu_gp_oldstateh]hrcu_gp_oldstate}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj>modnameN classnameNj] j` )}jc ]jf )}jY jsb!c.start_poll_synchronize_rcu_fullasbuh1hhjubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrgosph]hrgosp}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h/Take a full snapshot and start RCU grace periodh]h/Take a full snapshot and start RCU grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX"**Parameters** ``struct rcu_gp_oldstate *rgosp`` value from get_state_synchronize_rcu_full() or start_poll_synchronize_rcu_full() **Description** Places the normal and expedited grace-period states in ***rgos**. This state value can be passed to a later call to cond_synchronize_rcu_full() or poll_state_synchronize_rcu_full() to determine whether or not a grace period (whether normal or expedited) has elapsed in the meantime. If the needed grace period is not already slated to start, notifies RCU core of the need for that grace period.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubj )}(hhh]j)}(hs``struct rcu_gp_oldstate *rgosp`` value from get_state_synchronize_rcu_full() or start_poll_synchronize_rcu_full() h](j)}(h!``struct rcu_gp_oldstate *rgosp``h]j)}(hjh]hstruct rcu_gp_oldstate *rgosp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubj2)}(hhh]h)}(hPvalue from get_state_synchronize_rcu_full() or start_poll_synchronize_rcu_full()h]hPvalue from get_state_synchronize_rcu_full() or start_poll_synchronize_rcu_full()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubh)}(hXPlaces the normal and expedited grace-period states in ***rgos**. This state value can be passed to a later call to cond_synchronize_rcu_full() or poll_state_synchronize_rcu_full() to determine whether or not a grace period (whether normal or expedited) has elapsed in the meantime. If the needed grace period is not already slated to start, notifies RCU core of the need for that grace period.h](h7Places the normal and expedited grace-period states in }(hj3hhhNhNubj)}(h ***rgos**h]h*rgos}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubhXK. This state value can be passed to a later call to cond_synchronize_rcu_full() or poll_state_synchronize_rcu_full() to determine whether or not a grace period (whether normal or expedited) has elapsed in the meantime. If the needed grace period is not already slated to start, notifies RCU core of the need for that grace period.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'poll_state_synchronize_rcu (C function)c.poll_state_synchronize_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h8bool poll_state_synchronize_rcu (unsigned long oldstate)h]j)}(h7bool poll_state_synchronize_rcu(unsigned long oldstate)h](j )}(hj8h]hbool}(hjthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjphhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjphhhjhM ubj{)}(hpoll_state_synchronize_rcuh]j)}(hpoll_state_synchronize_rcuh]hpoll_state_synchronize_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjphhhjhM ubj)}(h(unsigned long oldstate)h]j)}(hunsigned long oldstateh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(holdstateh]holdstate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjphhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjlhhhjhM ubah}(h]jgah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjihhubj)}(hhh]h)}(h-Has the specified RCU grace period completed?h]h-Has the specified RCU grace period completed?}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hj hhubah}(h]h ]h"]h$]h&]uh1jhjihhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj* jj* jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``unsigned long oldstate`` value from get_state_synchronize_rcu() or start_poll_synchronize_rcu() **Description** If a full RCU grace period has elapsed since the earlier call from which **oldstate** was obtained, return **true**, otherwise return **false**. If **false** is returned, it is the caller's responsibility to invoke this function later on until it does return **true**. Alternatively, the caller can explicitly wait for a grace period, for example, by passing **oldstate** to either cond_synchronize_rcu() or cond_synchronize_rcu_expedited() on the one hand or by directly invoking either synchronize_rcu() or synchronize_rcu_expedited() on the other. Yes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than a billion grace periods (and way more on a 64-bit system!). Those needing to keep old state values for very long time periods (many hours even on 32-bit systems) should check them occasionally and either refresh them or set a flag indicating that the grace period has completed. Alternatively, they can use get_completed_synchronize_rcu() to get a guaranteed-completed grace-period state. In addition, because oldstate compresses the grace-period state for both normal and expedited grace periods into a single unsigned long, it can miss a grace period when synchronize_rcu() runs concurrently with synchronize_rcu_expedited(). If this is unacceptable, please instead use the _full() variant of these polling APIs. This function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **oldstate**, and that returned at the end of this function.h](h)}(h**Parameters**h]j)}(hj4 h]h Parameters}(hj6 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2 ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hj. ubj )}(hhh]j)}(hb``unsigned long oldstate`` value from get_state_synchronize_rcu() or start_poll_synchronize_rcu() h](j)}(h``unsigned long oldstate``h]j)}(hjS h]hunsigned long oldstate}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjM ubj2)}(hhh]h)}(hFvalue from get_state_synchronize_rcu() or start_poll_synchronize_rcu()h]hFvalue from get_state_synchronize_rcu() or start_poll_synchronize_rcu()}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjh hM hji ubah}(h]h ]h"]h$]h&]uh1j1hjM ubeh}(h]h ]h"]h$]h&]uh1jhjh hM hjJ ubah}(h]h ]h"]h$]h&]uh1j hj. ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hj. ubh)}(hX'If a full RCU grace period has elapsed since the earlier call from which **oldstate** was obtained, return **true**, otherwise return **false**. If **false** is returned, it is the caller's responsibility to invoke this function later on until it does return **true**. Alternatively, the caller can explicitly wait for a grace period, for example, by passing **oldstate** to either cond_synchronize_rcu() or cond_synchronize_rcu_expedited() on the one hand or by directly invoking either synchronize_rcu() or synchronize_rcu_expedited() on the other.h](hIIf a full RCU grace period has elapsed since the earlier call from which }(hj hhhNhNubj)}(h **oldstate**h]holdstate}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh was obtained, return }(hj hhhNhNubj)}(h**true**h]htrue}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh, otherwise return }(hj hhhNhNubj)}(h **false**h]hfalse}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh. If }(hj hhhNhNubj)}(h **false**h]hfalse}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhh is returned, it is the caller’s responsibility to invoke this function later on until it does return }(hj hhhNhNubj)}(h**true**h]htrue}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh]. Alternatively, the caller can explicitly wait for a grace period, for example, by passing }(hj hhhNhNubj)}(h **oldstate**h]holdstate}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh to either cond_synchronize_rcu() or cond_synchronize_rcu_expedited() on the one hand or by directly invoking either synchronize_rcu() or synchronize_rcu_expedited() on the other.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hj. ubh)}(hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than a billion grace periods (and way more on a 64-bit system!). Those needing to keep old state values for very long time periods (many hours even on 32-bit systems) should check them occasionally and either refresh them or set a flag indicating that the grace period has completed. Alternatively, they can use get_completed_synchronize_rcu() to get a guaranteed-completed grace-period state.h]hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than a billion grace periods (and way more on a 64-bit system!). Those needing to keep old state values for very long time periods (many hours even on 32-bit systems) should check them occasionally and either refresh them or set a flag indicating that the grace period has completed. Alternatively, they can use get_completed_synchronize_rcu() to get a guaranteed-completed grace-period state.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hj. ubh)}(hXFIn addition, because oldstate compresses the grace-period state for both normal and expedited grace periods into a single unsigned long, it can miss a grace period when synchronize_rcu() runs concurrently with synchronize_rcu_expedited(). If this is unacceptable, please instead use the _full() variant of these polling APIs.h]hXFIn addition, because oldstate compresses the grace-period state for both normal and expedited grace periods into a single unsigned long, it can miss a grace period when synchronize_rcu() runs concurrently with synchronize_rcu_expedited(). If this is unacceptable, please instead use the _full() variant of these polling APIs.}(hj. hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hj. ubh)}(hThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **oldstate**, and that returned at the end of this function.h](hThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided }(hj= hhhNhNubj)}(h **oldstate**h]holdstate}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj= ubh0, and that returned at the end of this function.}(hj= hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hj. ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ,poll_state_synchronize_rcu_full (C function)!c.poll_state_synchronize_rcu_fullhNtauh1hhjhhhNhNubj)}(hhh](j)}(hDbool poll_state_synchronize_rcu_full (struct rcu_gp_oldstate *rgosp)h]j)}(hCbool poll_state_synchronize_rcu_full(struct rcu_gp_oldstate *rgosp)h](j )}(hj8h]hbool}(hj~ hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjz hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjz hhhj hMubj{)}(hpoll_state_synchronize_rcu_fullh]j)}(hpoll_state_synchronize_rcu_fullh]hpoll_state_synchronize_rcu_full}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjz hhhj hMubj)}(h(struct rcu_gp_oldstate *rgosp)h]j)}(hstruct rcu_gp_oldstate *rgosph](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubh)}(hhh]j)}(hrcu_gp_oldstateh]hrcu_gp_oldstate}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj modnameN classnameNj] j` )}jc ]jf )}jY j sb!c.poll_state_synchronize_rcu_fullasbuh1hhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hrgosph]hrgosp}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhjz hhhj hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjv hhhj hMubah}(h]jq ah ](jjeh"]h$]h&]jj)jhuh1jhj hMhjs hhubj)}(hhh]h)}(h-Has the specified RCU grace period completed?h]h-Has the specified RCU grace period completed?}(hj= hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhj: hhubah}(h]h ]h"]h$]h&]uh1jhjs hhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjU jjU jjjuh1jhhhjhNhNubj)}(hXl**Parameters** ``struct rcu_gp_oldstate *rgosp`` value from get_state_synchronize_rcu_full() or start_poll_synchronize_rcu_full() **Description** If a full RCU grace period has elapsed since the earlier call from which *rgosp was obtained, return **true**, otherwise return **false**. If **false** is returned, it is the caller's responsibility to invoke this function later on until it does return **true**. Alternatively, the caller can explicitly wait for a grace period, for example, by passing **rgosp** to cond_synchronize_rcu() or by directly invoking synchronize_rcu(). Yes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than a billion grace periods (and way more on a 64-bit system!). Those needing to keep rcu_gp_oldstate values for very long time periods (many hours even on 32-bit systems) should check them occasionally and either refresh them or set a flag indicating that the grace period has completed. Alternatively, they can use get_completed_synchronize_rcu_full() to get a guaranteed-completed grace-period state. This function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **rgosp**, and that returned at the end of this function. And this guarantee requires that the root rcu_node structure's ->gp_seq field be checked instead of that of the rcu_state structure. The problem is that the just-ending grace-period's callbacks can be invoked between the time that the root rcu_node structure's ->gp_seq field is updated and the time that the rcu_state structure's ->gp_seq field is updated. Therefore, if a single synchronize_rcu() is to cause a subsequent poll_state_synchronize_rcu_full() to return **true**, then the root rcu_node structure is the one that needs to be polled.h](h)}(h**Parameters**h]j)}(hj_ h]h Parameters}(hja hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj] ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjY ubj )}(hhh]j)}(hs``struct rcu_gp_oldstate *rgosp`` value from get_state_synchronize_rcu_full() or start_poll_synchronize_rcu_full() h](j)}(h!``struct rcu_gp_oldstate *rgosp``h]j)}(hj~ h]hstruct rcu_gp_oldstate *rgosp}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj| ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjx ubj2)}(hhh]h)}(hPvalue from get_state_synchronize_rcu_full() or start_poll_synchronize_rcu_full()h]hPvalue from get_state_synchronize_rcu_full() or start_poll_synchronize_rcu_full()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM hj ubah}(h]h ]h"]h$]h&]uh1j1hjx ubeh}(h]h ]h"]h$]h&]uh1jhj hM hju ubah}(h]h ]h"]h$]h&]uh1j hjY ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjY ubh)}(hXIf a full RCU grace period has elapsed since the earlier call from which *rgosp was obtained, return **true**, otherwise return **false**. If **false** is returned, it is the caller's responsibility to invoke this function later on until it does return **true**. Alternatively, the caller can explicitly wait for a grace period, for example, by passing **rgosp** to cond_synchronize_rcu() or by directly invoking synchronize_rcu().h](hIIf a full RCU grace period has elapsed since the earlier call from which }(hj hhhNhNubj)}(h$*rgosp was obtained, return **true**h]h"rgosp was obtained, return **true*}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh, otherwise return }(hj hhhNhNubj)}(h **false**h]hfalse}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh. If }(hj hhhNhNubj)}(h **false**h]hfalse}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhh is returned, it is the caller’s responsibility to invoke this function later on until it does return }(hj hhhNhNubj)}(h**true**h]htrue}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh]. Alternatively, the caller can explicitly wait for a grace period, for example, by passing }(hj hhhNhNubj)}(h **rgosp**h]hrgosp}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhE to cond_synchronize_rcu() or by directly invoking synchronize_rcu().}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM hjY ubh)}(hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than a billion grace periods (and way more on a 64-bit system!). Those needing to keep rcu_gp_oldstate values for very long time periods (many hours even on 32-bit systems) should check them occasionally and either refresh them or set a flag indicating that the grace period has completed. Alternatively, they can use get_completed_synchronize_rcu_full() to get a guaranteed-completed grace-period state.h]hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than a billion grace periods (and way more on a 64-bit system!). Those needing to keep rcu_gp_oldstate values for very long time periods (many hours even on 32-bit systems) should check them occasionally and either refresh them or set a flag indicating that the grace period has completed. Alternatively, they can use get_completed_synchronize_rcu_full() to get a guaranteed-completed grace-period state.}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjY ubh)}(hXThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **rgosp**, and that returned at the end of this function. And this guarantee requires that the root rcu_node structure's ->gp_seq field be checked instead of that of the rcu_state structure. The problem is that the just-ending grace-period's callbacks can be invoked between the time that the root rcu_node structure's ->gp_seq field is updated and the time that the rcu_state structure's ->gp_seq field is updated. Therefore, if a single synchronize_rcu() is to cause a subsequent poll_state_synchronize_rcu_full() to return **true**, then the root rcu_node structure is the one that needs to be polled.h](hThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided }(hjG hhhNhNubj)}(h **rgosp**h]hrgosp}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG ubhX, and that returned at the end of this function. And this guarantee requires that the root rcu_node structure’s ->gp_seq field be checked instead of that of the rcu_state structure. The problem is that the just-ending grace-period’s callbacks can be invoked between the time that the root rcu_node structure’s ->gp_seq field is updated and the time that the rcu_state structure’s ->gp_seq field is updated. Therefore, if a single synchronize_rcu() is to cause a subsequent poll_state_synchronize_rcu_full() to return }(hjG hhhNhNubj)}(h**true**h]htrue}(hja hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG ubhF, then the root rcu_node structure is the one that needs to be polled.}(hjG hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjY ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !cond_synchronize_rcu (C function)c.cond_synchronize_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h2void cond_synchronize_rcu (unsigned long oldstate)h]j)}(h1void cond_synchronize_rcu(unsigned long oldstate)h](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM9ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj hM9ubj{)}(hcond_synchronize_rcuh]j)}(hcond_synchronize_rcuh]hcond_synchronize_rcu}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj hM9ubj)}(h(unsigned long oldstate)h]j)}(hunsigned long oldstateh](j )}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj )}(hlongh]hlong}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(holdstateh]holdstate}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhj hhhj hM9ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj hM9ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hM9hj hhubj)}(hhh]h)}(h*Conditionally wait for an RCU grace periodh]h*Conditionally wait for an RCU grace period}(hj9 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM9hj6 hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM9ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjQ jjQ jjjuh1jhhhjhNhNubj)}(hXs**Parameters** ``unsigned long oldstate`` value from get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or start_poll_synchronize_rcu_expedited() **Description** If a full RCU grace period has elapsed since the earlier call to get_state_synchronize_rcu() or start_poll_synchronize_rcu(), just return. Otherwise, invoke synchronize_rcu() to wait for a full grace period. Yes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine. This function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **oldstate** and that returned at the end of this function.h](h)}(h**Parameters**h]j)}(hj[ h]h Parameters}(hj] hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM=hjU ubj )}(hhh]j)}(h``unsigned long oldstate`` value from get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or start_poll_synchronize_rcu_expedited() h](j)}(h``unsigned long oldstate``h]j)}(hjz h]hunsigned long oldstate}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM:hjt ubj2)}(hhh]h)}(hovalue from get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or start_poll_synchronize_rcu_expedited()h]hovalue from get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or start_poll_synchronize_rcu_expedited()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM:hj ubah}(h]h ]h"]h$]h&]uh1j1hjt ubeh}(h]h ]h"]h$]h&]uh1jhj hM:hjq ubah}(h]h ]h"]h$]h&]uh1j hjU ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM<hjU ubh)}(hIf a full RCU grace period has elapsed since the earlier call to get_state_synchronize_rcu() or start_poll_synchronize_rcu(), just return. Otherwise, invoke synchronize_rcu() to wait for a full grace period.h]hIf a full RCU grace period has elapsed since the earlier call to get_state_synchronize_rcu() or start_poll_synchronize_rcu(), just return. Otherwise, invoke synchronize_rcu() to wait for a full grace period.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM;hjU ubh)}(hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine.h]hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM?hjU ubh)}(hThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **oldstate** and that returned at the end of this function.h](hThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided }(hj hhhNhNubj)}(h **oldstate**h]holdstate}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh/ and that returned at the end of this function.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMDhjU ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &cond_synchronize_rcu_full (C function)c.cond_synchronize_rcu_fullhNtauh1hhjhhhNhNubj)}(hhh](j)}(h>void cond_synchronize_rcu_full (struct rcu_gp_oldstate *rgosp)h]j)}(h=void cond_synchronize_rcu_full(struct rcu_gp_oldstate *rgosp)h](j )}(hvoidh]hvoid}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMRubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj&hhhj8hMRubj{)}(hcond_synchronize_rcu_fullh]j)}(hcond_synchronize_rcu_fullh]hcond_synchronize_rcu_full}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj&hhhj8hMRubj)}(h(struct rcu_gp_oldstate *rgosp)h]j)}(hstruct rcu_gp_oldstate *rgosph](j)}(hjAh]hstruct}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubh)}(hhh]j)}(hrcu_gp_oldstateh]hrcu_gp_oldstate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jMsbc.cond_synchronize_rcu_fullasbuh1hhjcubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjcubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hrgosph]hrgosp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubah}(h]h ]h"]h$]h&]jjuh1jhj&hhhj8hMRubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj"hhhj8hMRubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj8hMRhjhhubj)}(hhh]h)}(h*Conditionally wait for an RCU grace periodh]h*Conditionally wait for an RCU grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMRhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj8hMRubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_gp_oldstate *rgosp`` value from get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full() **Description** If a full RCU grace period has elapsed since the call to get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full() from which **rgosp** was obtained, just return. Otherwise, invoke synchronize_rcu() to wait for a full grace period. Yes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine. This function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **rgosp** and that returned at the end of this function.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMVhjubj )}(hhh]j)}(h``struct rcu_gp_oldstate *rgosp`` value from get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full() h](j)}(h!``struct rcu_gp_oldstate *rgosp``h]j)}(hj+h]hstruct rcu_gp_oldstate *rgosp}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMShj%ubj2)}(hhh]h)}(h~value from get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full()h]h~value from get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full()}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMShjAubah}(h]h ]h"]h$]h&]uh1j1hj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hMShj"ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjfh]h Description}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMUhjubh)}(hX"If a full RCU grace period has elapsed since the call to get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full() from which **rgosp** was obtained, just return. Otherwise, invoke synchronize_rcu() to wait for a full grace period.h](hIf a full RCU grace period has elapsed since the call to get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full() from which }(hj|hhhNhNubj)}(h **rgosp**h]hrgosp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubha was obtained, just return. Otherwise, invoke synchronize_rcu() to wait for a full grace period.}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMThjubh)}(hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine.h]hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMZhjubh)}(hThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **rgosp** and that returned at the end of this function.h](hThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided }(hjhhhNhNubj)}(h **rgosp**h]hrgosp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh/ and that returned at the end of this function.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chM_hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_barrier (C function) c.rcu_barrierhNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_barrier (void)h]j)}(hvoid rcu_barrier(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(h rcu_barrierh]j)}(h rcu_barrierh]h rcu_barrier}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj"ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h7Wait until all in-flight call_rcu() callbacks complete.h]h7Wait until all in-flight call_rcu() callbacks complete.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjQhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjljjljjjuh1jhhhjhNhNubj)}(hX>**Parameters** ``void`` no arguments **Description** Note that this primitive does not necessarily wait for an RCU grace period to complete. For example, if there are no RCU callbacks queued anywhere in the system, then rcu_barrier() is within its rights to return immediately, without waiting for anything, much less an RCU grace period. In fact, rcu_barrier() will normally not result in any RCU grace periods beyond those that were already destined to be executed. In kernels built with CONFIG_RCU_LAZY=y, this function also hurries all pending lazy RCU callbacks.h](h)}(h**Parameters**h]j)}(hjvh]h Parameters}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjpubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjpubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjpubh)}(hXNote that this primitive does not necessarily wait for an RCU grace period to complete. For example, if there are no RCU callbacks queued anywhere in the system, then rcu_barrier() is within its rights to return immediately, without waiting for anything, much less an RCU grace period. In fact, rcu_barrier() will normally not result in any RCU grace periods beyond those that were already destined to be executed.h]hXNote that this primitive does not necessarily wait for an RCU grace period to complete. For example, if there are no RCU callbacks queued anywhere in the system, then rcu_barrier() is within its rights to return immediately, without waiting for anything, much less an RCU grace period. In fact, rcu_barrier() will normally not result in any RCU grace periods beyond those that were already destined to be executed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjpubh)}(hcIn kernels built with CONFIG_RCU_LAZY=y, this function also hurries all pending lazy RCU callbacks.h]hcIn kernels built with CONFIG_RCU_LAZY=y, this function also hurries all pending lazy RCU callbacks.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMhjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "rcu_barrier_throttled (C function)c.rcu_barrier_throttledhNtauh1hhjhhhNhNubj)}(hhh](j)}(h!void rcu_barrier_throttled (void)h]j)}(h void rcu_barrier_throttled(void)h](j )}(hvoidh]hvoid}(hj$hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMiubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhj2hMiubj{)}(hrcu_barrier_throttledh]j)}(hrcu_barrier_throttledh]hrcu_barrier_throttled}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhj2hMiubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]noemphjjuh1jhjYubah}(h]h ]h"]h$]h&]jjuh1jhj hhhj2hMiubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj2hMiubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj2hMihjhhubj)}(hhh]h)}(h-Do rcu_barrier(), but limit to one per secondh]h-Do rcu_barrier(), but limit to one per second}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMihjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj2hMiubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXl**Parameters** ``void`` no arguments **Description** This can be thought of as guard rails around rcu_barrier() that permits unrestricted userspace use, at least assuming the hardware's try_cmpxchg() is robust. There will be at most one call per second to rcu_barrier() system-wide from use of this function, which means that callers might needlessly wait a second or three. This is intended for use by test suites to avoid OOM by flushing RCU callbacks from the previous test before starting the next. See the rcutree.do_rcu_barrier module parameter for more information. Why not simply make rcu_barrier() more scalable? That might be the eventual endpoint, but let's keep it simple for the time being. Note that the module parameter infrastructure serializes calls to a given .set() function, but should concurrent .set() invocation ever be possible, we are ready!h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMmhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chKhjubh)}(hXBThis can be thought of as guard rails around rcu_barrier() that permits unrestricted userspace use, at least assuming the hardware's try_cmpxchg() is robust. There will be at most one call per second to rcu_barrier() system-wide from use of this function, which means that callers might needlessly wait a second or three.h]hXDThis can be thought of as guard rails around rcu_barrier() that permits unrestricted userspace use, at least assuming the hardware’s try_cmpxchg() is robust. There will be at most one call per second to rcu_barrier() system-wide from use of this function, which means that callers might needlessly wait a second or three.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMjhjubh)}(hThis is intended for use by test suites to avoid OOM by flushing RCU callbacks from the previous test before starting the next. See the rcutree.do_rcu_barrier module parameter for more information.h]hThis is intended for use by test suites to avoid OOM by flushing RCU callbacks from the previous test before starting the next. See the rcutree.do_rcu_barrier module parameter for more information.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMphjubh)}(hX&Why not simply make rcu_barrier() more scalable? That might be the eventual endpoint, but let's keep it simple for the time being. Note that the module parameter infrastructure serializes calls to a given .set() function, but should concurrent .set() invocation ever be possible, we are ready!h]hX(Why not simply make rcu_barrier() more scalable? That might be the eventual endpoint, but let’s keep it simple for the time being. Note that the module parameter infrastructure serializes calls to a given .set() function, but should concurrent .set() invocation ever be possible, we are ready!}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:401: ./kernel/rcu/tree.chMthjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &synchronize_rcu_expedited (C function)c.synchronize_rcu_expeditedhNtauh1hhjhhhNhNubj)}(hhh](j)}(h%void synchronize_rcu_expedited (void)h]j)}(h$void synchronize_rcu_expedited(void)h](j )}(hvoidh]hvoid}(hjjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjfhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjfhhhjxhMubj{)}(hsynchronize_rcu_expeditedh]j)}(hsynchronize_rcu_expeditedh]hsynchronize_rcu_expedited}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjfhhhjxhMubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjfhhhjxhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjbhhhjxhMubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1jhjxhMhj_hhubj)}(hhh]h)}(hBrute-force RCU grace periodh]hBrute-force RCU grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhj_hhhjxhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``void`` no arguments **Description** Wait for an RCU grace period, but expedite it. The basic idea is to IPI all non-idle non-nohz online CPUs. The IPI handler checks whether the CPU is in an RCU critical section, and if so, it sets a flag that causes the outermost rcu_read_unlock() to report the quiescent state for RCU-preempt or asks the scheduler for help for RCU-sched. On the other hand, if the CPU is not in an RCU read-side critical section, the IPI handler reports the quiescent state immediately. Although this is a great improvement over previous expedited implementations, it is still unfriendly to real-time workloads, so is thus not recommended for any sort of common-case code. In fact, if you are using synchronize_rcu_expedited() in a loop, please restructure your code to batch your updates, and then use a single synchronize_rcu() instead. This has the same semantics as (but is more brutal than) synchronize_rcu().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhKhj ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hKhj(ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj'hKhj ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjMh]h Description}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhKhjubh)}(hXWait for an RCU grace period, but expedite it. The basic idea is to IPI all non-idle non-nohz online CPUs. The IPI handler checks whether the CPU is in an RCU critical section, and if so, it sets a flag that causes the outermost rcu_read_unlock() to report the quiescent state for RCU-preempt or asks the scheduler for help for RCU-sched. On the other hand, if the CPU is not in an RCU read-side critical section, the IPI handler reports the quiescent state immediately.h]hXWait for an RCU grace period, but expedite it. The basic idea is to IPI all non-idle non-nohz online CPUs. The IPI handler checks whether the CPU is in an RCU critical section, and if so, it sets a flag that causes the outermost rcu_read_unlock() to report the quiescent state for RCU-preempt or asks the scheduler for help for RCU-sched. On the other hand, if the CPU is not in an RCU read-side critical section, the IPI handler reports the quiescent state immediately.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjubh)}(hX`Although this is a great improvement over previous expedited implementations, it is still unfriendly to real-time workloads, so is thus not recommended for any sort of common-case code. In fact, if you are using synchronize_rcu_expedited() in a loop, please restructure your code to batch your updates, and then use a single synchronize_rcu() instead.h]hX`Although this is a great improvement over previous expedited implementations, it is still unfriendly to real-time workloads, so is thus not recommended for any sort of common-case code. In fact, if you are using synchronize_rcu_expedited() in a loop, please restructure your code to batch your updates, and then use a single synchronize_rcu() instead.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjubh)}(hKThis has the same semantics as (but is more brutal than) synchronize_rcu().h]hKThis has the same semantics as (but is more brutal than) synchronize_rcu().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 1start_poll_synchronize_rcu_expedited (C function)&c.start_poll_synchronize_rcu_expeditedhNtauh1hhjhhhNhNubj)}(hhh](j)}(h9unsigned long start_poll_synchronize_rcu_expedited (void)h]j)}(h8unsigned long start_poll_synchronize_rcu_expedited(void)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(h$start_poll_synchronize_rcu_expeditedh]j)}(h$start_poll_synchronize_rcu_expeditedh]h$start_poll_synchronize_rcu_expedited}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h;Snapshot current RCU state and start expedited grace periodh]h;Snapshot current RCU state and start expedited grace period}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhj0hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjKjjKjjjuh1jhhhjhNhNubj)}(hX}**Parameters** ``void`` no arguments **Description** Returns a cookie to pass to a call to cond_synchronize_rcu(), cond_synchronize_rcu_expedited(), or poll_state_synchronize_rcu(), allowing them to determine whether or not any sort of grace period has elapsed in the meantime. If the needed expedited grace period is not already slated to start, initiates that grace period.h](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjOubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjth]hvoid}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhKhjnubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjnubeh}(h]h ]h"]h$]h&]uh1jhjhKhjkubah}(h]h ]h"]h$]h&]uh1j hjOubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhKhjOubh)}(hXCReturns a cookie to pass to a call to cond_synchronize_rcu(), cond_synchronize_rcu_expedited(), or poll_state_synchronize_rcu(), allowing them to determine whether or not any sort of grace period has elapsed in the meantime. If the needed expedited grace period is not already slated to start, initiates that grace period.h]hXCReturns a cookie to pass to a call to cond_synchronize_rcu(), cond_synchronize_rcu_expedited(), or poll_state_synchronize_rcu(), allowing them to determine whether or not any sort of grace period has elapsed in the meantime. If the needed expedited grace period is not already slated to start, initiates that grace period.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjOubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 6start_poll_synchronize_rcu_expedited_full (C function)+c.start_poll_synchronize_rcu_expedited_fullhNtauh1hhjhhhNhNubj)}(hhh](j)}(hNvoid start_poll_synchronize_rcu_expedited_full (struct rcu_gp_oldstate *rgosp)h]j)}(hMvoid start_poll_synchronize_rcu_expedited_full(struct rcu_gp_oldstate *rgosp)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(h)start_poll_synchronize_rcu_expedited_fullh]j)}(h)start_poll_synchronize_rcu_expedited_fullh]h)start_poll_synchronize_rcu_expedited_full}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct rcu_gp_oldstate *rgosp)h]j)}(hstruct rcu_gp_oldstate *rgosph](j)}(hjAh]hstruct}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubh)}(hhh]j)}(hrcu_gp_oldstateh]hrcu_gp_oldstate}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjQmodnameN classnameNj] j` )}jc ]jf )}jY jsb+c.start_poll_synchronize_rcu_expedited_fullasbuh1hhj-ubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hrgosph]hrgosp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h5Take a full snapshot and start expedited grace periodh]h5Take a full snapshot and start expedited grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_gp_oldstate *rgosp`` Place to put snapshot of grace-period state **Description** Places the normal and expedited grace-period states in rgosp. This state value can be passed to a later call to cond_synchronize_rcu_full() or poll_state_synchronize_rcu_full() to determine whether or not a grace period (whether normal or expedited) has elapsed in the meantime. If the needed expedited grace period is not already slated to start, initiates that grace period.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjubj )}(hhh]j)}(hN``struct rcu_gp_oldstate *rgosp`` Place to put snapshot of grace-period state h](j)}(h!``struct rcu_gp_oldstate *rgosp``h]j)}(hjh]hstruct rcu_gp_oldstate *rgosp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjubj2)}(hhh]h)}(h+Place to put snapshot of grace-period stateh]h+Place to put snapshot of grace-period state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj0h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjubh)}(hXyPlaces the normal and expedited grace-period states in rgosp. This state value can be passed to a later call to cond_synchronize_rcu_full() or poll_state_synchronize_rcu_full() to determine whether or not a grace period (whether normal or expedited) has elapsed in the meantime. If the needed expedited grace period is not already slated to start, initiates that grace period.h]hXyPlaces the normal and expedited grace-period states in rgosp. This state value can be passed to a later call to cond_synchronize_rcu_full() or poll_state_synchronize_rcu_full() to determine whether or not a grace period (whether normal or expedited) has elapsed in the meantime. If the needed expedited grace period is not already slated to start, initiates that grace period.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j +cond_synchronize_rcu_expedited (C function) c.cond_synchronize_rcu_expeditedhNtauh1hhjhhhNhNubj)}(hhh](j)}(hah"]h$]h&]uh1j1hjqhhhjhM+ubj{)}(hcond_synchronize_rcu_expeditedh]j)}(hcond_synchronize_rcu_expeditedh]hcond_synchronize_rcu_expedited}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjqhhhjhM+ubj)}(h(unsigned long oldstate)h]j)}(hunsigned long oldstateh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(holdstateh]holdstate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjqhhhjhM+ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjmhhhjhM+ubah}(h]jhah ](jjeh"]h$]h&]jj)jhuh1jhjhM+hjjhhubj)}(hhh]h)}(h4Conditionally wait for an expedited RCU grace periodh]h4Conditionally wait for an expedited RCU grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhM+hjhhubah}(h]h ]h"]h$]h&]uh1jhjjhhhjhM+ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj,jj,jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``unsigned long oldstate`` value from get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or start_poll_synchronize_rcu_expedited() **Description** If any type of full RCU grace period has elapsed since the earlier call to get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or start_poll_synchronize_rcu_expedited(), just return. Otherwise, invoke synchronize_rcu_expedited() to wait for a full grace period. Yes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine. This function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **oldstate** and that returned at the end of this function.h](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhM/hj0ubj )}(hhh]j)}(h``unsigned long oldstate`` value from get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or start_poll_synchronize_rcu_expedited() h](j)}(h``unsigned long oldstate``h]j)}(hjUh]hunsigned long oldstate}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhM-hjOubj2)}(hhh]h)}(hovalue from get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or start_poll_synchronize_rcu_expedited()h]hovalue from get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or start_poll_synchronize_rcu_expedited()}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhM-hjkubah}(h]h ]h"]h$]h&]uh1j1hjOubeh}(h]h ]h"]h$]h&]uh1jhjjhM-hjLubah}(h]h ]h"]h$]h&]uh1j hj0ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhM/hj0ubh)}(hX If any type of full RCU grace period has elapsed since the earlier call to get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or start_poll_synchronize_rcu_expedited(), just return. Otherwise, invoke synchronize_rcu_expedited() to wait for a full grace period.h]hX If any type of full RCU grace period has elapsed since the earlier call to get_state_synchronize_rcu(), start_poll_synchronize_rcu(), or start_poll_synchronize_rcu_expedited(), just return. Otherwise, invoke synchronize_rcu_expedited() to wait for a full grace period.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhM.hj0ubh)}(hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine.h]hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhM3hj0ubh)}(hThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **oldstate** and that returned at the end of this function.h](hThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided }(hjhhhNhNubj)}(h **oldstate**h]holdstate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh/ and that returned at the end of this function.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhM8hj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 0cond_synchronize_rcu_expedited_full (C function)%c.cond_synchronize_rcu_expedited_fullhNtauh1hhjhhhNhNubj)}(hhh](j)}(hHvoid cond_synchronize_rcu_expedited_full (struct rcu_gp_oldstate *rgosp)h]j)}(hGvoid cond_synchronize_rcu_expedited_full(struct rcu_gp_oldstate *rgosp)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMFubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMFubj{)}(h#cond_synchronize_rcu_expedited_fullh]j)}(h#cond_synchronize_rcu_expedited_fullh]h#cond_synchronize_rcu_expedited_full}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMFubj)}(h(struct rcu_gp_oldstate *rgosp)h]j)}(hstruct rcu_gp_oldstate *rgosph](j)}(hjAh]hstruct}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hjOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubh)}(hhh]j)}(hrcu_gp_oldstateh]hrcu_gp_oldstate}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjbmodnameN classnameNj] j` )}jc ]jf )}jY j(sb%c.cond_synchronize_rcu_expedited_fullasbuh1hhj>ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hrgosph]hrgosp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMFubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMFubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMFhjhhubj)}(hhh]h)}(h4Conditionally wait for an expedited RCU grace periodh]h4Conditionally wait for an expedited RCU grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMFhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMFubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_gp_oldstate *rgosp`` value from get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full() **Description** If a full RCU grace period has elapsed since the call to get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full() from which **rgosp** was obtained, just return. Otherwise, invoke synchronize_rcu_expedited() to wait for a full grace period. Yes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine. This function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **rgosp** and that returned at the end of this function.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMJhjubj )}(hhh]j)}(h``struct rcu_gp_oldstate *rgosp`` value from get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full() h](j)}(h!``struct rcu_gp_oldstate *rgosp``h]j)}(hjh]hstruct rcu_gp_oldstate *rgosp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMGhjubj2)}(hhh]h)}(h~value from get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full()h]h~value from get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMGhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMGhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjAh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMIhjubh)}(hX,If a full RCU grace period has elapsed since the call to get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full() from which **rgosp** was obtained, just return. Otherwise, invoke synchronize_rcu_expedited() to wait for a full grace period.h](hIf a full RCU grace period has elapsed since the call to get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or start_poll_synchronize_rcu_expedited_full() from which }(hjWhhhNhNubj)}(h **rgosp**h]hrgosp}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubhk was obtained, just return. Otherwise, invoke synchronize_rcu_expedited() to wait for a full grace period.}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMHhjubh)}(hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine.h]hXYes, this function does not take counter wrap into account. But counter wrap is harmless. If the counter wraps, we have waited for more than 2 billion grace periods (and way more on a 64-bit system!), so waiting for a couple of additional grace periods should be just fine.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMNhjubh)}(hThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided **rgosp** and that returned at the end of this function.h](hThis function provides the same memory-ordering guarantees that would be provided by a synchronize_rcu() that was invoked at the call to the function that provided }(hjhhhNhNubj)}(h **rgosp**h]hrgosp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh/ and that returned at the end of this function.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:403: ./kernel/rcu/tree_exp.hhMShjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &rcu_read_lock_held_common (C function)c.rcu_read_lock_held_commonhNtauh1hhjhhhNhNubj)}(hhh](j)}(h*bool rcu_read_lock_held_common (bool *ret)h]j)}(h)bool rcu_read_lock_held_common(bool *ret)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKDubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKDubj{)}(hrcu_read_lock_held_commonh]j)}(hrcu_read_lock_held_commonh]hrcu_read_lock_held_common}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKDubj)}(h (bool *ret)h]j)}(h bool *reth](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hreth]hret}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKDubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKDubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKDhjhhubj)}(hhh]h)}(h4might we be in RCU-sched read-side critical section?h]h4might we be in RCU-sched read-side critical section?}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKDhjShhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKDubeh}(h]h ](jfunctioneh"]h$]h&]jjjjnjjnjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``bool *ret`` Best guess answer if lockdep cannot be relied on **Description** Returns true if lockdep must be ignored, in which case ``*ret`` contains the best guess described below. Otherwise returns false, in which case ``*ret`` tells the caller nothing and the caller should instead consult lockdep. If CONFIG_DEBUG_LOCK_ALLOC is selected, set ``*ret`` to nonzero iff in an RCU-sched read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU-sched read-side critical section unless it can prove otherwise. Note that disabling of preemption (including disabling irqs) counts as an RCU-sched read-side critical section. This is useful for debug checks in functions that required that they be called within an RCU-sched read-side critical section. Check debug_lockdep_rcu_enabled() to prevent false positives during boot and while lockdep is disabled. Note that if the CPU is in the idle loop from an RCU point of view (ie: that we are in the section between ct_idle_enter() and ct_idle_exit()) then rcu_read_lock_held() sets ``*ret`` to false even if the CPU did an rcu_read_lock(). The reason for this is that RCU ignores CPUs that are in such a section, considering these as in extended quiescent state, so such a CPU is effectively never in an RCU read-side critical section regardless of what RCU primitives it invokes. This state of affairs is required --- we need to keep an RCU-free window in idle where the CPU may possibly enter into low power mode. This way we can notice an extended quiescent state to other CPUs that started a grace period. Otherwise we would delay any grace period as long as we run in the idle task. Similarly, we avoid claiming an RCU read lock held if the current CPU is offline.h](h)}(h**Parameters**h]j)}(hjxh]h Parameters}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKHhjrubj )}(hhh]j)}(h?``bool *ret`` Best guess answer if lockdep cannot be relied on h](j)}(h ``bool *ret``h]j)}(hjh]h bool *ret}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKEhjubj2)}(hhh]h)}(h0Best guess answer if lockdep cannot be relied onh]h0Best guess answer if lockdep cannot be relied on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKEhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKEhjubah}(h]h ]h"]h$]h&]uh1j hjrubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKGhjrubh)}(hReturns true if lockdep must be ignored, in which case ``*ret`` contains the best guess described below. Otherwise returns false, in which case ``*ret`` tells the caller nothing and the caller should instead consult lockdep.h](h7Returns true if lockdep must be ignored, in which case }(hjhhhNhNubj)}(h``*ret``h]h*ret}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhR contains the best guess described below. Otherwise returns false, in which case }(hjhhhNhNubj)}(h``*ret``h]h*ret}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhH tells the caller nothing and the caller should instead consult lockdep.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKFhjrubh)}(hXIf CONFIG_DEBUG_LOCK_ALLOC is selected, set ``*ret`` to nonzero iff in an RCU-sched read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU-sched read-side critical section unless it can prove otherwise. Note that disabling of preemption (including disabling irqs) counts as an RCU-sched read-side critical section. This is useful for debug checks in functions that required that they be called within an RCU-sched read-side critical section.h](h,If CONFIG_DEBUG_LOCK_ALLOC is selected, set }(hjhhhNhNubj)}(h``*ret``h]h*ret}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX to nonzero iff in an RCU-sched read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU-sched read-side critical section unless it can prove otherwise. Note that disabling of preemption (including disabling irqs) counts as an RCU-sched read-side critical section. This is useful for debug checks in functions that required that they be called within an RCU-sched read-side critical section.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKKhjrubh)}(hgCheck debug_lockdep_rcu_enabled() to prevent false positives during boot and while lockdep is disabled.h]hgCheck debug_lockdep_rcu_enabled() to prevent false positives during boot and while lockdep is disabled.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKThjrubh)}(hX Note that if the CPU is in the idle loop from an RCU point of view (ie: that we are in the section between ct_idle_enter() and ct_idle_exit()) then rcu_read_lock_held() sets ``*ret`` to false even if the CPU did an rcu_read_lock(). The reason for this is that RCU ignores CPUs that are in such a section, considering these as in extended quiescent state, so such a CPU is effectively never in an RCU read-side critical section regardless of what RCU primitives it invokes. This state of affairs is required --- we need to keep an RCU-free window in idle where the CPU may possibly enter into low power mode. This way we can notice an extended quiescent state to other CPUs that started a grace period. Otherwise we would delay any grace period as long as we run in the idle task.h](hNote that if the CPU is in the idle loop from an RCU point of view (ie: that we are in the section between ct_idle_enter() and ct_idle_exit()) then rcu_read_lock_held() sets }(hjKhhhNhNubj)}(h``*ret``h]h*ret}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubhXW to false even if the CPU did an rcu_read_lock(). The reason for this is that RCU ignores CPUs that are in such a section, considering these as in extended quiescent state, so such a CPU is effectively never in an RCU read-side critical section regardless of what RCU primitives it invokes. This state of affairs is required --- we need to keep an RCU-free window in idle where the CPU may possibly enter into low power mode. This way we can notice an extended quiescent state to other CPUs that started a grace period. Otherwise we would delay any grace period as long as we run in the idle task.}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKWhjrubh)}(hQSimilarly, we avoid claiming an RCU read lock held if the current CPU is offline.h]hQSimilarly, we avoid claiming an RCU read lock held if the current CPU is offline.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKchjrubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_async_hurry (C function)c.rcu_async_hurryhNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_async_hurry (void)h]j)}(hvoid rcu_async_hurry(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hrcu_async_hurryh]j)}(hrcu_async_hurryh]hrcu_async_hurry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h)Make future async RCU callbacks not lazy.h]h)Make future async RCU callbacks not lazy.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``void`` no arguments **Description** After a call to this function, future calls to call_rcu() will be processed in a timely fashion.h](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjCh]hvoid}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhj=ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhKhjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhKhj:ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj~h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjubh)}(h`After a call to this function, future calls to call_rcu() will be processed in a timely fashion.h]h`After a call to this function, future calls to call_rcu() will be processed in a timely fashion.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_async_relax (C function)c.rcu_async_relaxhNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_async_relax (void)h]j)}(hvoid rcu_async_relax(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hrcu_async_relaxh]j)}(hrcu_async_relaxh]hrcu_async_relax}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h%Make future async RCU callbacks lazy.h]h%Make future async RCU callbacks lazy.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhj'hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjBjjBjjjuh1jhhhjhNhNubj)}(h**Parameters** ``void`` no arguments **Description** After a call to this function, future calls to call_rcu() will be processed in a lazy fashion.h](h)}(h**Parameters**h]j)}(hjLh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjFubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjkh]hvoid}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjeubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjeubeh}(h]h ]h"]h$]h&]uh1jhjhKhjbubah}(h]h ]h"]h$]h&]uh1j hjFubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjFubh)}(h^After a call to this function, future calls to call_rcu() will be processed in a lazy fashion.h]h^After a call to this function, future calls to call_rcu() will be processed in a lazy fashion.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_expedite_gp (C function)c.rcu_expedite_gphNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_expedite_gp (void)h]j)}(hvoid rcu_expedite_gp(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hrcu_expedite_gph]j)}(hrcu_expedite_gph]hrcu_expedite_gp}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h!Expedite future RCU grace periodsh]h!Expedite future RCU grace periods}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjOhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``void`` no arguments **Description** After a call to this function, future calls to synchronize_rcu() and friends act as the corresponding synchronize_rcu_expedited() function had instead been called.h](h)}(h**Parameters**h]j)}(hjth]h Parameters}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjnubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjnubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjnubh)}(hAfter a call to this function, future calls to synchronize_rcu() and friends act as the corresponding synchronize_rcu_expedited() function had instead been called.h]hAfter a call to this function, future calls to synchronize_rcu() and friends act as the corresponding synchronize_rcu_expedited() function had instead been called.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjnubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_unexpedite_gp (C function)c.rcu_unexpedite_gphNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_unexpedite_gp (void)h]j)}(hvoid rcu_unexpedite_gp(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj!hKubj{)}(hrcu_unexpedite_gph]j)}(hrcu_unexpedite_gph]hrcu_unexpedite_gp}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj!hKubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjPhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]noemphjjuh1jhjHubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj!hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj!hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj!hKhjhhubj)}(hhh]h)}(h)Cancel prior rcu_expedite_gp() invocationh]h)Cancel prior rcu_expedite_gp() invocation}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjwhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj!hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXk**Parameters** ``void`` no arguments **Description** Undo a prior call to rcu_expedite_gp(). If all prior calls to rcu_expedite_gp() are undone by a subsequent call to rcu_unexpedite_gp(), and if the rcu_expedited sysfs/boot parameter is not set, then all subsequent calls to synchronize_rcu() and friends will return to their normal non-expedited behavior.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhh hNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjubh)}(hX1Undo a prior call to rcu_expedite_gp(). If all prior calls to rcu_expedite_gp() are undone by a subsequent call to rcu_unexpedite_gp(), and if the rcu_expedited sysfs/boot parameter is not set, then all subsequent calls to synchronize_rcu() and friends will return to their normal non-expedited behavior.h]hX1Undo a prior call to rcu_expedite_gp(). If all prior calls to rcu_expedite_gp() are undone by a subsequent call to rcu_unexpedite_gp(), and if the rcu_expedited sysfs/boot parameter is not set, then all subsequent calls to synchronize_rcu() and friends will return to their normal non-expedited behavior.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_read_lock_held (C function)c.rcu_read_lock_heldhNtauh1hhjhhhNhNubj)}(hhh](j)}(h%int notrace rcu_read_lock_held (void)h]j)}(h$int notrace rcu_read_lock_held(void)h](j )}(hinth]hint}(hj; hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj7 hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMFubj2)}(h h]h }(hjJ hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7 hhhjI hMFubhnotrace}(hj7 hhhNhNubj2)}(h h]h }(hj\ hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7 hhhjI hMFubj{)}(hrcu_read_lock_heldh]j)}(hrcu_read_lock_heldh]hrcu_read_lock_held}(hjn hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj7 hhhjI hMFubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhj7 hhhjI hMFubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj3 hhhjI hMFubah}(h]j. ah ](jjeh"]h$]h&]jj)jhuh1jhjI hMFhj0 hhubj)}(hhh]h)}(h.might we be in RCU read-side critical section?h]h.might we be in RCU read-side critical section?}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMFhj hhubah}(h]h ]h"]h$]h&]uh1jhj0 hhhjI hMFubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj)}(hXq**Parameters** ``void`` no arguments **Description** If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU read-side critical section unless it can prove otherwise. This is useful for debug checks in functions that require that they be called within an RCU read-side critical section. Checks debug_lockdep_rcu_enabled() to prevent false positives during boot and while lockdep is disabled. Note that rcu_read_lock() and the matching rcu_read_unlock() must occur in the same context, for example, it is illegal to invoke rcu_read_unlock() in process context if the matching rcu_read_lock() was invoked from within an irq handler. Note that rcu_read_lock() is disallowed if the CPU is either idle or offline from an RCU perspective, so check for those as well.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMJhj ubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj h]hvoid}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhj ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj !hKhj !ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj !hKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hj0!h]h Description}(hj2!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.!ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhj ubh)}(hXZIf CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU read-side critical section unless it can prove otherwise. This is useful for debug checks in functions that require that they be called within an RCU read-side critical section.h]hXZIf CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU read-side critical section unless it can prove otherwise. This is useful for debug checks in functions that require that they be called within an RCU read-side critical section.}(hjF!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMGhj ubh)}(hhChecks debug_lockdep_rcu_enabled() to prevent false positives during boot and while lockdep is disabled.h]hhChecks debug_lockdep_rcu_enabled() to prevent false positives during boot and while lockdep is disabled.}(hjU!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMMhj ubh)}(hNote that rcu_read_lock() and the matching rcu_read_unlock() must occur in the same context, for example, it is illegal to invoke rcu_read_unlock() in process context if the matching rcu_read_lock() was invoked from within an irq handler.h]hNote that rcu_read_lock() and the matching rcu_read_unlock() must occur in the same context, for example, it is illegal to invoke rcu_read_unlock() in process context if the matching rcu_read_lock() was invoked from within an irq handler.}(hjd!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMPhj ubh)}(hNote that rcu_read_lock() is disallowed if the CPU is either idle or offline from an RCU perspective, so check for those as well.h]hNote that rcu_read_lock() is disallowed if the CPU is either idle or offline from an RCU perspective, so check for those as well.}(hjs!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMUhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "rcu_read_lock_bh_held (C function)c.rcu_read_lock_bh_heldhNtauh1hhjhhhNhNubj)}(hhh](j)}(h(int notrace rcu_read_lock_bh_held (void)h]j)}(h'int notrace rcu_read_lock_bh_held(void)h](j )}(hinth]hint}(hj!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMdubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!hhhj!hMdubhnotrace}(hj!hhhNhNubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!hhhj!hMdubj{)}(hrcu_read_lock_bh_heldh]j)}(hrcu_read_lock_bh_heldh]hrcu_read_lock_bh_held}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj!hhhj!hMdubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj!hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubah}(h]h ]h"]h$]h&]jjuh1jhj!hhhj!hMdubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj!hhhj!hMdubah}(h]j!ah ](jjeh"]h$]h&]jj)jhuh1jhj!hMdhj!hhubj)}(hhh]h)}(h1might we be in RCU-bh read-side critical section?h]h1might we be in RCU-bh read-side critical section?}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMdhj"hhubah}(h]h ]h"]h$]h&]uh1jhj!hhhj!hMdubeh}(h]h ](jfunctioneh"]h$]h&]jjjj3"jj3"jjjuh1jhhhjhNhNubj)}(hXW**Parameters** ``void`` no arguments **Description** Check for bottom half being disabled, which covers both the CONFIG_PROVE_RCU and not cases. Note that if someone uses rcu_read_lock_bh(), but then later enables BH, lockdep (if enabled) will show the situation. This is useful for debug checks in functions that require that they be called within an RCU read-side critical section. Check debug_lockdep_rcu_enabled() to prevent false positives during boot. Note that rcu_read_lock_bh() is disallowed if the CPU is either idle or offline from an RCU perspective, so check for those as well.h](h)}(h**Parameters**h]j)}(hj="h]h Parameters}(hj?"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;"ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhhj7"ubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj\"h]hvoid}(hj^"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ"ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhjV"ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hju"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjq"hKhjr"ubah}(h]h ]h"]h$]h&]uh1j1hjV"ubeh}(h]h ]h"]h$]h&]uh1jhjq"hKhjS"ubah}(h]h ]h"]h$]h&]uh1j hj7"ubh)}(h**Description**h]j)}(hj"h]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhj7"ubh)}(hXLCheck for bottom half being disabled, which covers both the CONFIG_PROVE_RCU and not cases. Note that if someone uses rcu_read_lock_bh(), but then later enables BH, lockdep (if enabled) will show the situation. This is useful for debug checks in functions that require that they be called within an RCU read-side critical section.h]hXLCheck for bottom half being disabled, which covers both the CONFIG_PROVE_RCU and not cases. Note that if someone uses rcu_read_lock_bh(), but then later enables BH, lockdep (if enabled) will show the situation. This is useful for debug checks in functions that require that they be called within an RCU read-side critical section.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMehj7"ubh)}(hICheck debug_lockdep_rcu_enabled() to prevent false positives during boot.h]hICheck debug_lockdep_rcu_enabled() to prevent false positives during boot.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMlhj7"ubh)}(hNote that rcu_read_lock_bh() is disallowed if the CPU is either idle or offline from an RCU perspective, so check for those as well.h]hNote that rcu_read_lock_bh() is disallowed if the CPU is either idle or offline from an RCU perspective, so check for those as well.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMnhj7"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j wakeme_after_rcu (C function)c.wakeme_after_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h-void wakeme_after_rcu (struct rcu_head *head)h]j)}(h,void wakeme_after_rcu(struct rcu_head *head)h](j )}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj"hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMubj2)}(h h]h }(hj #hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"hhhj#hMubj{)}(hwakeme_after_rcuh]j)}(hwakeme_after_rcuh]hwakeme_after_rcu}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj"hhhj#hMubj)}(h(struct rcu_head *head)h]j)}(hstruct rcu_head *headh](j)}(hjAh]hstruct}(hj7#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3#ubj2)}(h h]h }(hjD#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3#ubh)}(hhh]j)}(hrcu_headh]hrcu_head}(hjU#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR#ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjW#modnameN classnameNj] j` )}jc ]jf )}jY j#sbc.wakeme_after_rcuasbuh1hhj3#ubj2)}(h h]h }(hju#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3#ubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3#ubj)}(hheadh]hhead}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3#ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj/#ubah}(h]h ]h"]h$]h&]jjuh1jhj"hhhj#hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj"hhhj#hMubah}(h]j"ah ](jjeh"]h$]h&]jj)jhuh1jhj#hMhj"hhubj)}(hhh]h)}(h5Callback function to awaken a task after grace periodh]h5Callback function to awaken a task after grace period}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhj#hhubah}(h]h ]h"]h$]h&]uh1jhj"hhhj#hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj#jj#jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct rcu_head *head`` Pointer to rcu_head member within rcu_synchronize structure **Description** Awaken the corresponding task now that a grace period has elapsed.h](h)}(h**Parameters**h]j)}(hj#h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhj#ubj )}(hhh]j)}(hV``struct rcu_head *head`` Pointer to rcu_head member within rcu_synchronize structure h](j)}(h``struct rcu_head *head``h]j)}(hj#h]hstruct rcu_head *head}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhj#ubj2)}(hhh]h)}(h;Pointer to rcu_head member within rcu_synchronize structureh]h;Pointer to rcu_head member within rcu_synchronize structure}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj$ubah}(h]h ]h"]h$]h&]uh1j1hj#ubeh}(h]h ]h"]h$]h&]uh1jhj$hMhj#ubah}(h]h ]h"]h$]h&]uh1j hj#ubh)}(h**Description**h]j)}(hj6$h]h Description}(hj8$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4$ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhj#ubh)}(hBAwaken the corresponding task now that a grace period has elapsed.h]hBAwaken the corresponding task now that a grace period has elapsed.}(hjL$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #init_rcu_head_on_stack (C function)c.init_rcu_head_on_stackhNtauh1hhjhhhNhNubj)}(hhh](j)}(h3void init_rcu_head_on_stack (struct rcu_head *head)h]j)}(h2void init_rcu_head_on_stack(struct rcu_head *head)h](j )}(hvoidh]hvoid}(hj{$hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjw$hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjw$hhhj$hMubj{)}(hinit_rcu_head_on_stackh]j)}(hinit_rcu_head_on_stackh]hinit_rcu_head_on_stack}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjw$hhhj$hMubj)}(h(struct rcu_head *head)h]j)}(hstruct rcu_head *headh](j)}(hjAh]hstruct}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubh)}(hhh]j)}(hrcu_headh]hrcu_head}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj$modnameN classnameNj] j` )}jc ]jf )}jY j$sbc.init_rcu_head_on_stackasbuh1hhj$ubj2)}(h h]h }(hj$hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj$ubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hheadh]hhead}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj$ubah}(h]h ]h"]h$]h&]jjuh1jhjw$hhhj$hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjs$hhhj$hMubah}(h]jn$ah ](jjeh"]h$]h&]jj)jhuh1jhj$hMhjp$hhubj)}(hhh]h)}(h-initialize on-stack rcu_head for debugobjectsh]h-initialize on-stack rcu_head for debugobjects}(hj;%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhj8%hhubah}(h]h ]h"]h$]h&]uh1jhjp$hhhj$hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjS%jjS%jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_head *head`` pointer to rcu_head structure to be initialized **Description** This function informs debugobjects of a new rcu_head structure that has been allocated as an auto variable on the stack. This function is not required for rcu_head structures that are statically defined or that are dynamically allocated on the heap. This function has no effect for !CONFIG_DEBUG_OBJECTS_RCU_HEAD kernel builds.h](h)}(h**Parameters**h]j)}(hj]%h]h Parameters}(hj_%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[%ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhjW%ubj )}(hhh]j)}(hJ``struct rcu_head *head`` pointer to rcu_head structure to be initialized h](j)}(h``struct rcu_head *head``h]j)}(hj|%h]hstruct rcu_head *head}(hj~%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz%ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhjv%ubj2)}(hhh]h)}(h/pointer to rcu_head structure to be initializedh]h/pointer to rcu_head structure to be initialized}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1j1hjv%ubeh}(h]h ]h"]h$]h&]uh1jhj%hMhjs%ubah}(h]h ]h"]h$]h&]uh1j hjW%ubh)}(h**Description**h]j)}(hj%h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhjW%ubh)}(hXIThis function informs debugobjects of a new rcu_head structure that has been allocated as an auto variable on the stack. This function is not required for rcu_head structures that are statically defined or that are dynamically allocated on the heap. This function has no effect for !CONFIG_DEBUG_OBJECTS_RCU_HEAD kernel builds.h]hXIThis function informs debugobjects of a new rcu_head structure that has been allocated as an auto variable on the stack. This function is not required for rcu_head structures that are statically defined or that are dynamically allocated on the heap. This function has no effect for !CONFIG_DEBUG_OBJECTS_RCU_HEAD kernel builds.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhjW%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &destroy_rcu_head_on_stack (C function)c.destroy_rcu_head_on_stackhNtauh1hhjhhhNhNubj)}(hhh](j)}(h6void destroy_rcu_head_on_stack (struct rcu_head *head)h]j)}(h5void destroy_rcu_head_on_stack(struct rcu_head *head)h](j )}(hvoidh]hvoid}(hj%hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj%hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMubj2)}(h h]h }(hj &hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%hhhj &hMubj{)}(hdestroy_rcu_head_on_stackh]j)}(hdestroy_rcu_head_on_stackh]hdestroy_rcu_head_on_stack}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj%hhhj &hMubj)}(h(struct rcu_head *head)h]j)}(hstruct rcu_head *headh](j)}(hjAh]hstruct}(hj9&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5&ubj2)}(h h]h }(hjF&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5&ubh)}(hhh]j)}(hrcu_headh]hrcu_head}(hjW&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT&ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjY&modnameN classnameNj] j` )}jc ]jf )}jY j&sbc.destroy_rcu_head_on_stackasbuh1hhj5&ubj2)}(h h]h }(hjw&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5&ubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5&ubj)}(hheadh]hhead}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5&ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj1&ubah}(h]h ]h"]h$]h&]jjuh1jhj%hhhj &hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj%hhhj &hMubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj &hMhj%hhubj)}(hhh]h)}(h*destroy on-stack rcu_head for debugobjectsh]h*destroy on-stack rcu_head for debugobjects}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhj&hhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj &hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj&jj&jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_head *head`` pointer to rcu_head structure to be initialized **Description** This function informs debugobjects that an on-stack rcu_head structure is about to go out of scope. As with init_rcu_head_on_stack(), this function is not required for rcu_head structures that are statically defined or that are dynamically allocated on the heap. Also as with init_rcu_head_on_stack(), this function has no effect for !CONFIG_DEBUG_OBJECTS_RCU_HEAD kernel builds.h](h)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhj&ubj )}(hhh]j)}(hJ``struct rcu_head *head`` pointer to rcu_head structure to be initialized h](j)}(h``struct rcu_head *head``h]j)}(hj&h]hstruct rcu_head *head}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhj&ubj2)}(hhh]h)}(h/pointer to rcu_head structure to be initializedh]h/pointer to rcu_head structure to be initialized}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hMhj'ubah}(h]h ]h"]h$]h&]uh1j1hj&ubeh}(h]h ]h"]h$]h&]uh1jhj'hMhj&ubah}(h]h ]h"]h$]h&]uh1j hj&ubh)}(h**Description**h]j)}(hj8'h]h Description}(hj:'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6'ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhj&ubh)}(hX}This function informs debugobjects that an on-stack rcu_head structure is about to go out of scope. As with init_rcu_head_on_stack(), this function is not required for rcu_head structures that are statically defined or that are dynamically allocated on the heap. Also as with init_rcu_head_on_stack(), this function has no effect for !CONFIG_DEBUG_OBJECTS_RCU_HEAD kernel builds.h]hX}This function informs debugobjects that an on-stack rcu_head structure is about to go out of scope. As with init_rcu_head_on_stack(), this function is not required for rcu_head structures that are statically defined or that are dynamically allocated on the heap. Also as with init_rcu_head_on_stack(), this function has no effect for !CONFIG_DEBUG_OBJECTS_RCU_HEAD kernel builds.}(hjN'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMhj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *get_completed_synchronize_rcu (C function)c.get_completed_synchronize_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h2unsigned long get_completed_synchronize_rcu (void)h]j)}(h1unsigned long get_completed_synchronize_rcu(void)h](j )}(hunsignedh]hunsigned}(hj}'hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjy'hhhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMPubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjy'hhhj'hMPubj )}(hlongh]hlong}(hj'hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjy'hhhj'hMPubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjy'hhhj'hMPubj{)}(hget_completed_synchronize_rcuh]j)}(hget_completed_synchronize_rcuh]hget_completed_synchronize_rcu}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjy'hhhj'hMPubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj'hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj'ubah}(h]h ]h"]h$]h&]jjuh1jhjy'hhhj'hMPubeh}(h]h ]h"]h$]h&]jjjuh1jjjhju'hhhj'hMPubah}(h]jp'ah ](jjeh"]h$]h&]jj)jhuh1jhj'hMPhjr'hhubj)}(hhh]h)}(h*Return a pre-completed polled state cookieh]h*Return a pre-completed polled state cookie}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMPhj'hhubah}(h]h ]h"]h$]h&]uh1jhjr'hhhj'hMPubeh}(h]h ](jfunctioneh"]h$]h&]jjjj(jj(jjjuh1jhhhjhNhNubj)}(h**Parameters** ``void`` no arguments **Description** Returns a value that will always be treated by functions like poll_state_synchronize_rcu() as a cookie whose grace period has already completed.h](h)}(h**Parameters**h]j)}(hj"(h]h Parameters}(hj$(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj (ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMThj(ubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjA(h]hvoid}(hjC(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?(ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhj;(ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjZ(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjV(hKhjW(ubah}(h]h ]h"]h$]h&]uh1j1hj;(ubeh}(h]h ]h"]h$]h&]uh1jhjV(hKhj8(ubah}(h]h ]h"]h$]h&]uh1j hj(ubh)}(h**Description**h]j)}(hj|(h]h Description}(hj~(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz(ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chKhj(ubh)}(hReturns a value that will always be treated by functions like poll_state_synchronize_rcu() as a cookie whose grace period has already completed.h]hReturns a value that will always be treated by functions like poll_state_synchronize_rcu() as a cookie whose grace period has already completed.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:405: ./kernel/rcu/update.chMQhj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j +get_completed_synchronize_srcu (C function) c.get_completed_synchronize_srcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h3unsigned long get_completed_synchronize_srcu (void)h]j)}(h2unsigned long get_completed_synchronize_srcu(void)h](j )}(hunsignedh]hunsigned}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj(hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKbubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(hhhj(hKbubj )}(hlongh]hlong}(hj(hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj(hhhj(hKbubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(hhhj(hKbubj{)}(hget_completed_synchronize_srcuh]j)}(hget_completed_synchronize_srcuh]hget_completed_synchronize_srcu}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj(hhhj(hKbubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hj)hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubah}(h]h ]h"]h$]h&]jjuh1jhj(hhhj(hKbubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj(hhhj(hKbubah}(h]j(ah ](jjeh"]h$]h&]jj)jhuh1jhj(hKbhj(hhubj)}(hhh]h)}(h*Return a pre-completed polled state cookieh]h*Return a pre-completed polled state cookie}(hjD)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKbhjA)hhubah}(h]h ]h"]h$]h&]uh1jhj(hhhj(hKbubeh}(h]h ](jfunctioneh"]h$]h&]jjjj\)jj\)jjjuh1jhhhjhNhNubj)}(h**Parameters** ``void`` no arguments **Description** Returns a value that poll_state_synchronize_srcu() will always treat as a cookie whose grace period has already completed.h](h)}(h**Parameters**h]j)}(hjf)h]h Parameters}(hjh)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjd)ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKfhj`)ubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj)h]hvoid}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj)ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hKhj)ubah}(h]h ]h"]h$]h&]uh1j1hj)ubeh}(h]h ]h"]h$]h&]uh1jhj)hKhj|)ubah}(h]h ]h"]h$]h&]uh1j hj`)ubh)}(h**Description**h]j)}(hj)h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj`)ubh)}(hzReturns a value that poll_state_synchronize_srcu() will always treat as a cookie whose grace period has already completed.h]hzReturns a value that poll_state_synchronize_srcu() will always treat as a cookie whose grace period has already completed.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKchj`)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (same_state_synchronize_srcu (C function)c.same_state_synchronize_srcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hSbool same_state_synchronize_srcu (unsigned long oldstate1, unsigned long oldstate2)h]j)}(hRbool same_state_synchronize_srcu(unsigned long oldstate1, unsigned long oldstate2)h](j )}(hj8h]hbool}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKuubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*hhhj*hKuubj{)}(hsame_state_synchronize_srcuh]j)}(hsame_state_synchronize_srcuh]hsame_state_synchronize_srcu}(hj%*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!*ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj*hhhj*hKuubj)}(h2(unsigned long oldstate1, unsigned long oldstate2)h](j)}(hunsigned long oldstate1h](j )}(hunsignedh]hunsigned}(hjA*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj=*ubj2)}(h h]h }(hjO*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=*ubj )}(hlongh]hlong}(hj]*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj=*ubj2)}(h h]h }(hjk*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj=*ubj)}(h oldstate1h]h oldstate1}(hjy*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=*ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9*ubj)}(hunsigned long oldstate2h](j )}(hunsignedh]hunsigned}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj )}(hlongh]hlong}(hj*hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj*ubj2)}(h h]h }(hj*hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*ubj)}(h oldstate2h]h oldstate2}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj9*ubeh}(h]h ]h"]h$]h&]jjuh1jhj*hhhj*hKuubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj)hhhj*hKuubah}(h]j)ah ](jjeh"]h$]h&]jj)jhuh1jhj*hKuhj)hhubj)}(hhh]h)}(h#Are two old-state values identical?h]h#Are two old-state values identical?}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKuhj*hhubah}(h]h ]h"]h$]h&]uh1jhj)hhhj*hKuubeh}(h]h ](jfunctioneh"]h$]h&]jjjj +jj +jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``unsigned long oldstate1`` First old-state value. ``unsigned long oldstate2`` Second old-state value. **Description** The two old-state values must have been obtained from either get_state_synchronize_srcu(), start_poll_synchronize_srcu(), or get_completed_synchronize_srcu(). Returns **true** if the two values are identical and **false** otherwise. This allows structures whose lifetimes are tracked by old-state values to push these values to a list header, allowing those structures to be slightly smaller.h](h)}(h**Parameters**h]j)}(hj+h]h Parameters}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKyhj+ubj )}(hhh](j)}(h3``unsigned long oldstate1`` First old-state value. h](j)}(h``unsigned long oldstate1``h]j)}(hj5+h]hunsigned long oldstate1}(hj7+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3+ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKvhj/+ubj2)}(hhh]h)}(hFirst old-state value.h]hFirst old-state value.}(hjN+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJ+hKvhjK+ubah}(h]h ]h"]h$]h&]uh1j1hj/+ubeh}(h]h ]h"]h$]h&]uh1jhjJ+hKvhj,+ubj)}(h4``unsigned long oldstate2`` Second old-state value. h](j)}(h``unsigned long oldstate2``h]j)}(hjn+h]hunsigned long oldstate2}(hjp+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl+ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKwhjh+ubj2)}(hhh]h)}(hSecond old-state value.h]hSecond old-state value.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hKwhj+ubah}(h]h ]h"]h$]h&]uh1j1hjh+ubeh}(h]h ]h"]h$]h&]uh1jhj+hKwhj,+ubeh}(h]h ]h"]h$]h&]uh1j hj+ubh)}(h**Description**h]j)}(hj+h]h Description}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKyhj+ubh)}(hXThe two old-state values must have been obtained from either get_state_synchronize_srcu(), start_poll_synchronize_srcu(), or get_completed_synchronize_srcu(). Returns **true** if the two values are identical and **false** otherwise. This allows structures whose lifetimes are tracked by old-state values to push these values to a list header, allowing those structures to be slightly smaller.h](hThe two old-state values must have been obtained from either get_state_synchronize_srcu(), start_poll_synchronize_srcu(), or get_completed_synchronize_srcu(). Returns }(hj+hhhNhNubj)}(h**true**h]htrue}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh% if the two values are identical and }(hj+hhhNhNubj)}(h **false**h]hfalse}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh otherwise. This allows structures whose lifetimes are tracked by old-state values to push these values to a list header, allowing those structures to be slightly smaller.}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKxhj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  srcu_read_lock_held (C function)c.srcu_read_lock_heldhNtauh1hhjhhhNhNubj)}(hhh](j)}(h7int srcu_read_lock_held (const struct srcu_struct *ssp)h]j)}(h6int srcu_read_lock_held(const struct srcu_struct *ssp)h](j )}(hinth]hint}(hj,hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj,hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKubj2)}(h h]h }(hj!,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,hhhj ,hKubj{)}(hsrcu_read_lock_heldh]j)}(hsrcu_read_lock_heldh]hsrcu_read_lock_held}(hj3,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/,ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj,hhhj ,hKubj)}(h(const struct srcu_struct *ssp)h]j)}(hconst struct srcu_struct *ssph](j)}(hjh]hconst}(hjO,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK,ubj2)}(h h]h }(hj\,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjK,ubj)}(hjAh]hstruct}(hjj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK,ubj2)}(h h]h }(hjw,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjK,ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj,modnameN classnameNj] j` )}jc ]jf )}jY j5,sbc.srcu_read_lock_heldasbuh1hhjK,ubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjK,ubj)}(hjh]h*}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK,ubj)}(hssph]hssp}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjG,ubah}(h]h ]h"]h$]h&]jjuh1jhj,hhhj ,hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj ,hhhj ,hKubah}(h]j,ah ](jjeh"]h$]h&]jj)jhuh1jhj ,hKhj,hhubj)}(hhh]h)}(h/might we be in SRCU read-side critical section?h]h/might we be in SRCU read-side critical section?}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj,hhubah}(h]h ]h"]h$]h&]uh1jhj,hhhj ,hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj-jj-jjjuh1jhhhjhNhNubj)}(hXj**Parameters** ``const struct srcu_struct *ssp`` The srcu_struct structure to check **Description** If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an SRCU read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an SRCU read-side critical section unless it can prove otherwise. Checks debug_lockdep_rcu_enabled() to prevent false positives during boot and while lockdep is disabled. Note that SRCU is based on its own statemachine and it doesn't relies on normal RCU, it can be called from the CPU which is in the idle loop from an RCU point of view or offline.h](h)}(h**Parameters**h]j)}(hj-h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj -ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj -ubj )}(hhh]j)}(hE``const struct srcu_struct *ssp`` The srcu_struct structure to check h](j)}(h!``const struct srcu_struct *ssp``h]j)}(hj.-h]hconst struct srcu_struct *ssp}(hj0-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,-ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj(-ubj2)}(hhh]h)}(h"The srcu_struct structure to checkh]h"The srcu_struct structure to check}(hjG-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjC-hKhjD-ubah}(h]h ]h"]h$]h&]uh1j1hj(-ubeh}(h]h ]h"]h$]h&]uh1jhjC-hKhj%-ubah}(h]h ]h"]h$]h&]uh1j hj -ubh)}(h**Description**h]j)}(hji-h]h Description}(hjk-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg-ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj -ubh)}(hIf CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an SRCU read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an SRCU read-side critical section unless it can prove otherwise.h]hIf CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an SRCU read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an SRCU read-side critical section unless it can prove otherwise.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj -ubh)}(hhChecks debug_lockdep_rcu_enabled() to prevent false positives during boot and while lockdep is disabled.h]hhChecks debug_lockdep_rcu_enabled() to prevent false positives during boot and while lockdep is disabled.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj -ubh)}(hNote that SRCU is based on its own statemachine and it doesn't relies on normal RCU, it can be called from the CPU which is in the idle loop from an RCU point of view or offline.h]hNote that SRCU is based on its own statemachine and it doesn’t relies on normal RCU, it can be called from the CPU which is in the idle loop from an RCU point of view or offline.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj -ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  srcu_dereference_check (C macro)c.srcu_dereference_checkhNtauh1hhjhhhNhNubj)}(hhh](j)}(hsrcu_dereference_checkh]j)}(hsrcu_dereference_checkh]j{)}(hsrcu_dereference_checkh]j)}(hj-h]hsrcu_dereference_check}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj-hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhj-hhhj-hKubah}(h]j-ah ](jjeh"]h$]h&]jj)jhuh1jhj-hKhj-hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj-hhhj-hKubeh}(h]h ](jmacroeh"]h$]h&]jjjj-jj-jjjuh1jhhhjhNhNubh)}(h&``srcu_dereference_check (p, ssp, c)``h]j)}(hj.h]h"srcu_dereference_check (p, ssp, c)}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhjhhubj)}(h5fetch SRCU-protected pointer for later dereferencing h]h)}(h4fetch SRCU-protected pointer for later dereferencingh]h4fetch SRCU-protected pointer for later dereferencing}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj.ubah}(h]h ]h"]h$]h&]uh1jhj*.hKhjhhubj)}(hX**Parameters** ``p`` the pointer to fetch and protect for later dereferencing ``ssp`` pointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section. ``c`` condition to check for update-side use **Description** If PROVE_RCU is enabled, invoking this outside of an RCU read-side critical section will result in an RCU-lockdep splat, unless **c** evaluates to 1. The **c** argument will normally be a logical expression containing lockdep_is_held() calls.h](h)}(h**Parameters**h]j)}(hj7.h]h Parameters}(hj9.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5.ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj1.ubj )}(hhh](j)}(h?``p`` the pointer to fetch and protect for later dereferencing h](j)}(h``p``h]j)}(hjV.h]hp}(hjX.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT.ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhjP.ubj2)}(hhh]h)}(h8the pointer to fetch and protect for later dereferencingh]h8the pointer to fetch and protect for later dereferencing}(hjo.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjk.hKhjl.ubah}(h]h ]h"]h$]h&]uh1j1hjP.ubeh}(h]h ]h"]h$]h&]uh1jhjk.hKhjM.ubj)}(hu``ssp`` pointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section. h](j)}(h``ssp``h]j)}(hj.h]hssp}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj.ubj2)}(hhh]h)}(hlpointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section.h]hlpointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj.ubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhjM.ubj)}(h-``c`` condition to check for update-side use h](j)}(h``c``h]j)}(hj.h]hc}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj.ubj2)}(hhh]h)}(h&condition to check for update-side useh]h&condition to check for update-side use}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hKhj.ubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhjM.ubeh}(h]h ]h"]h$]h&]uh1j hj1.ubh)}(h**Description**h]j)}(hj/h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj1.ubh)}(hIf PROVE_RCU is enabled, invoking this outside of an RCU read-side critical section will result in an RCU-lockdep splat, unless **c** evaluates to 1. The **c** argument will normally be a logical expression containing lockdep_is_held() calls.h](hIf PROVE_RCU is enabled, invoking this outside of an RCU read-side critical section will result in an RCU-lockdep splat, unless }(hj/hhhNhNubj)}(h**c**h]hc}(hj"/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh evaluates to 1. The }(hj/hhhNhNubj)}(h**c**h]hc}(hj4/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubhS argument will normally be a logical expression containing lockdep_is_held() calls.}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj1.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j srcu_dereference (C macro)c.srcu_dereferencehNtauh1hhjhhhNhNubj)}(hhh](j)}(hsrcu_dereferenceh]j)}(hsrcu_dereferenceh]j{)}(hsrcu_dereferenceh]j)}(hjg/h]hsrcu_dereference}(hjq/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjm/ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhji/hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhje/hhhj/hKubah}(h]j`/ah ](jjeh"]h$]h&]jj)jhuh1jhj/hKhjb/hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjb/hhhj/hKubeh}(h]h ](jmacroeh"]h$]h&]jjjj/jj/jjjuh1jhhhjhNhNubh)}(h``srcu_dereference (p, ssp)``h]j)}(hj/h]hsrcu_dereference (p, ssp)}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhjhhubj)}(h5fetch SRCU-protected pointer for later dereferencing h]h)}(h4fetch SRCU-protected pointer for later dereferencingh]h4fetch SRCU-protected pointer for later dereferencing}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj/ubah}(h]h ]h"]h$]h&]uh1jhj/hKhjhhubj)}(hX**Parameters** ``p`` the pointer to fetch and protect for later dereferencing ``ssp`` pointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section. **Description** Makes rcu_dereference_check() do the dirty work. If PROVE_RCU is enabled, invoking this outside of an RCU read-side critical section will result in an RCU-lockdep splat.h](h)}(h**Parameters**h]j)}(hj/h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj/ubj )}(hhh](j)}(h?``p`` the pointer to fetch and protect for later dereferencing h](j)}(h``p``h]j)}(hj/h]hp}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj/ubj2)}(hhh]h)}(h8the pointer to fetch and protect for later dereferencingh]h8the pointer to fetch and protect for later dereferencing}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 0hKhj 0ubah}(h]h ]h"]h$]h&]uh1j1hj/ubeh}(h]h ]h"]h$]h&]uh1jhj 0hKhj/ubj)}(hu``ssp`` pointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section. h](j)}(h``ssp``h]j)}(hj00h]hssp}(hj20hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.0ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj*0ubj2)}(hhh]h)}(hlpointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section.h]hlpointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section.}(hjI0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhjF0ubah}(h]h ]h"]h$]h&]uh1j1hj*0ubeh}(h]h ]h"]h$]h&]uh1jhjE0hKhj/ubeh}(h]h ]h"]h$]h&]uh1j hj/ubh)}(h**Description**h]j)}(hjl0h]h Description}(hjn0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj0ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj/ubh)}(hMakes rcu_dereference_check() do the dirty work. If PROVE_RCU is enabled, invoking this outside of an RCU read-side critical section will result in an RCU-lockdep splat.h]hMakes rcu_dereference_check() do the dirty work. If PROVE_RCU is enabled, invoking this outside of an RCU read-side critical section will result in an RCU-lockdep splat.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "srcu_dereference_notrace (C macro)c.srcu_dereference_notracehNtauh1hhjhhhNhNubj)}(hhh](j)}(hsrcu_dereference_notraceh]j)}(hsrcu_dereference_notraceh]j{)}(hsrcu_dereference_notraceh]j)}(hj0h]hsrcu_dereference_notrace}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj0hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj0hhhj0hMubah}(h]j0ah ](jjeh"]h$]h&]jj)jhuh1jhj0hMhj0hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj0hhhj0hMubeh}(h]h ](jmacroeh"]h$]h&]jjjj0jj0jjjuh1jhhhjhNhNubh)}(h%``srcu_dereference_notrace (p, ssp)``h]j)}(hj0h]h!srcu_dereference_notrace (p, ssp)}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjhhubj)}(h*no tracing and no lockdep calls from here h]h)}(h)no tracing and no lockdep calls from hereh]h)no tracing and no lockdep calls from here}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj0ubah}(h]h ]h"]h$]h&]uh1jhj1hMhjhhubj)}(h**Parameters** ``p`` the pointer to fetch and protect for later dereferencing ``ssp`` pointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section.h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj1ubj )}(hhh](j)}(h?``p`` the pointer to fetch and protect for later dereferencing h](j)}(h``p``h]j)}(hj;1h]hp}(hj=1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj91ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj51ubj2)}(hhh]h)}(h8the pointer to fetch and protect for later dereferencingh]h8the pointer to fetch and protect for later dereferencing}(hjT1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjP1hMhjQ1ubah}(h]h ]h"]h$]h&]uh1j1hj51ubeh}(h]h ]h"]h$]h&]uh1jhjP1hMhj21ubj)}(ht``ssp`` pointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section.h](j)}(h``ssp``h]j)}(hjt1h]hssp}(hjv1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjr1ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjn1ubj2)}(hhh]h)}(hlpointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section.h]hlpointer to the srcu_struct, which is used to check that we really are in an SRCU read-side critical section.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1j1hjn1ubeh}(h]h ]h"]h$]h&]uh1jhj1hMhj21ubeh}(h]h ]h"]h$]h&]uh1j hj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j srcu_read_lock (C function)c.srcu_read_lockhNtauh1hhjhhhNhNubj)}(hhh](j)}(h,int srcu_read_lock (struct srcu_struct *ssp)h]j)}(h+int srcu_read_lock(struct srcu_struct *ssp)h](j )}(hinth]hint}(hj1hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj1hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM ubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1hhhj1hM ubj{)}(hsrcu_read_lockh]j)}(hsrcu_read_lockh]hsrcu_read_lock}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj1hhhj1hM ubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj 2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj2)}(h h]h }(hj2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj(2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%2ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj*2modnameN classnameNj] j` )}jc ]jf )}jY j1sbc.srcu_read_lockasbuh1hhj2ubj2)}(h h]h }(hjH2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubj)}(hjh]h*}(hjV2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hssph]hssp}(hjc2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj2ubah}(h]h ]h"]h$]h&]jjuh1jhj1hhhj1hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj1hhhj1hM ubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1jhj1hM hj1hhubj)}(hhh]h)}(h6register a new reader for an SRCU-protected structure.h]h6register a new reader for an SRCU-protected structure.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM hj2hhubah}(h]h ]h"]h$]h&]uh1jhj1hhhj1hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj2jj2jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. **Description** Enter an SRCU read-side critical section. Note that SRCU read-side critical sections may be nested. However, it is illegal to call anything that waits on an SRCU grace period for the same srcu_struct, whether directly or indirectly. Please note that one way to indirectly wait on an SRCU grace period is to acquire a mutex that is held elsewhere while calling synchronize_srcu() or synchronize_srcu_expedited(). The return value from srcu_read_lock() is guaranteed to be non-negative. This value must be passed unaltered to the matching srcu_read_unlock(). Note that srcu_read_lock() and the matching srcu_read_unlock() must occur in the same context, for example, it is illegal to invoke srcu_read_unlock() in an irq handler if the matching srcu_read_lock() was invoked in process context. Or, for that matter to invoke srcu_read_unlock() from one task and the matching srcu_read_lock() from another.h](h)}(h**Parameters**h]j)}(hj2h]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj2ubj )}(hhh]j)}(hM``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj2h]hstruct srcu_struct *ssp}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM hj2ubj2)}(hhh]h)}(h0srcu_struct in which to register the new reader.h]h0srcu_struct in which to register the new reader.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hM hj2ubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhj2hM hj2ubah}(h]h ]h"]h$]h&]uh1j hj2ubh)}(h**Description**h]j)}(hj 3h]h Description}(hj 3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj2ubh)}(hXEnter an SRCU read-side critical section. Note that SRCU read-side critical sections may be nested. However, it is illegal to call anything that waits on an SRCU grace period for the same srcu_struct, whether directly or indirectly. Please note that one way to indirectly wait on an SRCU grace period is to acquire a mutex that is held elsewhere while calling synchronize_srcu() or synchronize_srcu_expedited().h]hXEnter an SRCU read-side critical section. Note that SRCU read-side critical sections may be nested. However, it is illegal to call anything that waits on an SRCU grace period for the same srcu_struct, whether directly or indirectly. Please note that one way to indirectly wait on an SRCU grace period is to acquire a mutex that is held elsewhere while calling synchronize_srcu() or synchronize_srcu_expedited().}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM hj2ubh)}(hXThe return value from srcu_read_lock() is guaranteed to be non-negative. This value must be passed unaltered to the matching srcu_read_unlock(). Note that srcu_read_lock() and the matching srcu_read_unlock() must occur in the same context, for example, it is illegal to invoke srcu_read_unlock() in an irq handler if the matching srcu_read_lock() was invoked in process context. Or, for that matter to invoke srcu_read_unlock() from one task and the matching srcu_read_lock() from another.h]hXThe return value from srcu_read_lock() is guaranteed to be non-negative. This value must be passed unaltered to the matching srcu_read_unlock(). Note that srcu_read_lock() and the matching srcu_read_unlock() must occur in the same context, for example, it is illegal to invoke srcu_read_unlock() in an irq handler if the matching srcu_read_lock() was invoked in process context. Or, for that matter to invoke srcu_read_unlock() from one task and the matching srcu_read_lock() from another.}(hj.3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  srcu_read_lock_fast (C function)c.srcu_read_lock_fasthNtauh1hhjhhhNhNubj)}(hhh](j)}(hHstruct srcu_ctr __percpu * srcu_read_lock_fast (struct srcu_struct *ssp)h]j)}(hFstruct srcu_ctr __percpu *srcu_read_lock_fast(struct srcu_struct *ssp)h](j)}(hjAh]hstruct}(hj]3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY3hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM+ubj2)}(h h]h }(hjk3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjY3hhhjj3hM+ubh)}(hhh]j)}(hsrcu_ctrh]hsrcu_ctr}(hj|3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy3ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj~3modnameN classnameNj] j` )}jc ]jf )}jY srcu_read_lock_fastsbc.srcu_read_lock_fastasbuh1hhjY3hhhjj3hM+ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjY3hhhjj3hM+ubh__percpu}(hjY3hhhNhNubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjY3hhhjj3hM+ubj)}(hjh]h*}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY3hhhjj3hM+ubj{)}(hsrcu_read_lock_fasth]j)}(hj3h]hsrcu_read_lock_fast}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjY3hhhjj3hM+ubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj2)}(h h]h }(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj 4modnameN classnameNj] j` )}jc ]j3c.srcu_read_lock_fastasbuh1hhj3ubj2)}(h h]h }(hj%4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj)}(hjh]h*}(hj34hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj)}(hssph]hssp}(hj@4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubah}(h]h ]h"]h$]h&]jjuh1jhjY3hhhjj3hM+ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjU3hhhjj3hM+ubah}(h]jP3ah ](jjeh"]h$]h&]jj)jhuh1jhjj3hM+hjR3hhubj)}(hhh]h)}(h6register a new reader for an SRCU-protected structure.h]h6register a new reader for an SRCU-protected structure.}(hjj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM+hjg4hhubah}(h]h ]h"]h$]h&]uh1jhjR3hhhjj3hM+ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4jj4jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. **Description** Enter an SRCU read-side critical section, but for a light-weight smp_mb()-free reader. See srcu_read_lock() for more information. This function is NMI-safe, in a manner similar to srcu_read_lock_nmisafe(). For srcu_read_lock_fast() to be used on an srcu_struct structure, that structure must have been defined using either DEFINE_SRCU_FAST() or DEFINE_STATIC_SRCU_FAST() on the one hand or initialized with init_srcu_struct_fast() on the other. Such an srcu_struct structure cannot be passed to any non-fast variant of srcu_read_{,un}lock() or srcu_{down,up}_read(). In kernels built with CONFIG_PROVE_RCU=y, __srcu_check_read_flavor() will complain bitterly if you ignore this restriction. Grace-period auto-expediting is disabled for SRCU-fast srcu_struct structures because SRCU-fast expedited grace periods invoke synchronize_rcu_expedited(), IPIs and all. If you need expedited SRCU-fast grace periods, use synchronize_srcu_expedited(). The srcu_read_lock_fast() function can be invoked only from those contexts where RCU is watching, that is, from contexts where it would be legal to invoke rcu_read_lock(). Otherwise, lockdep will complain.h](h)}(h**Parameters**h]j)}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM/hj4ubj )}(hhh]j)}(hM``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj4h]hstruct srcu_struct *ssp}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM,hj4ubj2)}(hhh]h)}(h0srcu_struct in which to register the new reader.h]h0srcu_struct in which to register the new reader.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hM,hj4ubah}(h]h ]h"]h$]h&]uh1j1hj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hM,hj4ubah}(h]h ]h"]h$]h&]uh1j hj4ubh)}(h**Description**h]j)}(hj4h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM.hj4ubh)}(hEnter an SRCU read-side critical section, but for a light-weight smp_mb()-free reader. See srcu_read_lock() for more information. This function is NMI-safe, in a manner similar to srcu_read_lock_nmisafe().h]hEnter an SRCU read-side critical section, but for a light-weight smp_mb()-free reader. See srcu_read_lock() for more information. This function is NMI-safe, in a manner similar to srcu_read_lock_nmisafe().}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM-hj4ubh)}(hXFor srcu_read_lock_fast() to be used on an srcu_struct structure, that structure must have been defined using either DEFINE_SRCU_FAST() or DEFINE_STATIC_SRCU_FAST() on the one hand or initialized with init_srcu_struct_fast() on the other. Such an srcu_struct structure cannot be passed to any non-fast variant of srcu_read_{,un}lock() or srcu_{down,up}_read(). In kernels built with CONFIG_PROVE_RCU=y, __srcu_check_read_flavor() will complain bitterly if you ignore this restriction.h]hXFor srcu_read_lock_fast() to be used on an srcu_struct structure, that structure must have been defined using either DEFINE_SRCU_FAST() or DEFINE_STATIC_SRCU_FAST() on the one hand or initialized with init_srcu_struct_fast() on the other. Such an srcu_struct structure cannot be passed to any non-fast variant of srcu_read_{,un}lock() or srcu_{down,up}_read(). In kernels built with CONFIG_PROVE_RCU=y, __srcu_check_read_flavor() will complain bitterly if you ignore this restriction.}(hj 5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM1hj4ubh)}(hGrace-period auto-expediting is disabled for SRCU-fast srcu_struct structures because SRCU-fast expedited grace periods invoke synchronize_rcu_expedited(), IPIs and all. If you need expedited SRCU-fast grace periods, use synchronize_srcu_expedited().h]hGrace-period auto-expediting is disabled for SRCU-fast srcu_struct structures because SRCU-fast expedited grace periods invoke synchronize_rcu_expedited(), IPIs and all. If you need expedited SRCU-fast grace periods, use synchronize_srcu_expedited().}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM:hj4ubh)}(hThe srcu_read_lock_fast() function can be invoked only from those contexts where RCU is watching, that is, from contexts where it would be legal to invoke rcu_read_lock(). Otherwise, lockdep will complain.h]hThe srcu_read_lock_fast() function can be invoked only from those contexts where RCU is watching, that is, from contexts where it would be legal to invoke rcu_read_lock(). Otherwise, lockdep will complain.}(hj)5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM?hj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'srcu_read_lock_fast_updown (C function)c.srcu_read_lock_fast_updownhNtauh1hhjhhhNhNubj)}(hhh](j)}(hOstruct srcu_ctr __percpu * srcu_read_lock_fast_updown (struct srcu_struct *ssp)h]j)}(hMstruct srcu_ctr __percpu *srcu_read_lock_fast_updown(struct srcu_struct *ssp)h](j)}(hjAh]hstruct}(hjX5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT5hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMQubj2)}(h h]h }(hjf5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjT5hhhje5hMQubh)}(hhh]j)}(hsrcu_ctrh]hsrcu_ctr}(hjw5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt5ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjy5modnameN classnameNj] j` )}jc ]jf )}jY srcu_read_lock_fast_updownsbc.srcu_read_lock_fast_updownasbuh1hhjT5hhhje5hMQubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjT5hhhje5hMQubh__percpu}(hjT5hhhNhNubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjT5hhhje5hMQubj)}(hjh]h*}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT5hhhje5hMQubj{)}(hsrcu_read_lock_fast_updownh]j)}(hj5h]hsrcu_read_lock_fast_updown}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjT5hhhje5hMQubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj6modnameN classnameNj] j` )}jc ]j5c.srcu_read_lock_fast_updownasbuh1hhj5ubj2)}(h h]h }(hj 6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hjh]h*}(hj.6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hssph]hssp}(hj;6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5ubah}(h]h ]h"]h$]h&]jjuh1jhjT5hhhje5hMQubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjP5hhhje5hMQubah}(h]jK5ah ](jjeh"]h$]h&]jj)jhuh1jhje5hMQhjM5hhubj)}(hhh]h)}(h8register a new reader for an SRCU-fast-updown structure.h]h8register a new reader for an SRCU-fast-updown structure.}(hje6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMQhjb6hhubah}(h]h ]h"]h$]h&]uh1jhjM5hhhje5hMQubeh}(h]h ](jfunctioneh"]h$]h&]jjjj}6jj}6jjjuh1jhhhjhNhNubj)}(hX5**Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. **Description** Enter an SRCU read-side critical section, but for a light-weight smp_mb()-free reader. See srcu_read_lock() for more information. This function is compatible with srcu_down_read_fast(), but is not NMI-safe. For srcu_read_lock_fast_updown() to be used on an srcu_struct structure, that structure must have been defined using either DEFINE_SRCU_FAST_UPDOWN() or DEFINE_STATIC_SRCU_FAST_UPDOWN() on the one hand or initialized with init_srcu_struct_fast_updown() on the other. Such an srcu_struct structure cannot be passed to any non-fast-updown variant of srcu_read_{,un}lock() or srcu_{down,up}_read(). In kernels built with CONFIG_PROVE_RCU=y, __srcu_check_read_flavor() will complain bitterly if you ignore this * restriction. Grace-period auto-expediting is disabled for SRCU-fast-updown srcu_struct structures because SRCU-fast-updown expedited grace periods invoke synchronize_rcu_expedited(), IPIs and all. If you need expedited SRCU-fast-updown grace periods, use synchronize_srcu_expedited(). The srcu_read_lock_fast_updown() function can be invoked only from those contexts where RCU is watching, that is, from contexts where it would be legal to invoke rcu_read_lock(). Otherwise, lockdep will complain.h](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMUhj6ubj )}(hhh]j)}(hM``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj6h]hstruct srcu_struct *ssp}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMRhj6ubj2)}(hhh]h)}(h0srcu_struct in which to register the new reader.h]h0srcu_struct in which to register the new reader.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMRhj6ubah}(h]h ]h"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]uh1jhj6hMRhj6ubah}(h]h ]h"]h$]h&]uh1j hj6ubh)}(h**Description**h]j)}(hj6h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMThj6ubh)}(hEnter an SRCU read-side critical section, but for a light-weight smp_mb()-free reader. See srcu_read_lock() for more information. This function is compatible with srcu_down_read_fast(), but is not NMI-safe.h]hEnter an SRCU read-side critical section, but for a light-weight smp_mb()-free reader. See srcu_read_lock() for more information. This function is compatible with srcu_down_read_fast(), but is not NMI-safe.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMShj6ubh)}(hX For srcu_read_lock_fast_updown() to be used on an srcu_struct structure, that structure must have been defined using either DEFINE_SRCU_FAST_UPDOWN() or DEFINE_STATIC_SRCU_FAST_UPDOWN() on the one hand or initialized with init_srcu_struct_fast_updown() on the other. Such an srcu_struct structure cannot be passed to any non-fast-updown variant of srcu_read_{,un}lock() or srcu_{down,up}_read(). In kernels built with CONFIG_PROVE_RCU=y, __srcu_check_read_flavor() will complain bitterly if you ignore this * restriction.h]hX For srcu_read_lock_fast_updown() to be used on an srcu_struct structure, that structure must have been defined using either DEFINE_SRCU_FAST_UPDOWN() or DEFINE_STATIC_SRCU_FAST_UPDOWN() on the one hand or initialized with init_srcu_struct_fast_updown() on the other. Such an srcu_struct structure cannot be passed to any non-fast-updown variant of srcu_read_{,un}lock() or srcu_{down,up}_read(). In kernels built with CONFIG_PROVE_RCU=y, __srcu_check_read_flavor() will complain bitterly if you ignore this * restriction.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMXhj6ubh)}(hXGrace-period auto-expediting is disabled for SRCU-fast-updown srcu_struct structures because SRCU-fast-updown expedited grace periods invoke synchronize_rcu_expedited(), IPIs and all. If you need expedited SRCU-fast-updown grace periods, use synchronize_srcu_expedited().h]hXGrace-period auto-expediting is disabled for SRCU-fast-updown srcu_struct structures because SRCU-fast-updown expedited grace periods invoke synchronize_rcu_expedited(), IPIs and all. If you need expedited SRCU-fast-updown grace periods, use synchronize_srcu_expedited().}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMahj6ubh)}(hThe srcu_read_lock_fast_updown() function can be invoked only from those contexts where RCU is watching, that is, from contexts where it would be legal to invoke rcu_read_lock(). Otherwise, lockdep will complain.h]hThe srcu_read_lock_fast_updown() function can be invoked only from those contexts where RCU is watching, that is, from contexts where it would be legal to invoke rcu_read_lock(). Otherwise, lockdep will complain.}(hj$7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMfhj6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  srcu_down_read_fast (C function)c.srcu_down_read_fasthNtauh1hhjhhhNhNubj)}(hhh](j)}(hHstruct srcu_ctr __percpu * srcu_down_read_fast (struct srcu_struct *ssp)h]j)}(hFstruct srcu_ctr __percpu *srcu_down_read_fast(struct srcu_struct *ssp)h](j)}(hjAh]hstruct}(hjS7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjO7hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMubj2)}(h h]h }(hja7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjO7hhhj`7hMubh)}(hhh]j)}(hsrcu_ctrh]hsrcu_ctr}(hjr7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjo7ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjt7modnameN classnameNj] j` )}jc ]jf )}jY srcu_down_read_fastsbc.srcu_down_read_fastasbuh1hhjO7hhhj`7hMubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjO7hhhj`7hMubh__percpu}(hjO7hhhNhNubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjO7hhhj`7hMubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjO7hhhj`7hMubj{)}(hsrcu_down_read_fasth]j)}(hj7h]hsrcu_down_read_fast}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjO7hhhj`7hMubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj2)}(h h]h }(hj7hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj7modnameN classnameNj] j` )}jc ]j7c.srcu_down_read_fastasbuh1hhj7ubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7ubj)}(hjh]h*}(hj)8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(hssph]hssp}(hj68hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj7ubah}(h]h ]h"]h$]h&]jjuh1jhjO7hhhj`7hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjK7hhhj`7hMubah}(h]jF7ah ](jjeh"]h$]h&]jj)jhuh1jhj`7hMhjH7hhubj)}(hhh]h)}(h6register a new reader for an SRCU-protected structure.h]h6register a new reader for an SRCU-protected structure.}(hj`8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj]8hhubah}(h]h ]h"]h$]h&]uh1jhjH7hhhj`7hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjx8jjx8jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. **Description** Enter a semaphore-like SRCU read-side critical section, but for a light-weight smp_mb()-free reader. See srcu_read_lock_fast() and srcu_down_read() for more information. The same srcu_struct may be used concurrently by srcu_down_read_fast() and srcu_read_lock_fast(). However, the same definition/initialization requirements called out for srcu_read_lock_fast_updown() apply.h](h)}(h**Parameters**h]j)}(hj8h]h Parameters}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj|8ubj )}(hhh]j)}(hM``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj8h]hstruct srcu_struct *ssp}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj8ubj2)}(hhh]h)}(h0srcu_struct in which to register the new reader.h]h0srcu_struct in which to register the new reader.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1j1hj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1j hj|8ubh)}(h**Description**h]j)}(hj8h]h Description}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj|8ubh)}(hEnter a semaphore-like SRCU read-side critical section, but for a light-weight smp_mb()-free reader. See srcu_read_lock_fast() and srcu_down_read() for more information.h]hEnter a semaphore-like SRCU read-side critical section, but for a light-weight smp_mb()-free reader. See srcu_read_lock_fast() and srcu_down_read() for more information.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj|8ubh)}(hThe same srcu_struct may be used concurrently by srcu_down_read_fast() and srcu_read_lock_fast(). However, the same definition/initialization requirements called out for srcu_read_lock_fast_updown() apply.h]hThe same srcu_struct may be used concurrently by srcu_down_read_fast() and srcu_read_lock_fast(). However, the same definition/initialization requirements called out for srcu_read_lock_fast_updown() apply.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj|8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #srcu_read_lock_nmisafe (C function)c.srcu_read_lock_nmisafehNtauh1hhjhhhNhNubj)}(hhh](j)}(h4int srcu_read_lock_nmisafe (struct srcu_struct *ssp)h]j)}(h3int srcu_read_lock_nmisafe(struct srcu_struct *ssp)h](j )}(hinth]hint}(hj09hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj,9hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMubj2)}(h h]h }(hj?9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj,9hhhj>9hMubj{)}(hsrcu_read_lock_nmisafeh]j)}(hsrcu_read_lock_nmisafeh]hsrcu_read_lock_nmisafe}(hjQ9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM9ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj,9hhhj>9hMubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hjm9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji9ubj2)}(h h]h }(hjz9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hji9ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj9modnameN classnameNj] j` )}jc ]jf )}jY jS9sbc.srcu_read_lock_nmisafeasbuh1hhji9ubj2)}(h h]h }(hj9hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hji9ubj)}(hjh]h*}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji9ubj)}(hssph]hssp}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji9ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhje9ubah}(h]h ]h"]h$]h&]jjuh1jhj,9hhhj>9hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj(9hhhj>9hMubah}(h]j#9ah ](jjeh"]h$]h&]jj)jhuh1jhj>9hMhj%9hhubj)}(hhh]h)}(h6register a new reader for an SRCU-protected structure.h]h6register a new reader for an SRCU-protected structure.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj9hhubah}(h]h ]h"]h$]h&]uh1jhj%9hhhj>9hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj:jj:jjjuh1jhhhjhNhNubj)}(hXu**Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. **Description** Enter an SRCU read-side critical section, but in an NMI-safe manner. See srcu_read_lock() for more information. If srcu_read_lock_nmisafe() is ever used on an srcu_struct structure, then none of the other flavors may be used, whether before, during, or after.h](h)}(h**Parameters**h]j)}(hj:h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj :ubj )}(hhh]j)}(hM``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj1:h]hstruct srcu_struct *ssp}(hj3:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/:ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj+:ubj2)}(hhh]h)}(h0srcu_struct in which to register the new reader.h]h0srcu_struct in which to register the new reader.}(hjJ:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjF:hMhjG:ubah}(h]h ]h"]h$]h&]uh1j1hj+:ubeh}(h]h ]h"]h$]h&]uh1jhjF:hMhj(:ubah}(h]h ]h"]h$]h&]uh1j hj :ubh)}(h**Description**h]j)}(hjl:h]h Description}(hjn:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj:ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj :ubh)}(hoEnter an SRCU read-side critical section, but in an NMI-safe manner. See srcu_read_lock() for more information.h]hoEnter an SRCU read-side critical section, but in an NMI-safe manner. See srcu_read_lock() for more information.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj :ubh)}(hIf srcu_read_lock_nmisafe() is ever used on an srcu_struct structure, then none of the other flavors may be used, whether before, during, or after.h]hIf srcu_read_lock_nmisafe() is ever used on an srcu_struct structure, then none of the other flavors may be used, whether before, during, or after.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj :ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j srcu_down_read (C function)c.srcu_down_readhNtauh1hhjhhhNhNubj)}(hhh](j)}(h,int srcu_down_read (struct srcu_struct *ssp)h]j)}(h+int srcu_down_read(struct srcu_struct *ssp)h](j )}(hinth]hint}(hj:hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj:hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:hhhj:hMubj{)}(hsrcu_down_readh]j)}(hsrcu_down_readh]hsrcu_down_read}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj:hhhj:hMubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj2)}(h h]h }(hj ;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj;modnameN classnameNj] j` )}jc ]jf )}jY j:sbc.srcu_down_readasbuh1hhj:ubj2)}(h h]h }(hj;;hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(hjh]h*}(hjI;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hssph]hssp}(hjV;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubah}(h]h ]h"]h$]h&]jjuh1jhj:hhhj:hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj:hhhj:hMubah}(h]j:ah ](jjeh"]h$]h&]jj)jhuh1jhj:hMhj:hhubj)}(hhh]h)}(h6register a new reader for an SRCU-protected structure.h]h6register a new reader for an SRCU-protected structure.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj};hhubah}(h]h ]h"]h$]h&]uh1jhj:hhhj:hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj;jj;jjjuh1jhhhjhNhNubj)}(hX]**Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. **Description** Enter a semaphore-like SRCU read-side critical section. Note that SRCU read-side critical sections may be nested. However, it is illegal to call anything that waits on an SRCU grace period for the same srcu_struct, whether directly or indirectly. Please note that one way to indirectly wait on an SRCU grace period is to acquire a mutex that is held elsewhere while calling synchronize_srcu() or synchronize_srcu_expedited(). But if you want lockdep to help you keep this stuff straight, you should instead use srcu_read_lock(). The semaphore-like nature of srcu_down_read() means that the matching srcu_up_read() can be invoked from some other context, for example, from some other task or from an irq handler. However, neither srcu_down_read() nor srcu_up_read() may be invoked from an NMI handler. Calls to srcu_down_read() may be nested, similar to the manner in which calls to down_read() may be nested. The same srcu_struct may be used concurrently by srcu_down_read() and srcu_read_lock().h](h)}(h**Parameters**h]j)}(hj;h]h Parameters}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj;ubj )}(hhh]j)}(hM``struct srcu_struct *ssp`` srcu_struct in which to register the new reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj;h]hstruct srcu_struct *ssp}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj;ubj2)}(hhh]h)}(h0srcu_struct in which to register the new reader.h]h0srcu_struct in which to register the new reader.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj;ubah}(h]h ]h"]h$]h&]uh1j1hj;ubeh}(h]h ]h"]h$]h&]uh1jhj;hMhj;ubah}(h]h ]h"]h$]h&]uh1j hj;ubh)}(h**Description**h]j)}(hj;h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj;ubh)}(hXEnter a semaphore-like SRCU read-side critical section. Note that SRCU read-side critical sections may be nested. However, it is illegal to call anything that waits on an SRCU grace period for the same srcu_struct, whether directly or indirectly. Please note that one way to indirectly wait on an SRCU grace period is to acquire a mutex that is held elsewhere while calling synchronize_srcu() or synchronize_srcu_expedited(). But if you want lockdep to help you keep this stuff straight, you should instead use srcu_read_lock().h]hXEnter a semaphore-like SRCU read-side critical section. Note that SRCU read-side critical sections may be nested. However, it is illegal to call anything that waits on an SRCU grace period for the same srcu_struct, whether directly or indirectly. Please note that one way to indirectly wait on an SRCU grace period is to acquire a mutex that is held elsewhere while calling synchronize_srcu() or synchronize_srcu_expedited(). But if you want lockdep to help you keep this stuff straight, you should instead use srcu_read_lock().}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj;ubh)}(hXThe semaphore-like nature of srcu_down_read() means that the matching srcu_up_read() can be invoked from some other context, for example, from some other task or from an irq handler. However, neither srcu_down_read() nor srcu_up_read() may be invoked from an NMI handler.h]hXThe semaphore-like nature of srcu_down_read() means that the matching srcu_up_read() can be invoked from some other context, for example, from some other task or from an irq handler. However, neither srcu_down_read() nor srcu_up_read() may be invoked from an NMI handler.}(hj!<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj;ubh)}(hCalls to srcu_down_read() may be nested, similar to the manner in which calls to down_read() may be nested. The same srcu_struct may be used concurrently by srcu_down_read() and srcu_read_lock().h]hCalls to srcu_down_read() may be nested, similar to the manner in which calls to down_read() may be nested. The same srcu_struct may be used concurrently by srcu_down_read() and srcu_read_lock().}(hj0<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j srcu_read_unlock (C function)c.srcu_read_unlockhNtauh1hhjhhhNhNubj)}(hhh](j)}(h8void srcu_read_unlock (struct srcu_struct *ssp, int idx)h]j)}(h7void srcu_read_unlock(struct srcu_struct *ssp, int idx)h](j )}(hvoidh]hvoid}(hj_<hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj[<hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMubj2)}(h h]h }(hjn<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj[<hhhjm<hMubj{)}(hsrcu_read_unlockh]j)}(hsrcu_read_unlockh]hsrcu_read_unlock}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|<ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj[<hhhjm<hMubj)}(h"(struct srcu_struct *ssp, int idx)h](j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj<modnameN classnameNj] j` )}jc ]jf )}jY j<sbc.srcu_read_unlockasbuh1hhj<ubj2)}(h h]h }(hj<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj<ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hssph]hssp}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<ubj)}(hint idxh](j )}(hinth]hint}(hj=hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj =ubj2)}(h h]h }(hj=hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj =ubj)}(hidxh]hidx}(hj*=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj =ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<ubeh}(h]h ]h"]h$]h&]jjuh1jhj[<hhhjm<hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjW<hhhjm<hMubah}(h]jR<ah ](jjeh"]h$]h&]jj)jhuh1jhjm<hMhjT<hhubj)}(hhh]h)}(h9unregister a old reader from an SRCU-protected structure.h]h9unregister a old reader from an SRCU-protected structure.}(hjT=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjQ=hhubah}(h]h ]h"]h$]h&]uh1jhjT<hhhjm<hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjl=jjl=jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. ``int idx`` return value from corresponding srcu_read_lock(). **Description** Exit an SRCU read-side critical section.h](h)}(h**Parameters**h]j)}(hjv=h]h Parameters}(hjx=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjt=ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjp=ubj )}(hhh](j)}(hO``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj=h]hstruct srcu_struct *ssp}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj=ubj2)}(hhh]h)}(h2srcu_struct in which to unregister the old reader.h]h2srcu_struct in which to unregister the old reader.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj=ubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hMhj=ubj)}(h>``int idx`` return value from corresponding srcu_read_lock(). h](j)}(h ``int idx``h]j)}(hj=h]hint idx}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj=ubj2)}(hhh]h)}(h1return value from corresponding srcu_read_lock().h]h1return value from corresponding srcu_read_lock().}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj=ubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hMhj=ubeh}(h]h ]h"]h$]h&]uh1j hjp=ubh)}(h**Description**h]j)}(hj >h]h Description}(hj >hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjp=ubh)}(h(Exit an SRCU read-side critical section.h]h(Exit an SRCU read-side critical section.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjp=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "srcu_read_unlock_fast (C function)c.srcu_read_unlock_fasthNtauh1hhjhhhNhNubj)}(hhh](j)}(hSvoid srcu_read_unlock_fast (struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)h]j)}(hRvoid srcu_read_unlock_fast(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)h](j )}(hvoidh]hvoid}(hjN>hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJ>hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMubj2)}(h h]h }(hj]>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJ>hhhj\>hMubj{)}(hsrcu_read_unlock_fasth]j)}(hsrcu_read_unlock_fasth]hsrcu_read_unlock_fast}(hjo>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk>ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjJ>hhhj\>hMubj)}(h8(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)h](j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj>modnameN classnameNj] j` )}jc ]jf )}jY jq>sbc.srcu_read_unlock_fastasbuh1hhj>ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hssph]hssp}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj>ubj)}(hstruct srcu_ctr __percpu *scph](j)}(hjAh]hstruct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj2)}(h h]h }(hj ?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubh)}(hhh]j)}(hsrcu_ctrh]hsrcu_ctr}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj?modnameN classnameNj] j` )}jc ]j>c.srcu_read_unlock_fastasbuh1hhj>ubj2)}(h h]h }(hj9?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubh__percpu}(hj>hhhNhNubj2)}(h h]h }(hjK?hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(hjh]h*}(hjY?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hscph]hscp}(hjf?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj>ubeh}(h]h ]h"]h$]h&]jjuh1jhjJ>hhhj\>hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjF>hhhj\>hMubah}(h]jA>ah ](jjeh"]h$]h&]jj)jhuh1jhj\>hMhjC>hhubj)}(hhh]h)}(h9unregister a old reader from an SRCU-protected structure.h]h9unregister a old reader from an SRCU-protected structure.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj?hhubah}(h]h ]h"]h$]h&]uh1jhjC>hhhj\>hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj?jj?jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. ``struct srcu_ctr __percpu *scp`` return value from corresponding srcu_read_lock_fast(). **Description** Exit a light-weight SRCU read-side critical section.h](h)}(h**Parameters**h]j)}(hj?h]h Parameters}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj?ubj )}(hhh](j)}(hO``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj?h]hstruct srcu_struct *ssp}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj?ubj2)}(hhh]h)}(h2srcu_struct in which to unregister the old reader.h]h2srcu_struct in which to unregister the old reader.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMhj?ubah}(h]h ]h"]h$]h&]uh1j1hj?ubeh}(h]h ]h"]h$]h&]uh1jhj?hMhj?ubj)}(hY``struct srcu_ctr __percpu *scp`` return value from corresponding srcu_read_lock_fast(). h](j)}(h!``struct srcu_ctr __percpu *scp``h]j)}(hj @h]hstruct srcu_ctr __percpu *scp}(hj @hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj@ubj2)}(hhh]h)}(h6return value from corresponding srcu_read_lock_fast().h]h6return value from corresponding srcu_read_lock_fast().}(hj#@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhj @ubah}(h]h ]h"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhj?ubeh}(h]h ]h"]h$]h&]uh1j hj?ubh)}(h**Description**h]j)}(hjE@h]h Description}(hjG@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC@ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj?ubh)}(h4Exit a light-weight SRCU read-side critical section.h]h4Exit a light-weight SRCU read-side critical section.}(hj[@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )srcu_read_unlock_fast_updown (C function)c.srcu_read_unlock_fast_updownhNtauh1hhjhhhNhNubj)}(hhh](j)}(hZvoid srcu_read_unlock_fast_updown (struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)h]j)}(hYvoid srcu_read_unlock_fast_updown(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)h](j )}(hvoidh]hvoid}(hj@hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj@hhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@hhhj@hMubj{)}(hsrcu_read_unlock_fast_updownh]j)}(hsrcu_read_unlock_fast_updownh]hsrcu_read_unlock_fast_updown}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj@hhhj@hMubj)}(h8(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)h](j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj@modnameN classnameNj] j` )}jc ]jf )}jY j@sbc.srcu_read_unlock_fast_updownasbuh1hhj@ubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@ubj)}(hjh]h*}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hssph]hssp}(hj AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@ubj)}(hstruct srcu_ctr __percpu *scph](j)}(hjAh]hstruct}(hj9AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5Aubj2)}(h h]h }(hjFAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5Aubh)}(hhh]j)}(hsrcu_ctrh]hsrcu_ctr}(hjWAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTAubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjYAmodnameN classnameNj] j` )}jc ]jAc.srcu_read_unlock_fast_updownasbuh1hhj5Aubj2)}(h h]h }(hjuAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5Aubh__percpu}(hj5AhhhNhNubj2)}(h h]h }(hjAhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5Aubj)}(hjh]h*}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5Aubj)}(hscph]hscp}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5Aubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@ubeh}(h]h ]h"]h$]h&]jjuh1jhj@hhhj@hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj@hhhj@hMubah}(h]j}@ah ](jjeh"]h$]h&]jj)jhuh1jhj@hMhj@hhubj)}(hhh]h)}(h;unregister a old reader from an SRCU-fast-updown structure.h]h;unregister a old reader from an SRCU-fast-updown structure.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjAhhubah}(h]h ]h"]h$]h&]uh1jhj@hhhj@hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjAjjAjjjuh1jhhhjhNhNubj)}(hX **Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. ``struct srcu_ctr __percpu *scp`` return value from corresponding srcu_read_lock_fast_updown(). **Description** Exit an SRCU-fast-updown read-side critical section.h](h)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjAubj )}(hhh](j)}(hO``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj Bh]hstruct srcu_struct *ssp}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Bubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjBubj2)}(hhh]h)}(h2srcu_struct in which to unregister the old reader.h]h2srcu_struct in which to unregister the old reader.}(hj&BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"BhMhj#Bubah}(h]h ]h"]h$]h&]uh1j1hjBubeh}(h]h ]h"]h$]h&]uh1jhj"BhMhjBubj)}(h```struct srcu_ctr __percpu *scp`` return value from corresponding srcu_read_lock_fast_updown(). h](j)}(h!``struct srcu_ctr __percpu *scp``h]j)}(hjFBh]hstruct srcu_ctr __percpu *scp}(hjHBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDBubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj@Bubj2)}(hhh]h)}(h=return value from corresponding srcu_read_lock_fast_updown().h]h=return value from corresponding srcu_read_lock_fast_updown().}(hj_BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[BhMhj\Bubah}(h]h ]h"]h$]h&]uh1j1hj@Bubeh}(h]h ]h"]h$]h&]uh1jhj[BhMhjBubeh}(h]h ]h"]h$]h&]uh1j hjAubh)}(h**Description**h]j)}(hjBh]h Description}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjAubh)}(h4Exit an SRCU-fast-updown read-side critical section.h]h4Exit an SRCU-fast-updown read-side critical section.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j srcu_up_read_fast (C function)c.srcu_up_read_fasthNtauh1hhjhhhNhNubj)}(hhh](j)}(hOvoid srcu_up_read_fast (struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)h]j)}(hNvoid srcu_up_read_fast(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)h](j )}(hvoidh]hvoid}(hjBhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjBhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBhhhjBhMubj{)}(hsrcu_up_read_fasth]j)}(hsrcu_up_read_fasth]hsrcu_up_read_fast}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjBhhhjBhMubj)}(h8(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)h](j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj!ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainjreftypejY K reftargetj#CmodnameN classnameNj] j` )}jc ]jf )}jY jBsbc.srcu_up_read_fastasbuh1hhjBubj2)}(h h]h }(hjAChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjBubj)}(hjh]h*}(hjOChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(hssph]hssp}(hj\ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubj)}(hstruct srcu_ctr __percpu *scph](j)}(hjAh]hstruct}(hjuChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqCubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqCubh)}(hhh]j)}(hsrcu_ctrh]hsrcu_ctr}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjCmodnameN classnameNj] j` )}jc ]j=Cc.srcu_up_read_fastasbuh1hhjqCubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqCubh__percpu}(hjqChhhNhNubj2)}(h h]h }(hjChhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqCubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqCubj)}(hscph]hscp}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqCubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjBubeh}(h]h ]h"]h$]h&]jjuh1jhjBhhhjBhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjBhhhjBhMubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jhjBhMhjBhhubj)}(hhh]h)}(h9unregister a old reader from an SRCU-protected structure.h]h9unregister a old reader from an SRCU-protected structure.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjDhhubah}(h]h ]h"]h$]h&]uh1jhjBhhhjBhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj Djj Djjjuh1jhhhjhNhNubj)}(hXG**Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. ``struct srcu_ctr __percpu *scp`` return value from corresponding srcu_read_lock_fast(). **Description** Exit an SRCU read-side critical section, but not necessarily from the same context as the maching srcu_down_read_fast().h](h)}(h**Parameters**h]j)}(hj*Dh]h Parameters}(hj,DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(Dubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj$Dubj )}(hhh](j)}(hO``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hjIDh]hstruct srcu_struct *ssp}(hjKDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGDubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhjCDubj2)}(hhh]h)}(h2srcu_struct in which to unregister the old reader.h]h2srcu_struct in which to unregister the old reader.}(hjbDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^DhMhj_Dubah}(h]h ]h"]h$]h&]uh1j1hjCDubeh}(h]h ]h"]h$]h&]uh1jhj^DhMhj@Dubj)}(hY``struct srcu_ctr __percpu *scp`` return value from corresponding srcu_read_lock_fast(). h](j)}(h!``struct srcu_ctr __percpu *scp``h]j)}(hjDh]hstruct srcu_ctr __percpu *scp}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj|Dubj2)}(hhh]h)}(h6return value from corresponding srcu_read_lock_fast().h]h6return value from corresponding srcu_read_lock_fast().}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMhjDubah}(h]h ]h"]h$]h&]uh1j1hj|Dubeh}(h]h ]h"]h$]h&]uh1jhjDhMhj@Dubeh}(h]h ]h"]h$]h&]uh1j hj$Dubh)}(h**Description**h]j)}(hjDh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj$Dubh)}(hxExit an SRCU read-side critical section, but not necessarily from the same context as the maching srcu_down_read_fast().h]hxExit an SRCU read-side critical section, but not necessarily from the same context as the maching srcu_down_read_fast().}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMhj$Dubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %srcu_read_unlock_nmisafe (C function)c.srcu_read_unlock_nmisafehNtauh1hhjhhhNhNubj)}(hhh](j)}(h@void srcu_read_unlock_nmisafe (struct srcu_struct *ssp, int idx)h]j)}(h?void srcu_read_unlock_nmisafe(struct srcu_struct *ssp, int idx)h](j )}(hvoidh]hvoid}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjDhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM(ubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDhhhjEhM(ubj{)}(hsrcu_read_unlock_nmisafeh]j)}(hsrcu_read_unlock_nmisafeh]hsrcu_read_unlock_nmisafe}(hj#EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjDhhhjEhM(ubj)}(h"(struct srcu_struct *ssp, int idx)h](j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj?EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;Eubj2)}(h h]h }(hjLEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;Eubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj]EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZEubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj_EmodnameN classnameNj] j` )}jc ]jf )}jY j%Esbc.srcu_read_unlock_nmisafeasbuh1hhj;Eubj2)}(h h]h }(hj}EhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj;Eubj)}(hjh]h*}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;Eubj)}(hssph]hssp}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;Eubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj7Eubj)}(hint idxh](j )}(hinth]hint}(hjEhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjEubj2)}(h h]h }(hjEhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjEubj)}(hidxh]hidx}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj7Eubeh}(h]h ]h"]h$]h&]jjuh1jhjDhhhjEhM(ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjDhhhjEhM(ubah}(h]jDah ](jjeh"]h$]h&]jj)jhuh1jhjEhM(hjDhhubj)}(hhh]h)}(h9unregister a old reader from an SRCU-protected structure.h]h9unregister a old reader from an SRCU-protected structure.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM(hjEhhubah}(h]h ]h"]h$]h&]uh1jhjDhhhjEhM(ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjFjjFjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. ``int idx`` return value from corresponding srcu_read_lock_nmisafe(). **Description** Exit an SRCU read-side critical section, but in an NMI-safe manner.h](h)}(h**Parameters**h]j)}(hjFh]h Parameters}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM,hjFubj )}(hhh](j)}(hO``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj8Fh]hstruct srcu_struct *ssp}(hj:FhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6Fubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM)hj2Fubj2)}(hhh]h)}(h2srcu_struct in which to unregister the old reader.h]h2srcu_struct in which to unregister the old reader.}(hjQFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMFhM)hjNFubah}(h]h ]h"]h$]h&]uh1j1hj2Fubeh}(h]h ]h"]h$]h&]uh1jhjMFhM)hj/Fubj)}(hF``int idx`` return value from corresponding srcu_read_lock_nmisafe(). h](j)}(h ``int idx``h]j)}(hjqFh]hint idx}(hjsFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoFubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM*hjkFubj2)}(hhh]h)}(h9return value from corresponding srcu_read_lock_nmisafe().h]h9return value from corresponding srcu_read_lock_nmisafe().}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhM*hjFubah}(h]h ]h"]h$]h&]uh1j1hjkFubeh}(h]h ]h"]h$]h&]uh1jhjFhM*hj/Fubeh}(h]h ]h"]h$]h&]uh1j hjFubh)}(h**Description**h]j)}(hjFh]h Description}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM,hjFubh)}(hCExit an SRCU read-side critical section, but in an NMI-safe manner.h]hCExit an SRCU read-side critical section, but in an NMI-safe manner.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM+hjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j srcu_up_read (C function)c.srcu_up_readhNtauh1hhjhhhNhNubj)}(hhh](j)}(h4void srcu_up_read (struct srcu_struct *ssp, int idx)h]j)}(h3void srcu_up_read(struct srcu_struct *ssp, int idx)h](j )}(hvoidh]hvoid}(hjFhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjFhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM@ubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjFhhhjFhM@ubj{)}(h srcu_up_readh]j)}(h srcu_up_readh]h srcu_up_read}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjFhhhjFhM@ubj)}(h"(struct srcu_struct *ssp, int idx)h](j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj.GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*Gubj2)}(h h]h }(hj;GhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*Gubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hjLGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIGubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjNGmodnameN classnameNj] j` )}jc ]jf )}jY jGsbc.srcu_up_readasbuh1hhj*Gubj2)}(h h]h }(hjlGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*Gubj)}(hjh]h*}(hjzGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*Gubj)}(hssph]hssp}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*Gubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj&Gubj)}(hint idxh](j )}(hinth]hint}(hjGhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjGubj2)}(h h]h }(hjGhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGubj)}(hidxh]hidx}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj&Gubeh}(h]h ]h"]h$]h&]jjuh1jhjFhhhjFhM@ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjFhhhjFhM@ubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhjFhM@hjFhhubj)}(hhh]h)}(h9unregister a old reader from an SRCU-protected structure.h]h9unregister a old reader from an SRCU-protected structure.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM@hjGhhubah}(h]h ]h"]h$]h&]uh1jhjFhhhjFhM@ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjGjjGjjjuh1jhhhjhNhNubj)}(hX'**Parameters** ``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. ``int idx`` return value from corresponding srcu_read_lock(). **Description** Exit an SRCU read-side critical section, but not necessarily from the same context as the maching srcu_down_read().h](h)}(h**Parameters**h]j)}(hjHh]h Parameters}(hj HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMDhjHubj )}(hhh](j)}(hO``struct srcu_struct *ssp`` srcu_struct in which to unregister the old reader. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj'Hh]hstruct srcu_struct *ssp}(hj)HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%Hubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMAhj!Hubj2)}(hhh]h)}(h2srcu_struct in which to unregister the old reader.h]h2srcu_struct in which to unregister the old reader.}(hj@HhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj``int idx`` return value from corresponding srcu_read_lock(). h](j)}(h ``int idx``h]j)}(hj`Hh]hint idx}(hjbHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^Hubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMBhjZHubj2)}(hhh]h)}(h1return value from corresponding srcu_read_lock().h]h1return value from corresponding srcu_read_lock().}(hjyHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuHhMBhjvHubah}(h]h ]h"]h$]h&]uh1j1hjZHubeh}(h]h ]h"]h$]h&]uh1jhjuHhMBhjHubeh}(h]h ]h"]h$]h&]uh1j hjHubh)}(h**Description**h]j)}(hjHh]h Description}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMDhjHubh)}(hsExit an SRCU read-side critical section, but not necessarily from the same context as the maching srcu_down_read().h]hsExit an SRCU read-side critical section, but not necessarily from the same context as the maching srcu_down_read().}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMChjHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j +smp_mb__after_srcu_read_unlock (C function) c.smp_mb__after_srcu_read_unlockhNtauh1hhjhhhNhNubj)}(hhh](j)}(h*void smp_mb__after_srcu_read_unlock (void)h]j)}(h)void smp_mb__after_srcu_read_unlock(void)h](j )}(hvoidh]hvoid}(hjHhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMQubj2)}(h h]h }(hjHhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjHhhhjHhMQubj{)}(hsmp_mb__after_srcu_read_unlockh]j)}(hsmp_mb__after_srcu_read_unlockh]hsmp_mb__after_srcu_read_unlock}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjHhhhjHhMQubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjIhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]noemphjjuh1jhjIubah}(h]h ]h"]h$]h&]jjuh1jhjHhhhjHhMQubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjHhhhjHhMQubah}(h]jHah ](jjeh"]h$]h&]jj)jhuh1jhjHhMQhjHhhubj)}(hhh]h)}(h+ensure full ordering after srcu_read_unlockh]h+ensure full ordering after srcu_read_unlock}(hjGIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMQhjDIhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjHhMQubeh}(h]h ](jfunctioneh"]h$]h&]jjjj_Ijj_Ijjjuh1jhhhjhNhNubj)}(hX7**Parameters** ``void`` no arguments **Description** Converts the preceding srcu_read_unlock into a two-way memory barrier. Call this after srcu_read_unlock, to guarantee that all memory operations that occur after smp_mb__after_srcu_read_unlock will appear to happen after the preceding srcu_read_unlock.h](h)}(h**Parameters**h]j)}(hjiIh]h Parameters}(hjkIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgIubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMUhjcIubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjIh]hvoid}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhjIubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhKhjIubah}(h]h ]h"]h$]h&]uh1j1hjIubeh}(h]h ]h"]h$]h&]uh1jhjIhKhjIubah}(h]h ]h"]h$]h&]uh1j hjcIubh)}(h**Description**h]j)}(hjIh]h Description}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhjcIubh)}(hFConverts the preceding srcu_read_unlock into a two-way memory barrier.h]hFConverts the preceding srcu_read_unlock into a two-way memory barrier.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMRhjcIubh)}(hCall this after srcu_read_unlock, to guarantee that all memory operations that occur after smp_mb__after_srcu_read_unlock will appear to happen after the preceding srcu_read_unlock.h]hCall this after srcu_read_unlock, to guarantee that all memory operations that occur after smp_mb__after_srcu_read_unlock will appear to happen after the preceding srcu_read_unlock.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMThjcIubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )smp_mb__after_srcu_read_lock (C function)c.smp_mb__after_srcu_read_lockhNtauh1hhjhhhNhNubj)}(hhh](j)}(h(void smp_mb__after_srcu_read_lock (void)h]j)}(h'void smp_mb__after_srcu_read_lock(void)h](j )}(hvoidh]hvoid}(hjJhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJhhhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM_ubj2)}(h h]h }(hj&JhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJhhhj%JhM_ubj{)}(hsmp_mb__after_srcu_read_lockh]j)}(hsmp_mb__after_srcu_read_lockh]hsmp_mb__after_srcu_read_lock}(hj8JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4Jubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjJhhhj%JhM_ubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjTJhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjPJubah}(h]h ]h"]h$]h&]noemphjjuh1jhjLJubah}(h]h ]h"]h$]h&]jjuh1jhjJhhhj%JhM_ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjJhhhj%JhM_ubah}(h]j Jah ](jjeh"]h$]h&]jj)jhuh1jhj%JhM_hj Jhhubj)}(hhh]h)}(h)ensure full ordering after srcu_read_lockh]h)ensure full ordering after srcu_read_lock}(hj~JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM_hj{Jhhubah}(h]h ]h"]h$]h&]uh1jhj Jhhhj%JhM_ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjJjjJjjjuh1jhhhjhNhNubj)}(hX/**Parameters** ``void`` no arguments **Description** Converts the preceding srcu_read_lock into a two-way memory barrier. Call this after srcu_read_lock, to guarantee that all memory operations that occur after smp_mb__after_srcu_read_lock will appear to happen after the preceding srcu_read_lock.h](h)}(h**Parameters**h]j)}(hjJh]h Parameters}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMchjJubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjJh]hvoid}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhjJubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhKhjJubah}(h]h ]h"]h$]h&]uh1j1hjJubeh}(h]h ]h"]h$]h&]uh1jhjJhKhjJubah}(h]h ]h"]h$]h&]uh1j hjJubh)}(h**Description**h]j)}(hjJh]h Description}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhKhjJubh)}(hDConverts the preceding srcu_read_lock into a two-way memory barrier.h]hDConverts the preceding srcu_read_lock into a two-way memory barrier.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhM`hjJubh)}(hCall this after srcu_read_lock, to guarantee that all memory operations that occur after smp_mb__after_srcu_read_lock will appear to happen after the preceding srcu_read_lock.h]hCall this after srcu_read_lock, to guarantee that all memory operations that occur after smp_mb__after_srcu_read_lock will appear to happen after the preceding srcu_read_lock.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:407: ./include/linux/srcu.hhMbhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j init_srcu_struct (C function)c.init_srcu_structhNtauh1hhjhhhNhNubj)}(hhh](j)}(h.int init_srcu_struct (struct srcu_struct *ssp)h]j)}(h-int init_srcu_struct(struct srcu_struct *ssp)h](j )}(hinth]hint}(hjNKhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjJKhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM&ubj2)}(h h]h }(hj]KhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjJKhhhj\KhM&ubj{)}(hinit_srcu_structh]j)}(hinit_srcu_structh]hinit_srcu_struct}(hjoKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkKubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjJKhhhj\KhM&ubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjKmodnameN classnameNj] j` )}jc ]jf )}jY jqKsbc.init_srcu_structasbuh1hhjKubj2)}(h h]h }(hjKhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjKubj)}(hjh]h*}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hssph]hssp}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjKubah}(h]h ]h"]h$]h&]jjuh1jhjJKhhhj\KhM&ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjFKhhhj\KhM&ubah}(h]jAKah ](jjeh"]h$]h&]jj)jhuh1jhj\KhM&hjCKhhubj)}(hhh]h)}(h initialize a sleep-RCU structureh]h initialize a sleep-RCU structure}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM&hj Lhhubah}(h]h ]h"]h$]h&]uh1jhjCKhhhj\KhM&ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj&Ljj&Ljjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` structure to initialize. **Description** Use this in place of DEFINE_SRCU() and DEFINE_STATIC_SRCU() for non-static srcu_struct structures that are to be passed to srcu_read_lock(), srcu_read_lock_nmisafe(), and friends. It is necessary to invoke this on a given srcu_struct before passing that srcu_struct to any other function. Each srcu_struct represents a separate domain of SRCU protection.h](h)}(h**Parameters**h]j)}(hj0Lh]h Parameters}(hj2LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.Lubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM*hj*Lubj )}(hhh]j)}(h5``struct srcu_struct *ssp`` structure to initialize. h](j)}(h``struct srcu_struct *ssp``h]j)}(hjOLh]hstruct srcu_struct *ssp}(hjQLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMLubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM'hjILubj2)}(hhh]h)}(hstructure to initialize.h]hstructure to initialize.}(hjhLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdLhM'hjeLubah}(h]h ]h"]h$]h&]uh1j1hjILubeh}(h]h ]h"]h$]h&]uh1jhjdLhM'hjFLubah}(h]h ]h"]h$]h&]uh1j hj*Lubh)}(h**Description**h]j)}(hjLh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM)hj*Lubh)}(hXdUse this in place of DEFINE_SRCU() and DEFINE_STATIC_SRCU() for non-static srcu_struct structures that are to be passed to srcu_read_lock(), srcu_read_lock_nmisafe(), and friends. It is necessary to invoke this on a given srcu_struct before passing that srcu_struct to any other function. Each srcu_struct represents a separate domain of SRCU protection.h]hXdUse this in place of DEFINE_SRCU() and DEFINE_STATIC_SRCU() for non-static srcu_struct structures that are to be passed to srcu_read_lock(), srcu_read_lock_nmisafe(), and friends. It is necessary to invoke this on a given srcu_struct before passing that srcu_struct to any other function. Each srcu_struct represents a separate domain of SRCU protection.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM(hj*Lubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "init_srcu_struct_fast (C function)c.init_srcu_struct_fasthNtauh1hhjhhhNhNubj)}(hhh](j)}(h3int init_srcu_struct_fast (struct srcu_struct *ssp)h]j)}(h2int init_srcu_struct_fast(struct srcu_struct *ssp)h](j )}(hinth]hint}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM8ubj2)}(h h]h }(hjLhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLhhhjLhM8ubj{)}(hinit_srcu_struct_fasth]j)}(hinit_srcu_struct_fasth]hinit_srcu_struct_fast}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjLhhhjLhM8ubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj2)}(h h]h }(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj*MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Mubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj,MmodnameN classnameNj] j` )}jc ]jf )}jY jLsbc.init_srcu_struct_fastasbuh1hhjMubj2)}(h h]h }(hjJMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMubj)}(hjh]h*}(hjXMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(hssph]hssp}(hjeMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubah}(h]h ]h"]h$]h&]jjuh1jhjLhhhjLhM8ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjLhhhjLhM8ubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1jhjLhM8hjLhhubj)}(hhh]h)}(h,initialize a fast-reader sleep-RCU structureh]h,initialize a fast-reader sleep-RCU structure}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM8hjMhhubah}(h]h ]h"]h$]h&]uh1jhjLhhhjLhM8ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjMjjMjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` structure to initialize. **Description** Use this in place of DEFINE_SRCU_FAST() and DEFINE_STATIC_SRCU_FAST() for non-static srcu_struct structures that are to be passed to srcu_read_lock_fast() and friends. It is necessary to invoke this on a given srcu_struct before passing that srcu_struct to any other function. Each srcu_struct represents a separate domain of SRCU protection.h](h)}(h**Parameters**h]j)}(hjMh]h Parameters}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM<hjMubj )}(hhh]j)}(h5``struct srcu_struct *ssp`` structure to initialize. h](j)}(h``struct srcu_struct *ssp``h]j)}(hjMh]hstruct srcu_struct *ssp}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM9hjMubj2)}(hhh]h)}(hstructure to initialize.h]hstructure to initialize.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhM9hjMubah}(h]h ]h"]h$]h&]uh1j1hjMubeh}(h]h ]h"]h$]h&]uh1jhjMhM9hjMubah}(h]h ]h"]h$]h&]uh1j hjMubh)}(h**Description**h]j)}(hj Nh]h Description}(hj NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Nubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM;hjMubh)}(hXWUse this in place of DEFINE_SRCU_FAST() and DEFINE_STATIC_SRCU_FAST() for non-static srcu_struct structures that are to be passed to srcu_read_lock_fast() and friends. It is necessary to invoke this on a given srcu_struct before passing that srcu_struct to any other function. Each srcu_struct represents a separate domain of SRCU protection.h]hXWUse this in place of DEFINE_SRCU_FAST() and DEFINE_STATIC_SRCU_FAST() for non-static srcu_struct structures that are to be passed to srcu_read_lock_fast() and friends. It is necessary to invoke this on a given srcu_struct before passing that srcu_struct to any other function. Each srcu_struct represents a separate domain of SRCU protection.}(hj!NhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM:hjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )init_srcu_struct_fast_updown (C function)c.init_srcu_struct_fast_updownhNtauh1hhjhhhNhNubj)}(hhh](j)}(h:int init_srcu_struct_fast_updown (struct srcu_struct *ssp)h]j)}(h9int init_srcu_struct_fast_updown(struct srcu_struct *ssp)h](j )}(hinth]hint}(hjPNhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjLNhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMIubj2)}(h h]h }(hj_NhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjLNhhhj^NhMIubj{)}(hinit_srcu_struct_fast_updownh]j)}(hinit_srcu_struct_fast_updownh]hinit_srcu_struct_fast_updown}(hjqNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmNubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjLNhhhj^NhMIubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjNmodnameN classnameNj] j` )}jc ]jf )}jY jsNsbc.init_srcu_struct_fast_updownasbuh1hhjNubj2)}(h h]h }(hjNhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjNubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj)}(hssph]hssp}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjNubah}(h]h ]h"]h$]h&]jjuh1jhjLNhhhj^NhMIubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjHNhhhj^NhMIubah}(h]jCNah ](jjeh"]h$]h&]jj)jhuh1jhj^NhMIhjENhhubj)}(hhh]h)}(h4initialize a fast-reader up/down sleep-RCU structureh]h4initialize a fast-reader up/down sleep-RCU structure}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMIhj Ohhubah}(h]h ]h"]h$]h&]uh1jhjENhhhj^NhMIubeh}(h]h ](jfunctioneh"]h$]h&]jjjj(Ojj(Ojjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` structure to initialize. **Description** Use this function in place of DEFINE_SRCU_FAST_UPDOWN() and DEFINE_STATIC_SRCU_FAST_UPDOWN() for non-static srcu_struct structures that are to be passed to srcu_read_lock_fast_updown(), srcu_down_read_fast(), and friends. It is necessary to invoke this on a given srcu_struct before passing that srcu_struct to any other function. Each srcu_struct represents a separate domain of SRCU protection.h](h)}(h**Parameters**h]j)}(hj2Oh]h Parameters}(hj4OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0Oubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMMhj,Oubj )}(hhh]j)}(h5``struct srcu_struct *ssp`` structure to initialize. h](j)}(h``struct srcu_struct *ssp``h]j)}(hjQOh]hstruct srcu_struct *ssp}(hjSOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOOubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMJhjKOubj2)}(hhh]h)}(hstructure to initialize.h]hstructure to initialize.}(hjjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfOhMJhjgOubah}(h]h ]h"]h$]h&]uh1j1hjKOubeh}(h]h ]h"]h$]h&]uh1jhjfOhMJhjHOubah}(h]h ]h"]h$]h&]uh1j hj,Oubh)}(h**Description**h]j)}(hjOh]h Description}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMLhj,Oubh)}(hXUse this function in place of DEFINE_SRCU_FAST_UPDOWN() and DEFINE_STATIC_SRCU_FAST_UPDOWN() for non-static srcu_struct structures that are to be passed to srcu_read_lock_fast_updown(), srcu_down_read_fast(), and friends. It is necessary to invoke this on a given srcu_struct before passing that srcu_struct to any other function. Each srcu_struct represents a separate domain of SRCU protection.h]hXUse this function in place of DEFINE_SRCU_FAST_UPDOWN() and DEFINE_STATIC_SRCU_FAST_UPDOWN() for non-static srcu_struct structures that are to be passed to srcu_read_lock_fast_updown(), srcu_down_read_fast(), and friends. It is necessary to invoke this on a given srcu_struct before passing that srcu_struct to any other function. Each srcu_struct represents a separate domain of SRCU protection.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMKhj,Oubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  srcu_readers_active (C function)c.srcu_readers_activehNtauh1hhjhhhNhNubj)}(hhh](j)}(h2bool srcu_readers_active (struct srcu_struct *ssp)h]j)}(h1bool srcu_readers_active(struct srcu_struct *ssp)h](j )}(hj8h]hbool}(hjOhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjOhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMZubj2)}(h h]h }(hjOhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjOhhhjOhMZubj{)}(hsrcu_readers_activeh]j)}(hsrcu_readers_activeh]hsrcu_readers_active}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjOhhhjOhMZubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Pubj2)}(h h]h }(hjPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj Pubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj+PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(Pubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj-PmodnameN classnameNj] j` )}jc ]jf )}jY jOsbc.srcu_readers_activeasbuh1hhj Pubj2)}(h h]h }(hjKPhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj Pubj)}(hjh]h*}(hjYPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Pubj)}(hssph]hssp}(hjfPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Pubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjPubah}(h]h ]h"]h$]h&]jjuh1jhjOhhhjOhMZubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjOhhhjOhMZubah}(h]jOah ](jjeh"]h$]h&]jj)jhuh1jhjOhMZhjOhhubj)}(hhh]h)}(h6returns true if there are readers. and false otherwiseh]h6returns true if there are readers. and false otherwise}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMZhjPhhubah}(h]h ]h"]h$]h&]uh1jhjOhhhjOhMZubeh}(h]h ](jfunctioneh"]h$]h&]jjjjPjjPjjjuh1jhhhjhNhNubj)}(hX<**Parameters** ``struct srcu_struct *ssp`` which srcu_struct to count active readers (holding srcu_read_lock). **Description** Note that this is not an atomic primitive, and can therefore suffer severe errors when invoked on an active srcu_struct. That said, it can be useful as an error check at cleanup time.h](h)}(h**Parameters**h]j)}(hjPh]h Parameters}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM^hjPubj )}(hhh]j)}(h```struct srcu_struct *ssp`` which srcu_struct to count active readers (holding srcu_read_lock). h](j)}(h``struct srcu_struct *ssp``h]j)}(hjPh]hstruct srcu_struct *ssp}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM\hjPubj2)}(hhh]h)}(hCwhich srcu_struct to count active readers (holding srcu_read_lock).h]hCwhich srcu_struct to count active readers (holding srcu_read_lock).}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhM\hjPubah}(h]h ]h"]h$]h&]uh1j1hjPubeh}(h]h ]h"]h$]h&]uh1jhjPhM\hjPubah}(h]h ]h"]h$]h&]uh1j hjPubh)}(h**Description**h]j)}(hj Qh]h Description}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Qubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM^hjPubh)}(hNote that this is not an atomic primitive, and can therefore suffer severe errors when invoked on an active srcu_struct. That said, it can be useful as an error check at cleanup time.h]hNote that this is not an atomic primitive, and can therefore suffer severe errors when invoked on an active srcu_struct. That said, it can be useful as an error check at cleanup time.}(hj"QhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM]hjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  cleanup_srcu_struct (C function)c.cleanup_srcu_structhNtauh1hhjhhhNhNubj)}(hhh](j)}(h2void cleanup_srcu_struct (struct srcu_struct *ssp)h]j)}(h1void cleanup_srcu_struct(struct srcu_struct *ssp)h](j )}(hvoidh]hvoid}(hjQQhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjMQhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMubj2)}(h h]h }(hj`QhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjMQhhhj_QhMubj{)}(hcleanup_srcu_structh]j)}(hcleanup_srcu_structh]hcleanup_srcu_struct}(hjrQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnQubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjMQhhhj_QhMubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjQmodnameN classnameNj] j` )}jc ]jf )}jY jtQsbc.cleanup_srcu_structasbuh1hhjQubj2)}(h h]h }(hjQhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hjh]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(hssph]hssp}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubah}(h]h ]h"]h$]h&]jjuh1jhjMQhhhj_QhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjIQhhhj_QhMubah}(h]jDQah ](jjeh"]h$]h&]jj)jhuh1jhj_QhMhjFQhhubj)}(hhh]h)}(h!deconstruct a sleep-RCU structureh]h!deconstruct a sleep-RCU structure}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjRhhubah}(h]h ]h"]h$]h&]uh1jhjFQhhhj_QhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj)Rjj)Rjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct srcu_struct *ssp`` structure to clean up. **Description** Must invoke this after you are finished using a given srcu_struct that was initialized via init_srcu_struct(), else you leak memory.h](h)}(h**Parameters**h]j)}(hj3Rh]h Parameters}(hj5RhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1Rubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj-Rubj )}(hhh]j)}(h3``struct srcu_struct *ssp`` structure to clean up. h](j)}(h``struct srcu_struct *ssp``h]j)}(hjRRh]hstruct srcu_struct *ssp}(hjTRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPRubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjLRubj2)}(hhh]h)}(hstructure to clean up.h]hstructure to clean up.}(hjkRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjgRhMhjhRubah}(h]h ]h"]h$]h&]uh1j1hjLRubeh}(h]h ]h"]h$]h&]uh1jhjgRhMhjIRubah}(h]h ]h"]h$]h&]uh1j hj-Rubh)}(h**Description**h]j)}(hjRh]h Description}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj-Rubh)}(hMust invoke this after you are finished using a given srcu_struct that was initialized via init_srcu_struct(), else you leak memory.h]hMust invoke this after you are finished using a given srcu_struct that was initialized via init_srcu_struct(), else you leak memory.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj-Rubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j call_srcu (C function) c.call_srcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hSvoid call_srcu (struct srcu_struct *ssp, struct rcu_head *rhp, rcu_callback_t func)h]j)}(hRvoid call_srcu(struct srcu_struct *ssp, struct rcu_head *rhp, rcu_callback_t func)h](j )}(hvoidh]hvoid}(hjRhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjRhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMubj2)}(h h]h }(hjRhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjRhhhjRhMubj{)}(h call_srcuh]j)}(h call_srcuh]h call_srcu}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjRhhhjRhMubj)}(hD(struct srcu_struct *ssp, struct rcu_head *rhp, rcu_callback_t func)h](j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Subj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj Subh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj-ShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*Subah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj/SmodnameN classnameNj] j` )}jc ]jf )}jY jRsb c.call_srcuasbuh1hhj Subj2)}(h h]h }(hjMShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj Subj)}(hjh]h*}(hj[ShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Subj)}(hssph]hssp}(hjhShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Subeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubj)}(hstruct rcu_head *rhph](j)}(hjAh]hstruct}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}Subj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}Subh)}(hhh]j)}(hrcu_headh]hrcu_head}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjSmodnameN classnameNj] j` )}jc ]jIS c.call_srcuasbuh1hhj}Subj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}Subj)}(hjh]h*}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}Subj)}(hrhph]hrhp}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}Subeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubj)}(hrcu_callback_t funch](h)}(hhh]j)}(hrcu_callback_th]hrcu_callback_t}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjSmodnameN classnameNj] j` )}jc ]jIS c.call_srcuasbuh1hhjSubj2)}(h h]h }(hjThhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjSubj)}(hfunch]hfunc}(hj ThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjSubeh}(h]h ]h"]h$]h&]jjuh1jhjRhhhjRhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjRhhhjRhMubah}(h]jRah ](jjeh"]h$]h&]jj)jhuh1jhjRhMhjRhhubj)}(hhh]h)}(h:Queue a callback for invocation after an SRCU grace periodh]h:Queue a callback for invocation after an SRCU grace period}(hjJThhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjGThhubah}(h]h ]h"]h$]h&]uh1jhjRhhhjRhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbTjjbTjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` srcu_struct in queue the callback ``struct rcu_head *rhp`` structure to be used for queueing the SRCU callback. ``rcu_callback_t func`` function to be invoked after the SRCU grace period **Description** The callback function will be invoked some time after a full SRCU grace period elapses, in other words after all pre-existing SRCU read-side critical sections have completed. However, the callback function might well execute concurrently with other SRCU read-side critical sections that started after call_srcu() was invoked. SRCU read-side critical sections are delimited by srcu_read_lock() and srcu_read_unlock(), and may be nested. The callback will be invoked from process context, but with bh disabled. The callback function must therefore be fast and must not block. See the description of call_rcu() for more detailed information on memory ordering guarantees.h](h)}(h**Parameters**h]j)}(hjlTh]h Parameters}(hjnThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjTubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjfTubj )}(hhh](j)}(h>``struct srcu_struct *ssp`` srcu_struct in queue the callback h](j)}(h``struct srcu_struct *ssp``h]j)}(hjTh]hstruct srcu_struct *ssp}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjTubj2)}(hhh]h)}(h!srcu_struct in queue the callbackh]h!srcu_struct in queue the callback}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThMhjTubah}(h]h ]h"]h$]h&]uh1j1hjTubeh}(h]h ]h"]h$]h&]uh1jhjThMhjTubj)}(hN``struct rcu_head *rhp`` structure to be used for queueing the SRCU callback. h](j)}(h``struct rcu_head *rhp``h]j)}(hjTh]hstruct rcu_head *rhp}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjTubj2)}(hhh]h)}(h4structure to be used for queueing the SRCU callback.h]h4structure to be used for queueing the SRCU callback.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThMhjTubah}(h]h ]h"]h$]h&]uh1j1hjTubeh}(h]h ]h"]h$]h&]uh1jhjThMhjTubj)}(hK``rcu_callback_t func`` function to be invoked after the SRCU grace period h](j)}(h``rcu_callback_t func``h]j)}(hjTh]hrcu_callback_t func}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjTubj2)}(hhh]h)}(h2function to be invoked after the SRCU grace periodh]h2function to be invoked after the SRCU grace period}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhMhjUubah}(h]h ]h"]h$]h&]uh1j1hjTubeh}(h]h ]h"]h$]h&]uh1jhjUhMhjTubeh}(h]h ]h"]h$]h&]uh1j hjfTubh)}(h**Description**h]j)}(hj8Uh]h Description}(hj:UhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6Uubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjfTubh)}(hXThe callback function will be invoked some time after a full SRCU grace period elapses, in other words after all pre-existing SRCU read-side critical sections have completed. However, the callback function might well execute concurrently with other SRCU read-side critical sections that started after call_srcu() was invoked. SRCU read-side critical sections are delimited by srcu_read_lock() and srcu_read_unlock(), and may be nested.h]hXThe callback function will be invoked some time after a full SRCU grace period elapses, in other words after all pre-existing SRCU read-side critical sections have completed. However, the callback function might well execute concurrently with other SRCU read-side critical sections that started after call_srcu() was invoked. SRCU read-side critical sections are delimited by srcu_read_lock() and srcu_read_unlock(), and may be nested.}(hjNUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjfTubh)}(hThe callback will be invoked from process context, but with bh disabled. The callback function must therefore be fast and must not block.h]hThe callback will be invoked from process context, but with bh disabled. The callback function must therefore be fast and must not block.}(hj]UhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjfTubh)}(h^See the description of call_rcu() for more detailed information on memory ordering guarantees.h]h^See the description of call_rcu() for more detailed information on memory ordering guarantees.}(hjlUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjfTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'synchronize_srcu_expedited (C function)c.synchronize_srcu_expeditedhNtauh1hhjhhhNhNubj)}(hhh](j)}(h9void synchronize_srcu_expedited (struct srcu_struct *ssp)h]j)}(h8void synchronize_srcu_expedited(struct srcu_struct *ssp)h](j )}(hvoidh]hvoid}(hjUhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjUhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUhhhjUhMubj{)}(hsynchronize_srcu_expeditedh]j)}(hsynchronize_srcu_expeditedh]hsynchronize_srcu_expedited}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjUhhhjUhMubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjUhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjUmodnameN classnameNj] j` )}jc ]jf )}jY jUsbc.synchronize_srcu_expeditedasbuh1hhjUubj2)}(h h]h }(hjVhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj)}(hjh]h*}(hj$VhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(hssph]hssp}(hj1VhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjUubah}(h]h ]h"]h$]h&]jjuh1jhjUhhhjUhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjUhhhjUhMubah}(h]jUah ](jjeh"]h$]h&]jj)jhuh1jhjUhMhjUhhubj)}(hhh]h)}(hBrute-force SRCU grace periodh]hBrute-force SRCU grace period}(hj[VhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjXVhhubah}(h]h ]h"]h$]h&]uh1jhjUhhhjUhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjsVjjsVjjjuh1jhhhjhNhNubj)}(hXQ**Parameters** ``struct srcu_struct *ssp`` srcu_struct with which to synchronize. **Description** Wait for an SRCU grace period to elapse, but be more aggressive about spinning rather than blocking when waiting. Note that synchronize_srcu_expedited() has the same deadlock and memory-ordering properties as does synchronize_srcu().h](h)}(h**Parameters**h]j)}(hj}Vh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{Vubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjwVubj )}(hhh]j)}(hC``struct srcu_struct *ssp`` srcu_struct with which to synchronize. h](j)}(h``struct srcu_struct *ssp``h]j)}(hjVh]hstruct srcu_struct *ssp}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjVubj2)}(hhh]h)}(h&srcu_struct with which to synchronize.h]h&srcu_struct with which to synchronize.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjVubah}(h]h ]h"]h$]h&]uh1j1hjVubeh}(h]h ]h"]h$]h&]uh1jhjVhMhjVubah}(h]h ]h"]h$]h&]uh1j hjwVubh)}(h**Description**h]j)}(hjVh]h Description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjwVubh)}(hqWait for an SRCU grace period to elapse, but be more aggressive about spinning rather than blocking when waiting.Vh]hqWait for an SRCU grace period to elapse, but be more aggressive about spinning rather than blocking when waiting.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjwVubh)}(hwNote that synchronize_srcu_expedited() has the same deadlock and memory-ordering properties as does synchronize_srcu().h]hwNote that synchronize_srcu_expedited() has the same deadlock and memory-ordering properties as does synchronize_srcu().}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjwVubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j synchronize_srcu (C function)c.synchronize_srcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h/void synchronize_srcu (struct srcu_struct *ssp)h]j)}(h.void synchronize_srcu(struct srcu_struct *ssp)h](j )}(hvoidh]hvoid}(hj+WhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj'WhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMubj2)}(h h]h }(hj:WhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'Whhhj9WhMubj{)}(hsynchronize_srcuh]j)}(hsynchronize_srcuh]hsynchronize_srcu}(hjLWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHWubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj'Whhhj9WhMubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hjhWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdWubj2)}(h h]h }(hjuWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdWubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjWmodnameN classnameNj] j` )}jc ]jf )}jY jNWsbc.synchronize_srcuasbuh1hhjdWubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdWubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdWubj)}(hssph]hssp}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdWubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj`Wubah}(h]h ]h"]h$]h&]jjuh1jhj'Whhhj9WhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj#Whhhj9WhMubah}(h]jWah ](jjeh"]h$]h&]jj)jhuh1jhj9WhMhj Whhubj)}(hhh]h)}(h9wait for prior SRCU read-side critical-section completionh]h9wait for prior SRCU read-side critical-section completion}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjWhhubah}(h]h ]h"]h$]h&]uh1jhj Whhhj9WhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjXjjXjjjuh1jhhhjhNhNubj)}(hX **Parameters** ``struct srcu_struct *ssp`` srcu_struct with which to synchronize. **Description** Wait for the count to drain to zero of both indexes. To avoid the possible starvation of synchronize_srcu(), it waits for the count of the index=!(ssp->srcu_ctrp - :c:type:`ssp->sda `->srcu_ctrs[0]) to drain to zero at first, and then flip the ->srcu_ctrp and wait for the count of the other index. Can block; must be called from process context. Note that it is illegal to call synchronize_srcu() from the corresponding SRCU read-side critical section; doing so will result in deadlock. However, it is perfectly legal to call synchronize_srcu() on one srcu_struct from some other srcu_struct's read-side critical section, as long as the resulting graph of srcu_structs is acyclic. There are memory-ordering constraints implied by synchronize_srcu(). On systems with more than one CPU, when synchronize_srcu() returns, each CPU is guaranteed to have executed a full memory barrier since the end of its last corresponding SRCU read-side critical section whose beginning preceded the call to synchronize_srcu(). In addition, each CPU having an SRCU read-side critical section that extends beyond the return from synchronize_srcu() is guaranteed to have executed a full memory barrier after the beginning of synchronize_srcu() and before the beginning of that SRCU read-side critical section. Note that these guarantees include CPUs that are offline, idle, or executing in user mode, as well as CPUs that are executing in the kernel. Furthermore, if CPU A invoked synchronize_srcu(), which returned to its caller on CPU B, then both CPU A and CPU B are guaranteed to have executed a full memory barrier during the execution of synchronize_srcu(). This guarantee applies even if CPU A and CPU B are the same CPU, but again only if the system has more than one CPU. Of course, these memory-ordering guarantees apply only when synchronize_srcu(), srcu_read_lock(), and srcu_read_unlock() are passed the same srcu_struct structure. Implementation of these memory-ordering guarantees is similar to that of synchronize_rcu(). If SRCU is likely idle as determined by srcu_should_expedite(), expedite the first request. This semantic was provided by Classic SRCU, and is relied upon by its users, so TREE SRCU must also provide it. Note that detecting idleness is heuristic and subject to both false positives and negatives.h](h)}(h**Parameters**h]j)}(hj Xh]h Parameters}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Xubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjXubj )}(hhh]j)}(hC``struct srcu_struct *ssp`` srcu_struct with which to synchronize. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj,Xh]hstruct srcu_struct *ssp}(hj.XhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*Xubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj&Xubj2)}(hhh]h)}(h&srcu_struct with which to synchronize.h]h&srcu_struct with which to synchronize.}(hjEXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAXhMhjBXubah}(h]h ]h"]h$]h&]uh1j1hj&Xubeh}(h]h ]h"]h$]h&]uh1jhjAXhMhj#Xubah}(h]h ]h"]h$]h&]uh1j hjXubh)}(h**Description**h]j)}(hjgXh]h Description}(hjiXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeXubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjXubh)}(hX/Wait for the count to drain to zero of both indexes. To avoid the possible starvation of synchronize_srcu(), it waits for the count of the index=!(ssp->srcu_ctrp - :c:type:`ssp->sda `->srcu_ctrs[0]) to drain to zero at first, and then flip the ->srcu_ctrp and wait for the count of the other index.h](hWait for the count to drain to zero of both indexes. To avoid the possible starvation of synchronize_srcu(), it waits for the count of the index=!(ssp->srcu_ctrp - }(hj}XhhhNhNubh)}(h:c:type:`ssp->sda `h]j)}(hjXh]hssp->sda}(hjXhhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjsspuh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj}Xubhs->srcu_ctrs[0]) to drain to zero at first, and then flip the ->srcu_ctrp and wait for the count of the other index.}(hj}XhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjXhMhjXubh)}(h/Can block; must be called from process context.h]h/Can block; must be called from process context.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjXubh)}(hXNNote that it is illegal to call synchronize_srcu() from the corresponding SRCU read-side critical section; doing so will result in deadlock. However, it is perfectly legal to call synchronize_srcu() on one srcu_struct from some other srcu_struct's read-side critical section, as long as the resulting graph of srcu_structs is acyclic.h]hXPNote that it is illegal to call synchronize_srcu() from the corresponding SRCU read-side critical section; doing so will result in deadlock. However, it is perfectly legal to call synchronize_srcu() on one srcu_struct from some other srcu_struct’s read-side critical section, as long as the resulting graph of srcu_structs is acyclic.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjXubh)}(hXThere are memory-ordering constraints implied by synchronize_srcu(). On systems with more than one CPU, when synchronize_srcu() returns, each CPU is guaranteed to have executed a full memory barrier since the end of its last corresponding SRCU read-side critical section whose beginning preceded the call to synchronize_srcu(). In addition, each CPU having an SRCU read-side critical section that extends beyond the return from synchronize_srcu() is guaranteed to have executed a full memory barrier after the beginning of synchronize_srcu() and before the beginning of that SRCU read-side critical section. Note that these guarantees include CPUs that are offline, idle, or executing in user mode, as well as CPUs that are executing in the kernel.h]hXThere are memory-ordering constraints implied by synchronize_srcu(). On systems with more than one CPU, when synchronize_srcu() returns, each CPU is guaranteed to have executed a full memory barrier since the end of its last corresponding SRCU read-side critical section whose beginning preceded the call to synchronize_srcu(). In addition, each CPU having an SRCU read-side critical section that extends beyond the return from synchronize_srcu() is guaranteed to have executed a full memory barrier after the beginning of synchronize_srcu() and before the beginning of that SRCU read-side critical section. Note that these guarantees include CPUs that are offline, idle, or executing in user mode, as well as CPUs that are executing in the kernel.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjXubh)}(hXJFurthermore, if CPU A invoked synchronize_srcu(), which returned to its caller on CPU B, then both CPU A and CPU B are guaranteed to have executed a full memory barrier during the execution of synchronize_srcu(). This guarantee applies even if CPU A and CPU B are the same CPU, but again only if the system has more than one CPU.h]hXJFurthermore, if CPU A invoked synchronize_srcu(), which returned to its caller on CPU B, then both CPU A and CPU B are guaranteed to have executed a full memory barrier during the execution of synchronize_srcu(). This guarantee applies even if CPU A and CPU B are the same CPU, but again only if the system has more than one CPU.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjXubh)}(hOf course, these memory-ordering guarantees apply only when synchronize_srcu(), srcu_read_lock(), and srcu_read_unlock() are passed the same srcu_struct structure.h]hOf course, these memory-ordering guarantees apply only when synchronize_srcu(), srcu_read_lock(), and srcu_read_unlock() are passed the same srcu_struct structure.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjXubh)}(h[Implementation of these memory-ordering guarantees is similar to that of synchronize_rcu().h]h[Implementation of these memory-ordering guarantees is similar to that of synchronize_rcu().}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjXubh)}(hX)If SRCU is likely idle as determined by srcu_should_expedite(), expedite the first request. This semantic was provided by Classic SRCU, and is relied upon by its users, so TREE SRCU must also provide it. Note that detecting idleness is heuristic and subject to both false positives and negatives.h]hX)If SRCU is likely idle as determined by srcu_should_expedite(), expedite the first request. This semantic was provided by Classic SRCU, and is relied upon by its users, so TREE SRCU must also provide it. Note that detecting idleness is heuristic and subject to both false positives and negatives.}(hj YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'get_state_synchronize_srcu (C function)c.get_state_synchronize_srcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hBunsigned long get_state_synchronize_srcu (struct srcu_struct *ssp)h]j)}(hAunsigned long get_state_synchronize_srcu(struct srcu_struct *ssp)h](j )}(hunsignedh]hunsigned}(hj8YhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj4YhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM0ubj2)}(h h]h }(hjGYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4YhhhjFYhM0ubj )}(hlongh]hlong}(hjUYhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj4YhhhjFYhM0ubj2)}(h h]h }(hjcYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4YhhhjFYhM0ubj{)}(hget_state_synchronize_srcuh]j)}(hget_state_synchronize_srcuh]hget_state_synchronize_srcu}(hjuYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqYubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj4YhhhjFYhM0ubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjYmodnameN classnameNj] j` )}jc ]jf )}jY jwYsbc.get_state_synchronize_srcuasbuh1hhjYubj2)}(h h]h }(hjYhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjYubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hssph]hssp}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjYubah}(h]h ]h"]h$]h&]jjuh1jhj4YhhhjFYhM0ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj0YhhhjFYhM0ubah}(h]j+Yah ](jjeh"]h$]h&]jj)jhuh1jhjFYhM0hj-Yhhubj)}(hhh]h)}(h%Provide an end-of-grace-period cookieh]h%Provide an end-of-grace-period cookie}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM0hjZhhubah}(h]h ]h"]h$]h&]uh1jhj-YhhhjFYhM0ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj,Zjj,Zjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` srcu_struct to provide cookie for. **Description** This function returns a cookie that can be passed to poll_state_synchronize_srcu(), which will return true if a full grace period has elapsed in the meantime. It is the caller's responsibility to make sure that grace period happens, for example, by invoking call_srcu() after return from get_state_synchronize_srcu().h](h)}(h**Parameters**h]j)}(hj6Zh]h Parameters}(hj8ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4Zubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM4hj0Zubj )}(hhh]j)}(h?``struct srcu_struct *ssp`` srcu_struct to provide cookie for. h](j)}(h``struct srcu_struct *ssp``h]j)}(hjUZh]hstruct srcu_struct *ssp}(hjWZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSZubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM1hjOZubj2)}(hhh]h)}(h"srcu_struct to provide cookie for.h]h"srcu_struct to provide cookie for.}(hjnZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjZhM1hjkZubah}(h]h ]h"]h$]h&]uh1j1hjOZubeh}(h]h ]h"]h$]h&]uh1jhjjZhM1hjLZubah}(h]h ]h"]h$]h&]uh1j hj0Zubh)}(h**Description**h]j)}(hjZh]h Description}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM3hj0Zubh)}(hX>This function returns a cookie that can be passed to poll_state_synchronize_srcu(), which will return true if a full grace period has elapsed in the meantime. It is the caller's responsibility to make sure that grace period happens, for example, by invoking call_srcu() after return from get_state_synchronize_srcu().h]hX@This function returns a cookie that can be passed to poll_state_synchronize_srcu(), which will return true if a full grace period has elapsed in the meantime. It is the caller’s responsibility to make sure that grace period happens, for example, by invoking call_srcu() after return from get_state_synchronize_srcu().}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM2hj0Zubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (start_poll_synchronize_srcu (C function)c.start_poll_synchronize_srcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hCunsigned long start_poll_synchronize_srcu (struct srcu_struct *ssp)h]j)}(hBunsigned long start_poll_synchronize_srcu(struct srcu_struct *ssp)h](j )}(hunsignedh]hunsigned}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMCubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZhhhjZhMCubj )}(hlongh]hlong}(hjZhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjZhhhjZhMCubj2)}(h h]h }(hj[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZhhhjZhMCubj{)}(hstart_poll_synchronize_srcuh]j)}(hstart_poll_synchronize_srcuh]hstart_poll_synchronize_srcu}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjZhhhjZhMCubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj.[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*[ubj2)}(h h]h }(hj;[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*[ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hjL[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI[ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjN[modnameN classnameNj] j` )}jc ]jf )}jY j[sbc.start_poll_synchronize_srcuasbuh1hhj*[ubj2)}(h h]h }(hjl[hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj*[ubj)}(hjh]h*}(hjz[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*[ubj)}(hssph]hssp}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*[ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj&[ubah}(h]h ]h"]h$]h&]jjuh1jhjZhhhjZhMCubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjZhhhjZhMCubah}(h]jZah ](jjeh"]h$]h&]jj)jhuh1jhjZhMChjZhhubj)}(hhh]h)}(h%Provide cookie and start grace periodh]h%Provide cookie and start grace period}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMChj[hhubah}(h]h ]h"]h$]h&]uh1jhjZhhhjZhMCubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[jj[jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` srcu_struct to provide cookie for. **Description** This function returns a cookie that can be passed to poll_state_synchronize_srcu(), which will return true if a full grace period has elapsed in the meantime. Unlike get_state_synchronize_srcu(), this function also ensures that any needed SRCU grace period will be started. This convenience does come at a cost in terms of CPU overhead.h](h)}(h**Parameters**h]j)}(hj[h]h Parameters}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMGhj[ubj )}(hhh]j)}(h?``struct srcu_struct *ssp`` srcu_struct to provide cookie for. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj[h]hstruct srcu_struct *ssp}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMDhj[ubj2)}(hhh]h)}(h"srcu_struct to provide cookie for.h]h"srcu_struct to provide cookie for.}(hj \hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMDhj\ubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhj\hMDhj[ubah}(h]h ]h"]h$]h&]uh1j hj[ubh)}(h**Description**h]j)}(hj-\h]h Description}(hj/\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+\ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMFhj[ubh)}(hXRThis function returns a cookie that can be passed to poll_state_synchronize_srcu(), which will return true if a full grace period has elapsed in the meantime. Unlike get_state_synchronize_srcu(), this function also ensures that any needed SRCU grace period will be started. This convenience does come at a cost in terms of CPU overhead.h]hXRThis function returns a cookie that can be passed to poll_state_synchronize_srcu(), which will return true if a full grace period has elapsed in the meantime. Unlike get_state_synchronize_srcu(), this function also ensures that any needed SRCU grace period will be started. This convenience does come at a cost in terms of CPU overhead.}(hjC\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMEhj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (poll_state_synchronize_srcu (C function)c.poll_state_synchronize_srcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hPbool poll_state_synchronize_srcu (struct srcu_struct *ssp, unsigned long cookie)h]j)}(hObool poll_state_synchronize_srcu(struct srcu_struct *ssp, unsigned long cookie)h](j )}(hj8h]hbool}(hjr\hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjn\hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMSubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjn\hhhj\hMSubj{)}(hpoll_state_synchronize_srcuh]j)}(hpoll_state_synchronize_srcuh]hpoll_state_synchronize_srcu}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjn\hhhj\hMSubj)}(h/(struct srcu_struct *ssp, unsigned long cookie)h](j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj\modnameN classnameNj] j` )}jc ]jf )}jY j\sbc.poll_state_synchronize_srcuasbuh1hhj\ubj2)}(h h]h }(hj\hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj\ubj)}(hjh]h*}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hssph]hssp}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubj)}(hunsigned long cookieh](j )}(hunsignedh]hunsigned}(hj ]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hj.]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj )}(hlongh]hlong}(hj<]hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hjJ]hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hcookieh]hcookie}(hjX]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj\ubeh}(h]h ]h"]h$]h&]jjuh1jhjn\hhhj\hMSubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjj\hhhj\hMSubah}(h]je\ah ](jjeh"]h$]h&]jj)jhuh1jhj\hMShjg\hhubj)}(hhh]h)}(h Has cookie's grace period ended?h]h"Has cookie’s grace period ended?}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMShj]hhubah}(h]h ]h"]h$]h&]uh1jhjg\hhhj\hMSubeh}(h]h ](jfunctioneh"]h$]h&]jjjj]jj]jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` srcu_struct to provide cookie for. ``unsigned long cookie`` Return value from get_state_synchronize_srcu() or start_poll_synchronize_srcu(). **Description** This function takes the cookie that was returned from either get_state_synchronize_srcu() or start_poll_synchronize_srcu(), and returns **true** if an SRCU grace period elapsed since the time that the cookie was created. Because cookies are finite in size, wrapping/overflow is possible. This is more pronounced on 32-bit systems where cookies are 32 bits, where in theory wrapping could happen in about 14 hours assuming 25-microsecond expedited SRCU grace periods. However, a more likely overflow lower bound is on the order of 24 days in the case of one-millisecond SRCU grace periods. Of course, wrapping in a 64-bit system requires geologic timespans, as in more than seven million years even for expedited SRCU grace periods. Wrapping/overflow is much more of an issue for CONFIG_SMP=n systems that also have CONFIG_PREEMPTION=n, which selects Tiny SRCU. This uses a 16-bit cookie, which rcutorture routinely wraps in a matter of a few minutes. If this proves to be a problem, this counter will be expanded to the same size as for Tree SRCU.h](h)}(h**Parameters**h]j)}(hj]h]h Parameters}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMWhj]ubj )}(hhh](j)}(h?``struct srcu_struct *ssp`` srcu_struct to provide cookie for. h](j)}(h``struct srcu_struct *ssp``h]j)}(hj]h]hstruct srcu_struct *ssp}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMThj]ubj2)}(hhh]h)}(h"srcu_struct to provide cookie for.h]h"srcu_struct to provide cookie for.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hMThj]ubah}(h]h ]h"]h$]h&]uh1j1hj]ubeh}(h]h ]h"]h$]h&]uh1jhj]hMThj]ubj)}(hj``unsigned long cookie`` Return value from get_state_synchronize_srcu() or start_poll_synchronize_srcu(). h](j)}(h``unsigned long cookie``h]j)}(hj]h]hunsigned long cookie}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMUhj]ubj2)}(hhh]h)}(hPReturn value from get_state_synchronize_srcu() or start_poll_synchronize_srcu().h]hPReturn value from get_state_synchronize_srcu() or start_poll_synchronize_srcu().}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hMUhj^ubah}(h]h ]h"]h$]h&]uh1j1hj]ubeh}(h]h ]h"]h$]h&]uh1jhj^hMUhj]ubeh}(h]h ]h"]h$]h&]uh1j hj]ubh)}(h**Description**h]j)}(hj7^h]h Description}(hj9^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5^ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMWhj]ubh)}(hThis function takes the cookie that was returned from either get_state_synchronize_srcu() or start_poll_synchronize_srcu(), and returns **true** if an SRCU grace period elapsed since the time that the cookie was created.h](hThis function takes the cookie that was returned from either get_state_synchronize_srcu() or start_poll_synchronize_srcu(), and returns }(hjM^hhhNhNubj)}(h**true**h]htrue}(hjU^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM^ubhL if an SRCU grace period elapsed since the time that the cookie was created.}(hjM^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMVhj]ubh)}(hXBecause cookies are finite in size, wrapping/overflow is possible. This is more pronounced on 32-bit systems where cookies are 32 bits, where in theory wrapping could happen in about 14 hours assuming 25-microsecond expedited SRCU grace periods. However, a more likely overflow lower bound is on the order of 24 days in the case of one-millisecond SRCU grace periods. Of course, wrapping in a 64-bit system requires geologic timespans, as in more than seven million years even for expedited SRCU grace periods.h]hXBecause cookies are finite in size, wrapping/overflow is possible. This is more pronounced on 32-bit systems where cookies are 32 bits, where in theory wrapping could happen in about 14 hours assuming 25-microsecond expedited SRCU grace periods. However, a more likely overflow lower bound is on the order of 24 days in the case of one-millisecond SRCU grace periods. Of course, wrapping in a 64-bit system requires geologic timespans, as in more than seven million years even for expedited SRCU grace periods.}(hjn^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chM[hj]ubh)}(hX=Wrapping/overflow is much more of an issue for CONFIG_SMP=n systems that also have CONFIG_PREEMPTION=n, which selects Tiny SRCU. This uses a 16-bit cookie, which rcutorture routinely wraps in a matter of a few minutes. If this proves to be a problem, this counter will be expanded to the same size as for Tree SRCU.h]hX=Wrapping/overflow is much more of an issue for CONFIG_SMP=n systems that also have CONFIG_PREEMPTION=n, which selects Tiny SRCU. This uses a 16-bit cookie, which rcutorture routinely wraps in a matter of a few minutes. If this proves to be a problem, this counter will be expanded to the same size as for Tree SRCU.}(hj}^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMdhj]ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j srcu_barrier (C function)c.srcu_barrierhNtauh1hhjhhhNhNubj)}(hhh](j)}(h+void srcu_barrier (struct srcu_struct *ssp)h]j)}(h*void srcu_barrier(struct srcu_struct *ssp)h](j )}(hvoidh]hvoid}(hj^hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj^hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^hhhj^hMubj{)}(h srcu_barrierh]j)}(h srcu_barrierh]h srcu_barrier}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj^hhhj^hMubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj2)}(h h]h }(hj^hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj _modnameN classnameNj] j` )}jc ]jf )}jY j^sbc.srcu_barrierasbuh1hhj^ubj2)}(h h]h }(hj'_hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^ubj)}(hjh]h*}(hj5_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hssph]hssp}(hjB_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj^ubah}(h]h ]h"]h$]h&]jjuh1jhj^hhhj^hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj^hhhj^hMubah}(h]j^ah ](jjeh"]h$]h&]jj)jhuh1jhj^hMhj^hhubj)}(hhh]h)}(h8Wait until all in-flight call_srcu() callbacks complete.h]h8Wait until all in-flight call_srcu() callbacks complete.}(hjl_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhji_hhubah}(h]h ]h"]h$]h&]uh1jhj^hhhj^hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj_jj_jjjuh1jhhhjhNhNubj)}(hc**Parameters** ``struct srcu_struct *ssp`` srcu_struct on which to wait for in-flight callbacks.h](h)}(h**Parameters**h]j)}(hj_h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj_ubj )}(hhh]j)}(hQ``struct srcu_struct *ssp`` srcu_struct on which to wait for in-flight callbacks.h](j)}(h``struct srcu_struct *ssp``h]j)}(hj_h]hstruct srcu_struct *ssp}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj_ubj2)}(hhh]h)}(h5srcu_struct on which to wait for in-flight callbacks.h]h5srcu_struct on which to wait for in-flight callbacks.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj_ubah}(h]h ]h"]h$]h&]uh1j1hj_ubeh}(h]h ]h"]h$]h&]uh1jhj_hMhj_ubah}(h]h ]h"]h$]h&]uh1j hj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "srcu_expedite_current (C function)c.srcu_expedite_currenthNtauh1hhjhhhNhNubj)}(hhh](j)}(h4void srcu_expedite_current (struct srcu_struct *ssp)h]j)}(h3void srcu_expedite_current(struct srcu_struct *ssp)h](j )}(hvoidh]hvoid}(hj`hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj`hhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj`hhhj`hMubj{)}(hsrcu_expedite_currenth]j)}(hsrcu_expedite_currenth]hsrcu_expedite_current}(hj(`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$`ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj`hhhj`hMubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hjD`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@`ubj2)}(h h]h }(hjQ`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@`ubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hjb`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_`ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjd`modnameN classnameNj] j` )}jc ]jf )}jY j*`sbc.srcu_expedite_currentasbuh1hhj@`ubj2)}(h h]h }(hj`hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@`ubj)}(hjh]h*}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@`ubj)}(hssph]hssp}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<`ubah}(h]h ]h"]h$]h&]jjuh1jhj`hhhj`hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj_hhhj`hMubah}(h]j_ah ](jjeh"]h$]h&]jj)jhuh1jhj`hMhj_hhubj)}(hhh]h)}(h&Expedite the current SRCU grace periodh]h&Expedite the current SRCU grace period}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj`hhubah}(h]h ]h"]h$]h&]uh1jhj_hhhj`hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj`jj`jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_struct *ssp`` srcu_struct to expedite. **Description** Cause the current SRCU grace period to become expedited. The grace period following the current one might also be expedited. If there is no current grace period, one might be created. If the current grace period is currently sleeping, that sleep will complete before expediting will take effect.h](h)}(h**Parameters**h]j)}(hj`h]h Parameters}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj`ubj )}(hhh]j)}(h5``struct srcu_struct *ssp`` srcu_struct to expedite. h](j)}(h``struct srcu_struct *ssp``h]j)}(hjah]hstruct srcu_struct *ssp}(hj ahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjaubj2)}(hhh]h)}(hsrcu_struct to expedite.h]hsrcu_struct to expedite.}(hj!ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMhjaubah}(h]h ]h"]h$]h&]uh1j1hjaubeh}(h]h ]h"]h$]h&]uh1jhjahMhj`ubah}(h]h ]h"]h$]h&]uh1j hj`ubh)}(h**Description**h]j)}(hjCah]h Description}(hjEahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAaubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj`ubh)}(hX*Cause the current SRCU grace period to become expedited. The grace period following the current one might also be expedited. If there is no current grace period, one might be created. If the current grace period is currently sleeping, that sleep will complete before expediting will take effect.h]hX*Cause the current SRCU grace period to become expedited. The grace period following the current one might also be expedited. If there is no current grace period, one might be created. If the current grace period is currently sleeping, that sleep will complete before expediting will take effect.}(hjYahhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhj`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #srcu_batches_completed (C function)c.srcu_batches_completedhNtauh1hhjhhhNhNubj)}(hhh](j)}(h>unsigned long srcu_batches_completed (struct srcu_struct *ssp)h]j)}(h=unsigned long srcu_batches_completed(struct srcu_struct *ssp)h](j )}(hunsignedh]hunsigned}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjahhhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjahhhjahMubj )}(hlongh]hlong}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjahhhjahMubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjahhhjahMubj{)}(hsrcu_batches_completedh]j)}(hsrcu_batches_completedh]hsrcu_batches_completed}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjahhhjahMubj)}(h(struct srcu_struct *ssp)h]j)}(hstruct srcu_struct *ssph](j)}(hjAh]hstruct}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubh)}(hhh]j)}(h srcu_structh]h srcu_struct}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjbmodnameN classnameNj] j` )}jc ]jf )}jY jasbc.srcu_batches_completedasbuh1hhjaubj2)}(h h]h }(hjbhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjaubj)}(hjh]h*}(hj-bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj)}(hssph]hssp}(hj:bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjaubah}(h]h ]h"]h$]h&]jjuh1jhjahhhjahMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjahhhjahMubah}(h]j{aah ](jjeh"]h$]h&]jj)jhuh1jhjahMhj}ahhubj)}(hhh]h)}(hreturn batches completed.h]hreturn batches completed.}(hjdbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjabhhubah}(h]h ]h"]h$]h&]uh1jhj}ahhhjahMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj|bjj|bjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct srcu_struct *ssp`` srcu_struct on which to report batch completion. **Description** Report the number of batches, correlated with, but not necessarily precisely the same as, the number of grace periods that have elapsed.h](h)}(h**Parameters**h]j)}(hjbh]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjbubj )}(hhh]j)}(hM``struct srcu_struct *ssp`` srcu_struct on which to report batch completion. h](j)}(h``struct srcu_struct *ssp``h]j)}(hjbh]hstruct srcu_struct *ssp}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjbubj2)}(hhh]h)}(h0srcu_struct on which to report batch completion.h]h0srcu_struct on which to report batch completion.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMhjbubah}(h]h ]h"]h$]h&]uh1j1hjbubeh}(h]h ]h"]h$]h&]uh1jhjbhMhjbubah}(h]h ]h"]h$]h&]uh1j hjbubh)}(h**Description**h]j)}(hjbh]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjbubh)}(hReport the number of batches, correlated with, but not necessarily precisely the same as, the number of grace periods that have elapsed.h]hReport the number of batches, correlated with, but not necessarily precisely the same as, the number of grace periods that have elapsed.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:409: ./kernel/rcu/srcutree.chMhjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j hlist_bl_del_rcu (C function)c.hlist_bl_del_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h/void hlist_bl_del_rcu (struct hlist_bl_node *n)h]j)}(h.void hlist_bl_del_rcu(struct hlist_bl_node *n)h](j )}(hvoidh]hvoid}(hj%chhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj!chhh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhK&ubj2)}(h h]h }(hj4chhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj!chhhj3chK&ubj{)}(hhlist_bl_del_rcuh]j)}(hhlist_bl_del_rcuh]hhlist_bl_del_rcu}(hjFchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBcubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj!chhhj3chK&ubj)}(h(struct hlist_bl_node *n)h]j)}(hstruct hlist_bl_node *nh](j)}(hjAh]hstruct}(hjbchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^cubj2)}(h h]h }(hjochhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^cubh)}(hhh]j)}(h hlist_bl_nodeh]h hlist_bl_node}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}cubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjcmodnameN classnameNj] j` )}jc ]jf )}jY jHcsbc.hlist_bl_del_rcuasbuh1hhj^cubj2)}(h h]h }(hjchhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj^cubj)}(hjh]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^cubj)}(hjh]hn}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^cubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjZcubah}(h]h ]h"]h$]h&]jjuh1jhj!chhhj3chK&ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjchhhj3chK&ubah}(h]jcah ](jjeh"]h$]h&]jj)jhuh1jhj3chK&hjchhubj)}(hhh]h)}(h6deletes entry from hash list without re-initializationh]h6deletes entry from hash list without re-initialization}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhK&hjchhubah}(h]h ]h"]h$]h&]uh1jhjchhhj3chK&ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjcjjcjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct hlist_bl_node *n`` the element to delete from the hash list. **Note** hlist_bl_unhashed() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal. In particular, it means that we can not poison the forward pointers that may still be used for walking the hash list. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_bl_add_head_rcu() or hlist_bl_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_bl_for_each_entry().h](h)}(h**Parameters**h]j)}(hjdh]h Parameters}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhK*hjdubj )}(hhh]j)}(hF``struct hlist_bl_node *n`` the element to delete from the hash list. h](j)}(h``struct hlist_bl_node *n``h]j)}(hj%dh]hstruct hlist_bl_node *n}(hj'dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#dubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhK'hjdubj2)}(hhh]h)}(h)the element to delete from the hash list.h]h)the element to delete from the hash list.}(hj>dhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:dhK'hj;dubah}(h]h ]h"]h$]h&]uh1j1hjdubeh}(h]h ]h"]h$]h&]uh1jhj:dhK'hjdubah}(h]h ]h"]h$]h&]uh1j hjdubh)}(h**Note**h]j)}(hj`dh]hNote}(hjbdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^dubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhK)hjdubh)}(hhlist_bl_unhashed() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal.h]hhlist_bl_unhashed() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal.}(hjvdhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhK)hjdubh)}(huIn particular, it means that we can not poison the forward pointers that may still be used for walking the hash list.h]huIn particular, it means that we can not poison the forward pointers that may still be used for walking the hash list.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhK-hjdubh)}(hXbThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_bl_add_head_rcu() or hlist_bl_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_bl_for_each_entry().h]hXbThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_bl_add_head_rcu() or hlist_bl_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_bl_for_each_entry().}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhK0hjdubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "hlist_bl_add_head_rcu (C function)c.hlist_bl_add_head_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hMvoid hlist_bl_add_head_rcu (struct hlist_bl_node *n, struct hlist_bl_head *h)h]j)}(hLvoid hlist_bl_add_head_rcu(struct hlist_bl_node *n, struct hlist_bl_head *h)h](j )}(hvoidh]hvoid}(hjdhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjdhhh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhK?ubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdhhhjdhK?ubj{)}(hhlist_bl_add_head_rcuh]j)}(hhlist_bl_add_head_rcuh]hhlist_bl_add_head_rcu}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjdhhhjdhK?ubj)}(h2(struct hlist_bl_node *n, struct hlist_bl_head *h)h](j)}(hstruct hlist_bl_node *nh](j)}(hjAh]hstruct}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj2)}(h h]h }(hj ehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubh)}(hhh]j)}(h hlist_bl_nodeh]h hlist_bl_node}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj emodnameN classnameNj] j` )}jc ]jf )}jY jdsbc.hlist_bl_add_head_rcuasbuh1hhjdubj2)}(h h]h }(hj>ehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdubj)}(hjh]h*}(hjLehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hjh]hn}(hjYehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjdubj)}(hstruct hlist_bl_head *hh](j)}(hjAh]hstruct}(hjqehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmeubj2)}(h h]h }(hj~ehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjmeubh)}(hhh]j)}(h hlist_bl_headh]h hlist_bl_head}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjemodnameN classnameNj] j` )}jc ]j:ec.hlist_bl_add_head_rcuasbuh1hhjmeubj2)}(h h]h }(hjehhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjmeubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmeubj)}(hhh]hh}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmeubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjdubeh}(h]h ]h"]h$]h&]jjuh1jhjdhhhjdhK?ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjdhhhjdhK?ubah}(h]jdah ](jjeh"]h$]h&]jj)jhuh1jhjdhK?hjdhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjdhhhjdhK?ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjejjejjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct hlist_bl_node *n`` the element to add to the hash list. ``struct hlist_bl_head *h`` the list to add to. **Description** Adds the specified element to the specified hlist_bl, while permitting racing traversals. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_bl_add_head_rcu() or hlist_bl_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_bl_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().h](h)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKChjeubj )}(hhh](j)}(hA``struct hlist_bl_node *n`` the element to add to the hash list. h](j)}(h``struct hlist_bl_node *n``h]j)}(hj$fh]hstruct hlist_bl_node *n}(hj&fhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"fubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhK@hjfubj2)}(hhh]h)}(h$the element to add to the hash list.h]h$the element to add to the hash list.}(hj=fhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9fhK@hj:fubah}(h]h ]h"]h$]h&]uh1j1hjfubeh}(h]h ]h"]h$]h&]uh1jhj9fhK@hjfubj)}(h0``struct hlist_bl_head *h`` the list to add to. h](j)}(h``struct hlist_bl_head *h``h]j)}(hj]fh]hstruct hlist_bl_head *h}(hj_fhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[fubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKAhjWfubj2)}(hhh]h)}(hthe list to add to.h]hthe list to add to.}(hjvfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrfhKAhjsfubah}(h]h ]h"]h$]h&]uh1j1hjWfubeh}(h]h ]h"]h$]h&]uh1jhjrfhKAhjfubeh}(h]h ]h"]h$]h&]uh1j hjeubh)}(h**Description**h]j)}(hjfh]h Description}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKChjeubh)}(hYAdds the specified element to the specified hlist_bl, while permitting racing traversals.h]hYAdds the specified element to the specified hlist_bl, while permitting racing traversals.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKChjeubh)}(hXThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_bl_add_head_rcu() or hlist_bl_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_bl_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().h]hXThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_bl_add_head_rcu() or hlist_bl_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_bl_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKFhjeubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %hlist_bl_for_each_entry_rcu (C macro)c.hlist_bl_for_each_entry_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hhlist_bl_for_each_entry_rcuh]j)}(hhlist_bl_for_each_entry_rcuh]j{)}(hhlist_bl_for_each_entry_rcuh]j)}(hjfh]hhlist_bl_for_each_entry_rcu}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjfhhh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKbubah}(h]h ]h"]h$]h&]jjjuh1jjjhjfhhhjghKbubah}(h]jfah ](jjeh"]h$]h&]jj)jhuh1jhjghKbhjfhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjfhhhjghKbubeh}(h]h ](jmacroeh"]h$]h&]jjjjgjjgjjjuh1jhhhjhNhNubh)}(h9``hlist_bl_for_each_entry_rcu (tpos, pos, head, member)``h]j)}(hj"gh]h5hlist_bl_for_each_entry_rcu (tpos, pos, head, member)}(hj$ghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj gubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKdhjhhubj)}(h$iterate over rcu list of given type h]h)}(h#iterate over rcu list of given typeh]h#iterate over rcu list of given type}(hj` to use as a loop cursor. ``head`` the head for your list. ``member`` the name of the hlist_bl_node within the struct.h](h)}(h**Parameters**h]j)}(hjWgh]h Parameters}(hjYghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUgubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKfhjQgubj )}(hhh](j)}(h-``tpos`` the type * to use as a loop cursor. h](j)}(h``tpos``h]j)}(hjvgh]htpos}(hjxghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtgubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hBhKchjpgubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghKchjgubah}(h]h ]h"]h$]h&]uh1j1hjpgubeh}(h]h ]h"]h$]h&]uh1jhjghKchjmgubj)}(hT``pos`` the :c:type:`struct hlist_bl_node ` to use as a loop cursor. h](j)}(h``pos``h]j)}(hjgh]hpos}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKdhjgubj2)}(hhh]h)}(hKthe :c:type:`struct hlist_bl_node ` to use as a loop cursor.h](hthe }(hjghhhNhNubh)}(h.:c:type:`struct hlist_bl_node `h]j)}(hjgh]hstruct hlist_bl_node}(hjghhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jj hlist_bl_nodeuh1hhjghKdhjgubh to use as a loop cursor.}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjghKdhjgubah}(h]h ]h"]h$]h&]uh1j1hjgubeh}(h]h ]h"]h$]h&]uh1jhjghKdhjmgubj)}(h!``head`` the head for your list. h](j)}(h``head``h]j)}(hj hh]hhead}(hj hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKehjhubj2)}(hhh]h)}(hthe head for your list.h]hthe head for your list.}(hj$hhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhKehj!hubah}(h]h ]h"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]uh1jhj hhKehjmgubj)}(h;``member`` the name of the hlist_bl_node within the struct.h](j)}(h ``member``h]j)}(hjDhh]hmember}(hjFhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBhubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKghj>hubj2)}(hhh]h)}(h0the name of the hlist_bl_node within the struct.h]h0the name of the hlist_bl_node within the struct.}(hj]hhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKfhjZhubah}(h]h ]h"]h$]h&]uh1j1hj>hubeh}(h]h ]h"]h$]h&]uh1jhjYhhKghjmgubeh}(h]h ]h"]h$]h&]uh1j hjQgubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j .hlist_bl_for_each_entry_continue_rcu (C macro)&c.hlist_bl_for_each_entry_continue_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h$hlist_bl_for_each_entry_continue_rcuh]j)}(h$hlist_bl_for_each_entry_continue_rcuh]j{)}(h$hlist_bl_for_each_entry_continue_rcuh]j)}(hjhh]h$hlist_bl_for_each_entry_continue_rcu}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKpubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhhjhhKpubah}(h]jhah ](jjeh"]h$]h&]jj)jhuh1jhjhhKphjhhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhhjhhKpubeh}(h]h ](jmacroeh"]h$]h&]jjjjhjjhjjjuh1jhhhjhNhNubh)}(h<``hlist_bl_for_each_entry_continue_rcu (tpos, pos, member)``h]j)}(hjhh]h8hlist_bl_for_each_entry_continue_rcu (tpos, pos, member)}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKrhjhhubj)}(h+continue iteration over list of given type h]h)}(h*continue iteration over list of given typeh]h*continue iteration over list of given type}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKphjhubah}(h]h ]h"]h$]h&]uh1jhjhhKphjhhubj)}(hX~**Parameters** ``tpos`` the type * to use as a loop cursor. ``pos`` the :c:type:`struct hlist_bl_node ` to use as a loop cursor. ``member`` the name of the hlist_bl_node within the struct. **Description** Continue to iterate over list of given type, continuing after the current position which must have been in the list when the RCU read lock was taken. This would typically require either that you obtained the node from a previous walk of the list in the same RCU read-side critical section, or that you held some sort of non-RCU reference (such as a reference count) to keep the node alive *and* in the list.h](h)}(h**Parameters**h]j)}(hj ih]h Parameters}(hj ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKthjiubj )}(hhh](j)}(h-``tpos`` the type * to use as a loop cursor. h](j)}(h``tpos``h]j)}(hj(ih]htpos}(hj*ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&iubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKrhj"iubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjAihhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=ihKrhj>iubah}(h]h ]h"]h$]h&]uh1j1hj"iubeh}(h]h ]h"]h$]h&]uh1jhj=ihKrhjiubj)}(hT``pos`` the :c:type:`struct hlist_bl_node ` to use as a loop cursor. h](j)}(h``pos``h]j)}(hjaih]hpos}(hjcihhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_iubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKshj[iubj2)}(hhh]h)}(hKthe :c:type:`struct hlist_bl_node ` to use as a loop cursor.h](hthe }(hjzihhhNhNubh)}(h.:c:type:`struct hlist_bl_node `h]j)}(hjih]hstruct hlist_bl_node}(hjihhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jj hlist_bl_nodeuh1hhjvihKshjziubh to use as a loop cursor.}(hjzihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjvihKshjwiubah}(h]h ]h"]h$]h&]uh1j1hj[iubeh}(h]h ]h"]h$]h&]uh1jhjvihKshjiubj)}(h<``member`` the name of the hlist_bl_node within the struct. h](j)}(h ``member``h]j)}(hjih]hmember}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKthjiubj2)}(hhh]h)}(h0the name of the hlist_bl_node within the struct.h]h0the name of the hlist_bl_node within the struct.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihKthjiubah}(h]h ]h"]h$]h&]uh1j1hjiubeh}(h]h ]h"]h$]h&]uh1jhjihKthjiubeh}(h]h ]h"]h$]h&]uh1j hjiubh)}(h**Description**h]j)}(hjih]h Description}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKvhjiubh)}(hXContinue to iterate over list of given type, continuing after the current position which must have been in the list when the RCU read lock was taken. This would typically require either that you obtained the node from a previous walk of the list in the same RCU read-side critical section, or that you held some sort of non-RCU reference (such as a reference count) to keep the node alive *and* in the list.h](hXContinue to iterate over list of given type, continuing after the current position which must have been in the list when the RCU read lock was taken. This would typically require either that you obtained the node from a previous walk of the list in the same RCU read-side critical section, or that you held some sort of non-RCU reference (such as a reference count) to keep the node alive }(hjjhhhNhNubj)}(h*and*h]hand}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubh in the list.}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:411: ./include/linux/rculist_bl.hhKuhjiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j list_for_each_rcu (C macro)c.list_for_each_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hlist_for_each_rcuh]j)}(hlist_for_each_rcuh]j{)}(hlist_for_each_rcuh]j)}(hjIjh]hlist_for_each_rcu}(hjSjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjKjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhK.ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjGjhhhjfjhK.ubah}(h]jBjah ](jjeh"]h$]h&]jj)jhuh1jhjfjhK.hjDjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjDjhhhjfjhK.ubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjjjuh1jhhhjhNhNubh)}(h!``list_for_each_rcu (pos, head)``h]j)}(hjjh]hlist_for_each_rcu (pos, head)}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhK0hjhhubj)}(h+Iterate over a list in an RCU-safe fashion h]h)}(h*Iterate over a list in an RCU-safe fashionh]h*Iterate over a list in an RCU-safe fashion}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhK.hjjubah}(h]h ]h"]h$]h&]uh1jhjjhK.hjhhubj)}(h**Parameters** ``pos`` the :c:type:`struct list_head ` to use as a loop cursor. ``head`` the head for your list.h](h)}(h**Parameters**h]j)}(hjjh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhK2hjjubj )}(hhh](j)}(hL``pos`` the :c:type:`struct list_head ` to use as a loop cursor. h](j)}(h``pos``h]j)}(hjjh]hpos}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhK/hjjubj2)}(hhh]h)}(hCthe :c:type:`struct list_head ` to use as a loop cursor.h](hthe }(hjjhhhNhNubh)}(h&:c:type:`struct list_head `h]j)}(hjjh]hstruct list_head}(hjjhhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jj list_headuh1hhjjhK/hjjubh to use as a loop cursor.}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjjhK/hjjubah}(h]h ]h"]h$]h&]uh1j1hjjubeh}(h]h ]h"]h$]h&]uh1jhjjhK/hjjubj)}(h ``head`` the head for your list.h](j)}(h``head``h]j)}(hj5kh]hhead}(hj7khhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3kubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhK1hj/kubj2)}(hhh]h)}(hthe head for your list.h]hthe head for your list.}(hjNkhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhK0hjKkubah}(h]h ]h"]h$]h&]uh1j1hj/kubeh}(h]h ]h"]h$]h&]uh1jhjJkhK1hjjubeh}(h]h ]h"]h$]h&]uh1j hjjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j list_tail_rcu (C macro)c.list_tail_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h list_tail_rcuh]j)}(h list_tail_rcuh]j{)}(h list_tail_rcuh]j)}(hjkh]h list_tail_rcu}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjkhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhK8ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjkhhhjkhK8ubah}(h]jkah ](jjeh"]h$]h&]jj)jhuh1jhjkhK8hjkhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjkhhhjkhK8ubeh}(h]h ](jmacroeh"]h$]h&]jjjjkjjkjjjuh1jhhhjhNhNubh)}(h``list_tail_rcu (head)``h]j)}(hjkh]hlist_tail_rcu (head)}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhK:hjhhubj)}(h1returns the prev pointer of the head of the list h]h)}(h0returns the prev pointer of the head of the listh]h0returns the prev pointer of the head of the list}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhK8hjkubah}(h]h ]h"]h$]h&]uh1jhjkhK8hjhhubj)}(h**Parameters** ``head`` the head of the list **Note** This should only be used with the list header, and even then only if list_del() and similar primitives are not also used on the list header.h](h)}(h**Parameters**h]j)}(hjkh]h Parameters}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKah"]h$]h&]uh1j1hjlhhhjlhKnubj{)}(h list_add_rcuh]j)}(h list_add_rcuh]h list_add_rcu}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjlhhhjlhKnubj)}(h/(struct list_head *new, struct list_head *head)h](j)}(hstruct list_head *newh](j)}(hjAh]hstruct}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj2)}(h h]h }(hjlhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubh)}(hhh]j)}(h list_headh]h list_head}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjlmodnameN classnameNj] j` )}jc ]jf )}jY jlsbc.list_add_rcuasbuh1hhjlubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjlubj)}(hjh]h*}(hj"mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hnewh]hnew}(hj/mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjlubj)}(hstruct list_head *headh](j)}(hjAh]hstruct}(hjHmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDmubj2)}(h h]h }(hjUmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDmubh)}(hhh]j)}(h list_headh]h list_head}(hjfmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcmubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjhmmodnameN classnameNj] j` )}jc ]jmc.list_add_rcuasbuh1hhjDmubj2)}(h h]h }(hjmhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDmubj)}(hjh]h*}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDmubj)}(hheadh]hhead}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDmubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjlubeh}(h]h ]h"]h$]h&]jjuh1jhjlhhhjlhKnubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjlhhhjlhKnubah}(h]jlah ](jjeh"]h$]h&]jj)jhuh1jhjlhKnhjlhhubj)}(hhh]h)}(h%add a new entry to rcu-protected listh]h%add a new entry to rcu-protected list}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKnhjmhhubah}(h]h ]h"]h$]h&]uh1jhjlhhhjlhKnubeh}(h]h ](jfunctioneh"]h$]h&]jjjjmjjmjjjuh1jhhhjhNhNubj)}(hX5**Parameters** ``struct list_head *new`` new entry to be added ``struct list_head *head`` list head to add it after **Description** Insert a new entry after the specified head. This is good for implementing stacks. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_add_rcu() or list_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu().h](h)}(h**Parameters**h]j)}(hjmh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKrhjmubj )}(hhh](j)}(h0``struct list_head *new`` new entry to be added h](j)}(h``struct list_head *new``h]j)}(hj nh]hstruct list_head *new}(hj nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKohjnubj2)}(hhh]h)}(hnew entry to be addedh]hnew entry to be added}(hj#nhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhKohj nubah}(h]h ]h"]h$]h&]uh1j1hjnubeh}(h]h ]h"]h$]h&]uh1jhjnhKohjnubj)}(h5``struct list_head *head`` list head to add it after h](j)}(h``struct list_head *head``h]j)}(hjCnh]hstruct list_head *head}(hjEnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAnubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKphj=nubj2)}(hhh]h)}(hlist head to add it afterh]hlist head to add it after}(hj\nhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXnhKphjYnubah}(h]h ]h"]h$]h&]uh1j1hj=nubeh}(h]h ]h"]h$]h&]uh1jhjXnhKphjnubeh}(h]h ]h"]h$]h&]uh1j hjmubh)}(h**Description**h]j)}(hj~nh]h Description}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|nubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKrhjmubh)}(hRInsert a new entry after the specified head. This is good for implementing stacks.h]hRInsert a new entry after the specified head. This is good for implementing stacks.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKqhjmubh)}(hXUThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_add_rcu() or list_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu().h]hXUThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_add_rcu() or list_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu().}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKthjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j list_add_tail_rcu (C function)c.list_add_tail_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hFvoid list_add_tail_rcu (struct list_head *new, struct list_head *head)h]j)}(hEvoid list_add_tail_rcu(struct list_head *new, struct list_head *head)h](j )}(hvoidh]hvoid}(hjnhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjnhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKubj2)}(h h]h }(hjnhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjnhhhjnhKubj{)}(hlist_add_tail_rcuh]j)}(hlist_add_tail_rcuh]hlist_add_tail_rcu}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjnhhhjnhKubj)}(h/(struct list_head *new, struct list_head *head)h](j)}(hstruct list_head *newh](j)}(hjAh]hstruct}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj oubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj oubh)}(hhh]j)}(h list_headh]h list_head}(hj-ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*oubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj/omodnameN classnameNj] j` )}jc ]jf )}jY jnsbc.list_add_tail_rcuasbuh1hhj oubj2)}(h h]h }(hjMohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj oubj)}(hjh]h*}(hj[ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj oubj)}(hnewh]hnew}(hjhohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj oubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjoubj)}(hstruct list_head *headh](j)}(hjAh]hstruct}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}oubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}oubh)}(hhh]j)}(h list_headh]h list_head}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjomodnameN classnameNj] j` )}jc ]jIoc.list_add_tail_rcuasbuh1hhj}oubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}oubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}oubj)}(hheadh]hhead}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}oubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjoubeh}(h]h ]h"]h$]h&]jjuh1jhjnhhhjnhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjnhhhjnhKubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1jhjnhKhjnhhubj)}(hhh]h)}(h%add a new entry to rcu-protected listh]h%add a new entry to rcu-protected list}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjohhubah}(h]h ]h"]h$]h&]uh1jhjnhhhjnhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjpjjpjjjuh1jhhhjhNhNubj)}(hX>**Parameters** ``struct list_head *new`` new entry to be added ``struct list_head *head`` list head to add it before **Description** Insert a new entry before the specified head. This is useful for implementing queues. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_add_tail_rcu() or list_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu().h](h)}(h**Parameters**h]j)}(hj$ph]h Parameters}(hj&phhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"pubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjpubj )}(hhh](j)}(h0``struct list_head *new`` new entry to be added h](j)}(h``struct list_head *new``h]j)}(hjCph]hstruct list_head *new}(hjEphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjApubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhj=pubj2)}(hhh]h)}(hnew entry to be addedh]hnew entry to be added}(hj\phhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXphKhjYpubah}(h]h ]h"]h$]h&]uh1j1hj=pubeh}(h]h ]h"]h$]h&]uh1jhjXphKhj:pubj)}(h6``struct list_head *head`` list head to add it before h](j)}(h``struct list_head *head``h]j)}(hj|ph]hstruct list_head *head}(hj~phhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzpubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjvpubj2)}(hhh]h)}(hlist head to add it beforeh]hlist head to add it before}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphKhjpubah}(h]h ]h"]h$]h&]uh1j1hjvpubeh}(h]h ]h"]h$]h&]uh1jhjphKhj:pubeh}(h]h ]h"]h$]h&]uh1j hjpubh)}(h**Description**h]j)}(hjph]h Description}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjpubh)}(hUInsert a new entry before the specified head. This is useful for implementing queues.h]hUInsert a new entry before the specified head. This is useful for implementing queues.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjpubh)}(hXZThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_add_tail_rcu() or list_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu().h]hXZThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_add_tail_rcu() or list_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu().}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j list_del_rcu (C function)c.list_del_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h+void list_del_rcu (struct list_head *entry)h]j)}(h*void list_del_rcu(struct list_head *entry)h](j )}(hvoidh]hvoid}(hj qhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjqhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqhhhjqhKubj{)}(h list_del_rcuh]j)}(h list_del_rcuh]h list_del_rcu}(hj,qhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(qubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjqhhhjqhKubj)}(h(struct list_head *entry)h]j)}(hstruct list_head *entryh](j)}(hjAh]hstruct}(hjHqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDqubj2)}(h h]h }(hjUqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDqubh)}(hhh]j)}(h list_headh]h list_head}(hjfqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcqubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjhqmodnameN classnameNj] j` )}jc ]jf )}jY j.qsbc.list_del_rcuasbuh1hhjDqubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDqubj)}(hjh]h*}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDqubj)}(hentryh]hentry}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDqubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj@qubah}(h]h ]h"]h$]h&]jjuh1jhjqhhhjqhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjqhhhjqhKubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1jhjqhKhjqhhubj)}(hhh]h)}(h1deletes entry from list without re-initializationh]h1deletes entry from list without re-initialization}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjqhhubah}(h]h ]h"]h$]h&]uh1jhjqhhhjqhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjqjjqjjjuh1jhhhjhNhNubj)}(hXz**Parameters** ``struct list_head *entry`` the element to delete from the list. **Note** list_empty() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal. In particular, it means that we can not poison the forward pointers that may still be used for walking the list. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_del_rcu() or list_add_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu(). Note that the caller is not permitted to immediately free the newly deleted entry. Instead, either synchronize_rcu() or call_rcu() must be used to defer freeing until an RCU grace period has elapsed.h](h)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjqubj )}(hhh]j)}(hA``struct list_head *entry`` the element to delete from the list. h](j)}(h``struct list_head *entry``h]j)}(hj rh]hstruct list_head *entry}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj rubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjrubj2)}(hhh]h)}(h$the element to delete from the list.h]h$the element to delete from the list.}(hj%rhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!rhKhj"rubah}(h]h ]h"]h$]h&]uh1j1hjrubeh}(h]h ]h"]h$]h&]uh1jhj!rhKhjrubah}(h]h ]h"]h$]h&]uh1j hjqubh)}(h**Note**h]j)}(hjGrh]hNote}(hjIrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjErubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjqubh)}(hlist_empty() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal.h]hlist_empty() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal.}(hj]rhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjqubh)}(hpIn particular, it means that we can not poison the forward pointers that may still be used for walking the list.h]hpIn particular, it means that we can not poison the forward pointers that may still be used for walking the list.}(hjlrhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjqubh)}(hXUThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_del_rcu() or list_add_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu().h]hXUThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_del_rcu() or list_add_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu().}(hj{rhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjqubh)}(hNote that the caller is not permitted to immediately free the newly deleted entry. Instead, either synchronize_rcu() or call_rcu() must be used to defer freeing until an RCU grace period has elapsed.h]hNote that the caller is not permitted to immediately free the newly deleted entry. Instead, either synchronize_rcu() or call_rcu() must be used to defer freeing until an RCU grace period has elapsed.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjqubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j list_bidir_del_rcu (C function)c.list_bidir_del_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h1void list_bidir_del_rcu (struct list_head *entry)h]j)}(h0void list_bidir_del_rcu(struct list_head *entry)h](j )}(hvoidh]hvoid}(hjrhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjrhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKubj2)}(h h]h }(hjrhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrhhhjrhKubj{)}(hlist_bidir_del_rcuh]j)}(hlist_bidir_del_rcuh]hlist_bidir_del_rcu}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjrhhhjrhKubj)}(h(struct list_head *entry)h]j)}(hstruct list_head *entryh](j)}(hjAh]hstruct}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj2)}(h h]h }(hjshhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubh)}(hhh]j)}(h list_headh]h list_head}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjsmodnameN classnameNj] j` )}jc ]jf )}jY jrsbc.list_bidir_del_rcuasbuh1hhjrubj2)}(h h]h }(hj4shhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(hjh]h*}(hjBshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hentryh]hentry}(hjOshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjrubah}(h]h ]h"]h$]h&]jjuh1jhjrhhhjrhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjrhhhjrhKubah}(h]jrah ](jjeh"]h$]h&]jj)jhuh1jhjrhKhjrhhubj)}(hhh]h)}(h1deletes entry from list without re-initializationh]h1deletes entry from list without re-initialization}(hjyshhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjvshhubah}(h]h ]h"]h$]h&]uh1jhjrhhhjrhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjsjjsjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct list_head *entry`` the element to delete from the list. **Description** In contrast to list_del_rcu() doesn't poison the prev pointer thus allowing backwards traversal via list_bidir_prev_rcu(). **Note** list_empty() on entry does not return true after this because the entry is in a special undefined state that permits RCU-based lockfree reverse traversal. In particular this means that we can not poison the forward and backwards pointers that may still be used for walking the list. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_bidir_del_rcu() or list_add_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu(). Note that list_del_rcu() and list_bidir_del_rcu() must not be used on the same list. Note that the caller is not permitted to immediately free the newly deleted entry. Instead, either synchronize_rcu() or call_rcu() must be used to defer freeing until an RCU grace period has elapsed.h](h)}(h**Parameters**h]j)}(hjsh]h Parameters}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjsubj )}(hhh]j)}(hA``struct list_head *entry`` the element to delete from the list. h](j)}(h``struct list_head *entry``h]j)}(hjsh]hstruct list_head *entry}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjsubj2)}(hhh]h)}(h$the element to delete from the list.h]h$the element to delete from the list.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshKhjsubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjshKhjsubah}(h]h ]h"]h$]h&]uh1j hjsubh)}(h**Description**h]j)}(hjsh]h Description}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjsubh)}(hzIn contrast to list_del_rcu() doesn't poison the prev pointer thus allowing backwards traversal via list_bidir_prev_rcu().h]h|In contrast to list_del_rcu() doesn’t poison the prev pointer thus allowing backwards traversal via list_bidir_prev_rcu().}(hj thhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjsubh)}(h**Note**h]j)}(hjth]hNote}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjsubh)}(hXlist_empty() on entry does not return true after this because the entry is in a special undefined state that permits RCU-based lockfree reverse traversal. In particular this means that we can not poison the forward and backwards pointers that may still be used for walking the list.h]hXlist_empty() on entry does not return true after this because the entry is in a special undefined state that permits RCU-based lockfree reverse traversal. In particular this means that we can not poison the forward and backwards pointers that may still be used for walking the list.}(hj2thhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjsubh)}(hX[The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_bidir_del_rcu() or list_add_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu().h]hX[The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as list_bidir_del_rcu() or list_add_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as list_for_each_entry_rcu().}(hjAthhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjsubh)}(hTNote that list_del_rcu() and list_bidir_del_rcu() must not be used on the same list.h]hTNote that list_del_rcu() and list_bidir_del_rcu() must not be used on the same list.}(hjPthhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjsubh)}(hNote that the caller is not permitted to immediately free the newly deleted entry. Instead, either synchronize_rcu() or call_rcu() must be used to defer freeing until an RCU grace period has elapsed.h]hNote that the caller is not permitted to immediately free the newly deleted entry. Instead, either synchronize_rcu() or call_rcu() must be used to defer freeing until an RCU grace period has elapsed.}(hj_thhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjsubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j hlist_del_init_rcu (C function)c.hlist_del_init_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h.void hlist_del_init_rcu (struct hlist_node *n)h]j)}(h-void hlist_del_init_rcu(struct hlist_node *n)h](j )}(hvoidh]hvoid}(hjthhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjthhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjthhhjthKubj{)}(hhlist_del_init_rcuh]j)}(hhlist_del_init_rcuh]hhlist_del_init_rcu}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjthhhjthKubj)}(h(struct hlist_node *n)h]j)}(hstruct hlist_node *nh](j)}(hjAh]hstruct}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj2)}(h h]h }(hjthhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubh)}(hhh]j)}(h hlist_nodeh]h hlist_node}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]jf )}jY jtsbc.hlist_del_init_rcuasbuh1hhjtubj2)}(h h]h }(hj uhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjtubj)}(hjh]h*}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(hjh]hn}(hj$uhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjtubah}(h]h ]h"]h$]h&]jjuh1jhjthhhjthKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjthhhjthKubah}(h]jtah ](jjeh"]h$]h&]jj)jhuh1jhjthKhjthhubj)}(hhh]h)}(h3deletes entry from hash list with re-initializationh]h3deletes entry from hash list with re-initialization}(hjMuhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjJuhhubah}(h]h ]h"]h$]h&]uh1jhjthhhjthKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjeujjeujjjuh1jhhhjhNhNubj)}(hXG**Parameters** ``struct hlist_node *n`` the element to delete from the hash list. **Note** list_unhashed() on the node return true after this. It is useful for RCU based read lockfree traversal if the writer side must know if the list entry is still hashed or already unhashed. In particular, it means that we can not poison the forward pointers that may still be used for walking the hash list and we can only zero the pprev pointer so list_unhashed() will return true after this. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu().h](h)}(h**Parameters**h]j)}(hjouh]h Parameters}(hjquhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmuubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjiuubj )}(hhh]j)}(hC``struct hlist_node *n`` the element to delete from the hash list. h](j)}(h``struct hlist_node *n``h]j)}(hjuh]hstruct hlist_node *n}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjuubj2)}(hhh]h)}(h)the element to delete from the hash list.h]h)the element to delete from the hash list.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhKhjuubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjuhKhjuubah}(h]h ]h"]h$]h&]uh1j hjiuubh)}(h**Note**h]j)}(hjuh]hNote}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjiuubh)}(hlist_unhashed() on the node return true after this. It is useful for RCU based read lockfree traversal if the writer side must know if the list entry is still hashed or already unhashed.h]hlist_unhashed() on the node return true after this. It is useful for RCU based read lockfree traversal if the writer side must know if the list entry is still hashed or already unhashed.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjiuubh)}(hIn particular, it means that we can not poison the forward pointers that may still be used for walking the hash list and we can only zero the pprev pointer so list_unhashed() will return true after this.h]hIn particular, it means that we can not poison the forward pointers that may still be used for walking the hash list and we can only zero the pprev pointer so list_unhashed() will return true after this.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjiuubh)}(hX^The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu().h]hX^The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu().}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjiuubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j list_replace_rcu (C function)c.list_replace_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hDvoid list_replace_rcu (struct list_head *old, struct list_head *new)h]j)}(hCvoid list_replace_rcu(struct list_head *old, struct list_head *new)h](j )}(hvoidh]hvoid}(hj,vhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj(vhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKubj2)}(h h]h }(hj;vhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(vhhhj:vhKubj{)}(hlist_replace_rcuh]j)}(hlist_replace_rcuh]hlist_replace_rcu}(hjMvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIvubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj(vhhhj:vhKubj)}(h.(struct list_head *old, struct list_head *new)h](j)}(hstruct list_head *oldh](j)}(hjAh]hstruct}(hjivhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjevubj2)}(h h]h }(hjvvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjevubh)}(hhh]j)}(h list_headh]h list_head}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjvmodnameN classnameNj] j` )}jc ]jf )}jY jOvsbc.list_replace_rcuasbuh1hhjevubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjevubj)}(hjh]h*}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjevubj)}(holdh]hold}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjevubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjavubj)}(hstruct list_head *newh](j)}(hjAh]hstruct}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubh)}(hhh]j)}(h list_headh]h list_head}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjvmodnameN classnameNj] j` )}jc ]jvc.list_replace_rcuasbuh1hhjvubj2)}(h h]h }(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjvubj)}(hjh]h*}(hj%whhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj)}(hnewh]hnew}(hj2whhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjavubeh}(h]h ]h"]h$]h&]jjuh1jhj(vhhhj:vhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj$vhhhj:vhKubah}(h]jvah ](jjeh"]h$]h&]jj)jhuh1jhj:vhKhj!vhhubj)}(hhh]h)}(hreplace old entry by new oneh]hreplace old entry by new one}(hj\whhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjYwhhubah}(h]h ]h"]h$]h&]uh1jhj!vhhhj:vhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjtwjjtwjjjuh1jhhhjhNhNubj)}(hX|**Parameters** ``struct list_head *old`` the element to be replaced ``struct list_head *new`` the new element to insert **Description** The **old** entry will be replaced with the **new** entry atomically from the perspective of concurrent readers. It is the caller's responsibility to synchronize with concurrent updaters, if any. **Note** **old** should not be empty.h](h)}(h**Parameters**h]j)}(hj~wh]h Parameters}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|wubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjxwubj )}(hhh](j)}(h5``struct list_head *old`` the element to be replaced h](j)}(h``struct list_head *old``h]j)}(hjwh]hstruct list_head *old}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjwubj2)}(hhh]h)}(hthe element to be replacedh]hthe element to be replaced}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhKhjwubah}(h]h ]h"]h$]h&]uh1j1hjwubeh}(h]h ]h"]h$]h&]uh1jhjwhKhjwubj)}(h4``struct list_head *new`` the new element to insert h](j)}(h``struct list_head *new``h]j)}(hjwh]hstruct list_head *new}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjwubj2)}(hhh]h)}(hthe new element to inserth]hthe new element to insert}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhKhjwubah}(h]h ]h"]h$]h&]uh1j1hjwubeh}(h]h ]h"]h$]h&]uh1jhjwhKhjwubeh}(h]h ]h"]h$]h&]uh1j hjxwubh)}(h**Description**h]j)}(hjxh]h Description}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjxwubh)}(hThe **old** entry will be replaced with the **new** entry atomically from the perspective of concurrent readers. It is the caller's responsibility to synchronize with concurrent updaters, if any.h](hThe }(hj'xhhhNhNubj)}(h**old**h]hold}(hj/xhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'xubh! entry will be replaced with the }(hj'xhhhNhNubj)}(h**new**h]hnew}(hjAxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'xubh entry atomically from the perspective of concurrent readers. It is the caller’s responsibility to synchronize with concurrent updaters, if any.}(hj'xhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjxwubh)}(h**Note**h]j)}(hj\xh]hNote}(hj^xhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZxubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjxwubh)}(h**old** should not be empty.h](j)}(h**old**h]hold}(hjvxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrxubh should not be empty.}(hjrxhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhKhjxwubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j list_splice_rcu (C function)c.list_splice_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hEvoid list_splice_rcu (struct list_head *list, struct list_head *head)h]j)}(hDvoid list_splice_rcu(struct list_head *list, struct list_head *head)h](j )}(hvoidh]hvoid}(hjxhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjxhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubj2)}(h h]h }(hjxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxhhhjxhMubj{)}(hlist_splice_rcuh]j)}(hlist_splice_rcuh]hlist_splice_rcu}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjxhhhjxhMubj)}(h0(struct list_head *list, struct list_head *head)h](j)}(hstruct list_head *listh](j)}(hjAh]hstruct}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj2)}(h h]h }(hjxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubh)}(hhh]j)}(h list_headh]h list_head}(hj yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj ymodnameN classnameNj] j` )}jc ]jf )}jY jxsbc.list_splice_rcuasbuh1hhjxubj2)}(h h]h }(hj*yhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubj)}(hjh]h*}(hj8yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(hlisth]hlist}(hjEyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjxubj)}(hstruct list_head *headh](j)}(hjAh]hstruct}(hj^yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZyubj2)}(h h]h }(hjkyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZyubh)}(hhh]j)}(h list_headh]h list_head}(hj|yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyyubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj~ymodnameN classnameNj] j` )}jc ]j&yc.list_splice_rcuasbuh1hhjZyubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjZyubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZyubj)}(hheadh]hhead}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZyubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjxubeh}(h]h ]h"]h$]h&]jjuh1jhjxhhhjxhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjxhhhjxhMubah}(h]jxah ](jjeh"]h$]h&]jj)jhuh1jhjxhMhjxhhubj)}(hhh]h)}(hFsplice a non-RCU list into an RCU-protected list, designed for stacks.h]hFsplice a non-RCU list into an RCU-protected list, designed for stacks.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjyhhubah}(h]h ]h"]h$]h&]uh1jhjxhhhjxhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjyjjyjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct list_head *list`` the non RCU-protected list to splice ``struct list_head *head`` the place in the existing RCU-protected list to splice **Description** The list pointed to by **head** can be RCU-read traversed concurrently with this function.'h](h)}(h**Parameters**h]j)}(hjzh]h Parameters}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjyubj )}(hhh](j)}(h@``struct list_head *list`` the non RCU-protected list to splice h](j)}(h``struct list_head *list``h]j)}(hj zh]hstruct list_head *list}(hj"zhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjzubj2)}(hhh]h)}(h$the non RCU-protected list to spliceh]h$the non RCU-protected list to splice}(hj9zhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5zhMhj6zubah}(h]h ]h"]h$]h&]uh1j1hjzubeh}(h]h ]h"]h$]h&]uh1jhj5zhMhjzubj)}(hR``struct list_head *head`` the place in the existing RCU-protected list to splice h](j)}(h``struct list_head *head``h]j)}(hjYzh]hstruct list_head *head}(hj[zhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWzubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjSzubj2)}(hhh]h)}(h6the place in the existing RCU-protected list to spliceh]h6the place in the existing RCU-protected list to splice}(hjrzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnzhMhjozubah}(h]h ]h"]h$]h&]uh1j1hjSzubeh}(h]h ]h"]h$]h&]uh1jhjnzhMhjzubeh}(h]h ]h"]h$]h&]uh1j hjyubh)}(h**Description**h]j)}(hjzh]h Description}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjyubh)}(hZThe list pointed to by **head** can be RCU-read traversed concurrently with this function.h](hThe list pointed to by }(hjzhhhNhNubj)}(h**head**h]hhead}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubh; can be RCU-read traversed concurrently with this function.}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjyubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #__list_splice_init_rcu (C function)c.__list_splice_init_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hxvoid __list_splice_init_rcu (struct list_head *list, struct list_head *prev, struct list_head *next, void (*sync)(void))h]j)}(hwvoid __list_splice_init_rcu(struct list_head *list, struct list_head *prev, struct list_head *next, void (*sync)(void))h](j )}(hvoidh]hvoid}(hjzhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjzhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM&ubj2)}(h h]h }(hjzhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjzhhhjzhM&ubj{)}(h__list_splice_init_rcuh]j)}(h__list_splice_init_rcuh]h__list_splice_init_rcu}(hj {hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjzhhhjzhM&ubj)}(h\(struct list_head *list, struct list_head *prev, struct list_head *next, void (*sync)(void))h](j)}(hstruct list_head *listh](j)}(hjAh]hstruct}(hj({hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj${ubj2)}(h h]h }(hj5{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj${ubh)}(hhh]j)}(h list_headh]h list_head}(hjF{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC{ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjH{modnameN classnameNj] j` )}jc ]jf )}jY j{sbc.__list_splice_init_rcuasbuh1hhj${ubj2)}(h h]h }(hjf{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj${ubj)}(hjh]h*}(hjt{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj${ubj)}(hlisth]hlist}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj${ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj {ubj)}(hstruct list_head *prevh](j)}(hjAh]hstruct}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubh)}(hhh]j)}(h list_headh]h list_head}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj{modnameN classnameNj] j` )}jc ]jb{c.__list_splice_init_rcuasbuh1hhj{ubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj{ubj)}(hjh]h*}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(hprevh]hprev}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj {ubj)}(hstruct list_head *nexth](j)}(hjAh]hstruct}(hj |hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|ubh)}(hhh]j)}(h list_headh]h list_head}(hj(|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%|ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj*|modnameN classnameNj] j` )}jc ]jb{c.__list_splice_init_rcuasbuh1hhj|ubj2)}(h h]h }(hjF|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj|ubj)}(hjh]h*}(hjT|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hnexth]hnext}(hja|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj {ubj)}(hvoid (*sync)(void)h](j )}(hvoidh]hvoid}(hjz|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjv|ubj2)}(h h]h }(hj|hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjv|ubj)}(hj7h]h(}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv|ubj)}(hjh]h*}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv|ubj)}(hsynch]hsync}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv|ubj)}(hj:7h]h)}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv|ubj)}(hj7h]h(}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv|ubj )}(hvoidh]hvoid}(hj|hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjv|ubj)}(hj:7h]h)}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv|ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj {ubeh}(h]h ]h"]h$]h&]jjuh1jhjzhhhjzhM&ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjzhhhjzhM&ubah}(h]jzah ](jjeh"]h$]h&]jj)jhuh1jhjzhM&hjzhhubj)}(hhh]h)}(h1join an RCU-protected list into an existing list.h]h1join an RCU-protected list into an existing list.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM&hj }hhubah}(h]h ]h"]h$]h&]uh1jhjzhhhjzhM&ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj'}jj'}jjjuh1jhhhjhNhNubj)}(hXI**Parameters** ``struct list_head *list`` the RCU-protected list to splice ``struct list_head *prev`` points to the last element of the existing list ``struct list_head *next`` points to the first element of the existing list ``void (*sync)(void)`` synchronize_rcu, synchronize_rcu_expedited, ... **Description** The list pointed to by **prev** and **next** can be RCU-read traversed concurrently with this function. Note that this function blocks. Important note: the caller must take whatever action is necessary to prevent any other updates to the existing list. In principle, it is possible to modify the list as soon as sync() begins execution. If this sort of thing becomes necessary, an alternative version based on call_rcu() could be created. But only if -really- needed -- there is no shortage of RCU API members.h](h)}(h**Parameters**h]j)}(hj1}h]h Parameters}(hj3}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/}ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM*hj+}ubj )}(hhh](j)}(h<``struct list_head *list`` the RCU-protected list to splice h](j)}(h``struct list_head *list``h]j)}(hjP}h]hstruct list_head *list}(hjR}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN}ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM'hjJ}ubj2)}(hhh]h)}(h the RCU-protected list to spliceh]h the RCU-protected list to splice}(hji}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhje}hM'hjf}ubah}(h]h ]h"]h$]h&]uh1j1hjJ}ubeh}(h]h ]h"]h$]h&]uh1jhje}hM'hjG}ubj)}(hK``struct list_head *prev`` points to the last element of the existing list h](j)}(h``struct list_head *prev``h]j)}(hj}h]hstruct list_head *prev}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM(hj}ubj2)}(hhh]h)}(h/points to the last element of the existing listh]h/points to the last element of the existing list}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hM(hj}ubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhj}hM(hjG}ubj)}(hL``struct list_head *next`` points to the first element of the existing list h](j)}(h``struct list_head *next``h]j)}(hj}h]hstruct list_head *next}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM)hj}ubj2)}(hhh]h)}(h0points to the first element of the existing listh]h0points to the first element of the existing list}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hM)hj}ubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhj}hM)hjG}ubj)}(hG``void (*sync)(void)`` synchronize_rcu, synchronize_rcu_expedited, ... h](j)}(h``void (*sync)(void)``h]j)}(hj}h]hvoid (*sync)(void)}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM*hj}ubj2)}(hhh]h)}(h/synchronize_rcu, synchronize_rcu_expedited, ...h]h/synchronize_rcu, synchronize_rcu_expedited, ...}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hM*hj~ubah}(h]h ]h"]h$]h&]uh1j1hj}ubeh}(h]h ]h"]h$]h&]uh1jhj~hM*hjG}ubeh}(h]h ]h"]h$]h&]uh1j hj+}ubh)}(h**Description**h]j)}(hj6~h]h Description}(hj8~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4~ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM,hj+}ubh)}(hgThe list pointed to by **prev** and **next** can be RCU-read traversed concurrently with this function.h](hThe list pointed to by }(hjL~hhhNhNubj)}(h**prev**h]hprev}(hjT~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL~ubh and }(hjL~hhhNhNubj)}(h**next**h]hnext}(hjf~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL~ubh; can be RCU-read traversed concurrently with this function.}(hjL~hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM+hj+}ubh)}(hNote that this function blocks.h]hNote that this function blocks.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM.hj+}ubh)}(hXxImportant note: the caller must take whatever action is necessary to prevent any other updates to the existing list. In principle, it is possible to modify the list as soon as sync() begins execution. If this sort of thing becomes necessary, an alternative version based on call_rcu() could be created. But only if -really- needed -- there is no shortage of RCU API members.h]hXxImportant note: the caller must take whatever action is necessary to prevent any other updates to the existing list. In principle, it is possible to modify the list as soon as sync() begins execution. If this sort of thing becomes necessary, an alternative version based on call_rcu() could be created. But only if -really- needed -- there is no shortage of RCU API members.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM0hj+}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !list_splice_init_rcu (C function)c.list_splice_init_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h^void list_splice_init_rcu (struct list_head *list, struct list_head *head, void (*sync)(void))h]j)}(h]void list_splice_init_rcu(struct list_head *list, struct list_head *head, void (*sync)(void))h](j )}(hvoidh]hvoid}(hj~hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj~hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMbubj2)}(h h]h }(hj~hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~hhhj~hMbubj{)}(hlist_splice_init_rcuh]j)}(hlist_splice_init_rcuh]hlist_splice_init_rcu}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj~hhhj~hMbubj)}(hD(struct list_head *list, struct list_head *head, void (*sync)(void))h](j)}(hstruct list_head *listh](j)}(hjAh]hstruct}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubh)}(hhh]j)}(h list_headh]h list_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY j~sbc.list_splice_init_rcuasbuh1hhj~ubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj~ubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj)}(hlisth]hlist}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~ubj)}(hstruct list_head *headh](j)}(hjAh]hstruct}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhubh)}(hhh]j)}(h list_headh]h list_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]j4c.list_splice_init_rcuasbuh1hhjhubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj)}(hheadh]hhead}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~ubj)}(hvoid (*sync)(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hj7h]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsynch]hsync}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj:7h]h)}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj7h]h(}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hvoidh]hvoid}(hj:hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj)}(hj:7h]h)}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~ubeh}(h]h ]h"]h$]h&]jjuh1jhj~hhhj~hMbubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj~hhhj~hMbubah}(h]j~ah ](jjeh"]h$]h&]jj)jhuh1jhj~hMbhj~hhubj)}(hhh]h)}(hHsplice an RCU-protected list into an existing list, designed for stacks.h]hHsplice an RCU-protected list into an existing list, designed for stacks.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMbhjnhhubah}(h]h ]h"]h$]h&]uh1jhj~hhhj~hMbubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct list_head *list`` the RCU-protected list to splice ``struct list_head *head`` the place in the existing list to splice the first list into ``void (*sync)(void)`` synchronize_rcu, synchronize_rcu_expedited, ...h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMfhjubj )}(hhh](j)}(h<``struct list_head *list`` the RCU-protected list to splice h](j)}(h``struct list_head *list``h]j)}(hjh]hstruct list_head *list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMdhjubj2)}(hhh]h)}(h the RCU-protected list to spliceh]h the RCU-protected list to splice}(hjˀhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjǀhMdhjȀubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjǀhMdhjubj)}(hX``struct list_head *head`` the place in the existing list to splice the first list into h](j)}(h``struct list_head *head``h]j)}(hjh]hstruct list_head *head}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMehjubj2)}(hhh]h)}(hah"]h$]h&]uh1j1hjzhhhjhMqubj{)}(hlist_splice_tail_init_rcuh]j)}(hlist_splice_tail_init_rcuh]hlist_splice_tail_init_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjzhhhjhMqubj)}(hD(struct list_head *list, struct list_head *head, void (*sync)(void))h](j)}(hstruct list_head *listh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjȁhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h list_headh]h list_head}(hjفhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjցubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjہmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.list_splice_tail_init_rcuasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlisth]hlist}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct list_head *headh](j)}(hjAh]hstruct}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubh)}(hhh]j)}(h list_headh]h list_head}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjMmodnameN classnameNj] j` )}jc ]jc.list_splice_tail_init_rcuasbuh1hhj)ubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(hjh]h*}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hheadh]hhead}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hvoid (*sync)(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hj7h]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjƂhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsynch]hsync}(hjӂhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj:7h]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj7h]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubj)}(hj:7h]h)}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjzhhhjhMqubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjvhhhjhMqubah}(h]jqah ](jjeh"]h$]h&]jj)jhuh1jhjhMqhjshhubj)}(hhh]h)}(hHsplice an RCU-protected list into an existing list, designed for queues.h]hHsplice an RCU-protected list into an existing list, designed for queues.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMqhj/hhubah}(h]h ]h"]h$]h&]uh1jhjshhhjhMqubeh}(h]h ](jfunctioneh"]h$]h&]jjjjJjjJjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct list_head *list`` the RCU-protected list to splice ``struct list_head *head`` the place in the existing list to splice the first list into ``void (*sync)(void)`` synchronize_rcu, synchronize_rcu_expedited, ...h](h)}(h**Parameters**h]j)}(hjTh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMuhjNubj )}(hhh](j)}(h<``struct list_head *list`` the RCU-protected list to splice h](j)}(h``struct list_head *list``h]j)}(hjsh]hstruct list_head *list}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMshjmubj2)}(hhh]h)}(h the RCU-protected list to spliceh]h the RCU-protected list to splice}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMshjubah}(h]h ]h"]h$]h&]uh1j1hjmubeh}(h]h ]h"]h$]h&]uh1jhjhMshjjubj)}(hX``struct list_head *head`` the place in the existing list to splice the first list into h](j)}(h``struct list_head *head``h]j)}(hjh]hstruct list_head *head}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMthjubj2)}(hhh]h)}(h` pointer. ``type`` the type of the struct this is embedded in. ``member`` the name of the list_head within the struct. **Description** This primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj )}(hhh](j)}(h<``ptr`` the :c:type:`struct list_head ` pointer. h](j)}(h``ptr``h]j)}(hjɄh]hptr}(hj˄hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDŽubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjÄubj2)}(hhh]h)}(h3the :c:type:`struct list_head ` pointer.h](hthe }(hjhhhNhNubh)}(h&:c:type:`struct list_head `h]j)}(hjh]hstruct list_head}(hjhhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jj list_headuh1hhjބhMhjubh pointer.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjބhMhj߄ubah}(h]h ]h"]h$]h&]uh1j1hjÄubeh}(h]h ]h"]h$]h&]uh1jhjބhMhjubj)}(h5``type`` the type of the struct this is embedded in. h](j)}(h``type``h]j)}(hj%h]htype}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h+the type of the struct this is embedded in.h]h+the type of the struct this is embedded in.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hMhj;ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj:hMhjubj)}(h8``member`` the name of the list_head within the struct. h](j)}(h ``member``h]j)}(hj^h]hmember}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjXubj2)}(hhh]h)}(h,the name of the list_head within the struct.h]h,the name of the list_head within the struct.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshMhjtubah}(h]h ]h"]h$]h&]uh1j1hjXubeh}(h]h ]h"]h$]h&]uh1jhjshMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubh)}(hThis primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().h]hThis primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as it’s guarded by rcu_read_lock().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  list_first_or_null_rcu (C macro)c.list_first_or_null_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hlist_first_or_null_rcuh]j)}(hlist_first_or_null_rcuh]j{)}(hlist_first_or_null_rcuh]j)}(hj؅h]hlist_first_or_null_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjޅubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjڅhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjօhhhjhMubah}(h]jхah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjӅhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjӅhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h.``list_first_or_null_rcu (ptr, type, member)``h]j)}(hjh]h*list_first_or_null_rcu (ptr, type, member)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjhhubj)}(h"get the first element from a list h]h)}(h!get the first element from a listh]h!get the first element from a list}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj*ubah}(h]h ]h"]h$]h&]uh1jhj<hMhjhhubj)}(hX**Parameters** ``ptr`` the list head to take the element from. ``type`` the type of the struct this is embedded in. ``member`` the name of the list_head within the struct. **Description** Note that if the list is empty, it returns NULL. This primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().h](h)}(h**Parameters**h]j)}(hjIh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjCubj )}(hhh](j)}(h0``ptr`` the list head to take the element from. h](j)}(h``ptr``h]j)}(hjhh]hptr}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjbubj2)}(hhh]h)}(h'the list head to take the element from.h]h'the list head to take the element from.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hMhj~ubah}(h]h ]h"]h$]h&]uh1j1hjbubeh}(h]h ]h"]h$]h&]uh1jhj}hMhj_ubj)}(h5``type`` the type of the struct this is embedded in. h](j)}(h``type``h]j)}(hjh]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h+the type of the struct this is embedded in.h]h+the type of the struct this is embedded in.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj_ubj)}(h8``member`` the name of the list_head within the struct. h](j)}(h ``member``h]j)}(hjچh]hmember}(hj܆hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj؆ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjԆubj2)}(hhh]h)}(h,the name of the list_head within the struct.h]h,the name of the list_head within the struct.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjԆubeh}(h]h ]h"]h$]h&]uh1jhjhMhj_ubeh}(h]h ]h"]h$]h&]uh1j hjCubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjCubh)}(h0Note that if the list is empty, it returns NULL.h]h0Note that if the list is empty, it returns NULL.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjCubh)}(hThis primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().h]hThis primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as it’s guarded by rcu_read_lock().}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j list_next_or_null_rcu (C macro)c.list_next_or_null_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hlist_next_or_null_rcuh]j)}(hlist_next_or_null_rcuh]j{)}(hlist_next_or_null_rcuh]j)}(hjch]hlist_next_or_null_rcu}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjehhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjahhhjhMubah}(h]j\ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhj^hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj^hhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h3``list_next_or_null_rcu (head, ptr, type, member)``h]j)}(hjh]h/list_next_or_null_rcu (head, ptr, type, member)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjhhubj)}(h!get the next element from a list h]h)}(h get the next element from a listh]h get the next element from a list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjLJhMhjhhubj)}(hX**Parameters** ``head`` the head for the list. ``ptr`` the list head to take the next element from. ``type`` the type of the struct this is embedded in. ``member`` the name of the list_head within the struct. **Description** Note that if the ptr is at the end of the list, NULL is returned. This primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().h](h)}(h**Parameters**h]j)}(hjԇh]h Parameters}(hjևhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj҇ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj·ubj )}(hhh](j)}(h ``head`` the head for the list. h](j)}(h``head``h]j)}(hjh]hhead}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(hthe head for the list.h]hthe head for the list.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h5``ptr`` the list head to take the next element from. h](j)}(h``ptr``h]j)}(hj,h]hptr}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj&ubj2)}(hhh]h)}(h,the list head to take the next element from.h]h,the list head to take the next element from.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMhjBubah}(h]h ]h"]h$]h&]uh1j1hj&ubeh}(h]h ]h"]h$]h&]uh1jhjAhMhjubj)}(h5``type`` the type of the struct this is embedded in. h](j)}(h``type``h]j)}(hjeh]htype}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj_ubj2)}(hhh]h)}(h+the type of the struct this is embedded in.h]h+the type of the struct this is embedded in.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhMhj{ubah}(h]h ]h"]h$]h&]uh1j1hj_ubeh}(h]h ]h"]h$]h&]uh1jhjzhMhjubj)}(h8``member`` the name of the list_head within the struct. h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h,the name of the list_head within the struct.h]h,the name of the list_head within the struct.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hj·ubh)}(h**Description**h]j)}(hjوh]h Description}(hjۈhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj׈ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj·ubh)}(hANote that if the ptr is at the end of the list, NULL is returned.h]hANote that if the ptr is at the end of the list, NULL is returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj·ubh)}(hThis primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().h]hThis primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as it’s guarded by rcu_read_lock().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj·ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !list_for_each_entry_rcu (C macro)c.list_for_each_entry_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hlist_for_each_entry_rcuh]j)}(hlist_for_each_entry_rcuh]j{)}(hlist_for_each_entry_rcuh]j)}(hj'h]hlist_for_each_entry_rcu}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj)hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj%hhhjDhMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhjDhMhj"hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj"hhhjDhMubeh}(h]h ](jmacroeh"]h$]h&]jjjj]jj]jjjuh1jhhhjhNhNubh)}(h8``list_for_each_entry_rcu (pos, head, member, cond...)``h]j)}(hjch]h4list_for_each_entry_rcu (pos, head, member, cond...)}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjhhubj)}(h$iterate over rcu list of given type h]h)}(h#iterate over rcu list of given typeh]h#iterate over rcu list of given type}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjyubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(hX**Parameters** ``pos`` the type * to use as a loop cursor. ``head`` the head for your list. ``member`` the name of the list_head within the struct. ``cond...`` optional lockdep expression if called from non-RCU protection. **Description** This list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as the traversal is guarded by rcu_read_lock().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hjh]hpos}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjЉhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj̉hMhj͉ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj̉hMhjubj)}(h!``head`` the head for your list. h](j)}(h``head``h]j)}(hjh]hhead}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(hthe head for your list.h]hthe head for your list.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h8``member`` the name of the list_head within the struct. h](j)}(h ``member``h]j)}(hj)h]hmember}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj#ubj2)}(hhh]h)}(h,the name of the list_head within the struct.h]h,the name of the list_head within the struct.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj?ubah}(h]h ]h"]h$]h&]uh1j1hj#ubeh}(h]h ]h"]h$]h&]uh1jhj>hMhjubj)}(hK``cond...`` optional lockdep expression if called from non-RCU protection. h](j)}(h ``cond...``h]j)}(hjbh]hcond...}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj\ubj2)}(hhh]h)}(h>optional lockdep expression if called from non-RCU protection.h]h>optional lockdep expression if called from non-RCU protection.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhMhjxubah}(h]h ]h"]h$]h&]uh1j1hj\ubeh}(h]h ]h"]h$]h&]uh1jhjwhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubh)}(hThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as the traversal is guarded by rcu_read_lock().h]hThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as the traversal is guarded by rcu_read_lock().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "list_for_each_entry_srcu (C macro)c.list_for_each_entry_srcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hlist_for_each_entry_srcuh]j)}(hlist_for_each_entry_srcuh]j{)}(hlist_for_each_entry_srcuh]j)}(hj܊h]hlist_for_each_entry_srcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjފhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjڊhhhjhMubah}(h]jՊah ](jjeh"]h$]h&]jj)jhuh1jhjhMhj׊hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj׊hhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h6``list_for_each_entry_srcu (pos, head, member, cond)``h]j)}(hjh]h2list_for_each_entry_srcu (pos, head, member, cond)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjhhubj)}(h$iterate over rcu list of given type h]h)}(h#iterate over rcu list of given typeh]h#iterate over rcu list of given type}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj.ubah}(h]h ]h"]h$]h&]uh1jhj@hMhjhhubj)}(hX **Parameters** ``pos`` the type * to use as a loop cursor. ``head`` the head for your list. ``member`` the name of the list_head within the struct. ``cond`` lockdep expression for the lock required to traverse the list. **Description** This list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as the traversal is guarded by srcu_read_lock(). The lockdep expression srcu_read_lock_held() can be passed as the cond argument from read side.h](h)}(h**Parameters**h]j)}(hjMh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjGubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hjlh]hpos}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjfubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjfubeh}(h]h ]h"]h$]h&]uh1jhjhMhjcubj)}(h!``head`` the head for your list. h](j)}(h``head``h]j)}(hjh]hhead}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(hthe head for your list.h]hthe head for your list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjcubj)}(h8``member`` the name of the list_head within the struct. h](j)}(h ``member``h]j)}(hjދh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj܋ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj؋ubj2)}(hhh]h)}(h,the name of the list_head within the struct.h]h,the name of the list_head within the struct.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj؋ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjcubj)}(hH``cond`` lockdep expression for the lock required to traverse the list. h](j)}(h``cond``h]j)}(hjh]hcond}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h>lockdep expression for the lock required to traverse the list.h]h>lockdep expression for the lock required to traverse the list.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj-ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj,hMhjcubeh}(h]h ]h"]h$]h&]uh1j hjGubh)}(h**Description**h]j)}(hjRh]h Description}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjGubh)}(hXThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as the traversal is guarded by srcu_read_lock(). The lockdep expression srcu_read_lock_held() can be passed as the cond argument from read side.h]hXThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu() as long as the traversal is guarded by srcu_read_lock(). The lockdep expression srcu_read_lock_held() can be passed as the cond argument from read side.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j list_entry_lockless (C macro)c.list_entry_locklesshNtauh1hhjhhhNhNubj)}(hhh](j)}(hlist_entry_locklessh]j)}(hlist_entry_locklessh]j{)}(hlist_entry_locklessh]j)}(hjh]hlist_entry_lockless}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjnjjjnjjjjuh1jhhhjhNhNubh)}(h+``list_entry_lockless (ptr, type, member)``h]j)}(hj͌h]h'list_entry_lockless (ptr, type, member)}(hjόhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjˌubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjhhubj)}(hget the struct for this entry h]h)}(hget the struct for this entryh]hget the struct for this entry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(hX>**Parameters** ``ptr`` the :c:type:`struct list_head ` pointer. ``type`` the type of the struct this is embedded in. ``member`` the name of the list_head within the struct. **Description** This primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu(), but requires some implicit RCU read-side guarding. One example is running within a special exception-time environment where preemption is disabled and where lockdep cannot be invoked. Another example is when items are added to the list, but never deleted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj )}(hhh](j)}(h<``ptr`` the :c:type:`struct list_head ` pointer. h](j)}(h``ptr``h]j)}(hj!h]hptr}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h3the :c:type:`struct list_head ` pointer.h](hthe }(hj:hhhNhNubh)}(h&:c:type:`struct list_head `h]j)}(hjDh]hstruct list_head}(hjFhhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jj list_headuh1hhj6hMhj:ubh pointer.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj6hMhjubj)}(h5``type`` the type of the struct this is embedded in. h](j)}(h``type``h]j)}(hj}h]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjwubj2)}(hhh]h)}(h+the type of the struct this is embedded in.h]h+the type of the struct this is embedded in.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjwubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h8``member`` the name of the list_head within the struct. h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h,the name of the list_head within the struct.h]h,the name of the list_head within the struct.}(hjύhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjˍhMhj̍ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjˍhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubh)}(hXkThis primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu(), but requires some implicit RCU read-side guarding. One example is running within a special exception-time environment where preemption is disabled and where lockdep cannot be invoked. Another example is when items are added to the list, but never deleted.h]hXkThis primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu(), but requires some implicit RCU read-side guarding. One example is running within a special exception-time environment where preemption is disabled and where lockdep cannot be invoked. Another example is when items are added to the list, but never deleted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &list_for_each_entry_lockless (C macro)c.list_for_each_entry_locklesshNtauh1hhjhhhNhNubj)}(hhh](j)}(hlist_for_each_entry_locklessh]j)}(hlist_for_each_entry_locklessh]j{)}(hlist_for_each_entry_locklessh]j)}(hj0h]hlist_for_each_entry_lockless}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj2hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj.hhhjMhMubah}(h]j)ah ](jjeh"]h$]h&]jj)jhuh1jhjMhMhj+hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj+hhhjMhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjfjjfjjjuh1jhhhjhNhNubh)}(h4``list_for_each_entry_lockless (pos, head, member)``h]j)}(hjlh]h0list_for_each_entry_lockless (pos, head, member)}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjhhubj)}(h$iterate over rcu list of given type h]h)}(h#iterate over rcu list of given typeh]h#iterate over rcu list of given type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(hX**Parameters** ``pos`` the type * to use as a loop cursor. ``head`` the head for your list. ``member`` the name of the list_struct within the struct. **Description** This primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu(), but requires some implicit RCU read-side guarding. One example is running within a special exception-time environment where preemption is disabled and where lockdep cannot be invoked. Another example is when items are added to the list, but never deleted.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM hjubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hjh]hpos}(hjŽhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjَhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjՎhMhj֎ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjՎhMhjubj)}(h!``head`` the head for your list. h](j)}(h``head``h]j)}(hjh]hhead}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(hthe head for your list.h]hthe head for your list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h:``member`` the name of the list_struct within the struct. h](j)}(h ``member``h]j)}(hj2h]hmember}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj,ubj2)}(hhh]h)}(h.the name of the list_struct within the struct.h]h.the name of the list_struct within the struct.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMhjHubah}(h]h ]h"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]uh1jhjGhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjmh]h Description}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM hjubh)}(hXkThis primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu(), but requires some implicit RCU read-side guarding. One example is running within a special exception-time environment where preemption is disabled and where lockdep cannot be invoked. Another example is when items are added to the list, but never deleted.h]hXkThis primitive may safely run concurrently with the _rcu list-mutation primitives such as list_add_rcu(), but requires some implicit RCU read-side guarding. One example is running within a special exception-time environment where preemption is disabled and where lockdep cannot be invoked. Another example is when items are added to the list, but never deleted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *list_for_each_entry_continue_rcu (C macro)"c.list_for_each_entry_continue_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h list_for_each_entry_continue_rcuh]j)}(h list_for_each_entry_continue_rcuh]j{)}(h list_for_each_entry_continue_rcuh]j)}(hjh]h list_for_each_entry_continue_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjɏhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjɏhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjɏhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h8``list_for_each_entry_continue_rcu (pos, head, member)``h]j)}(hjh]h4list_for_each_entry_continue_rcu (pos, head, member)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjhhubj)}(h+continue iteration over list of given type h]h)}(h*continue iteration over list of given typeh]h*continue iteration over list of given type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(hX**Parameters** ``pos`` the type * to use as a loop cursor. ``head`` the head for your list. ``member`` the name of the list_head within the struct. **Description** Continue to iterate over list of given type, continuing after the current position which must have been in the list when the RCU read lock was taken. This would typically require either that you obtained the node from a previous walk of the list in the same RCU read-side critical section, or that you held some sort of non-RCU reference (such as a reference count) to keep the node alive *and* in the list. This iterator is similar to list_for_each_entry_from_rcu() except this starts after the given position and that one starts at the given position.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hj<h]hpos}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj6ubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMhjRubah}(h]h ]h"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhMhj3ubj)}(h!``head`` the head for your list. h](j)}(h``head``h]j)}(hjuh]hhead}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjoubj2)}(hhh]h)}(hthe head for your list.h]hthe head for your list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjoubeh}(h]h ]h"]h$]h&]uh1jhjhMhj3ubj)}(h8``member`` the name of the list_head within the struct. h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h,the name of the list_head within the struct.h]h,the name of the list_head within the struct.}(hjǐhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjÐhMhjĐubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjÐhMhj3ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubh)}(hXContinue to iterate over list of given type, continuing after the current position which must have been in the list when the RCU read lock was taken. This would typically require either that you obtained the node from a previous walk of the list in the same RCU read-side critical section, or that you held some sort of non-RCU reference (such as a reference count) to keep the node alive *and* in the list.h](hXContinue to iterate over list of given type, continuing after the current position which must have been in the list when the RCU read lock was taken. This would typically require either that you obtained the node from a previous walk of the list in the same RCU read-side critical section, or that you held some sort of non-RCU reference (such as a reference count) to keep the node alive }(hjhhhNhNubj)}(h*and*h]hand}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh in the list.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubh)}(hThis iterator is similar to list_for_each_entry_from_rcu() except this starts after the given position and that one starts at the given position.h]hThis iterator is similar to list_for_each_entry_from_rcu() except this starts after the given position and that one starts at the given position.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM#hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &list_for_each_entry_from_rcu (C macro)c.list_for_each_entry_from_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hlist_for_each_entry_from_rcuh]j)}(hlist_for_each_entry_from_rcuh]j{)}(hlist_for_each_entry_from_rcuh]j)}(hjIh]hlist_for_each_entry_from_rcu}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjKhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM.ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjGhhhjfhM.ubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jhjfhM.hjDhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjDhhhjfhM.ubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h4``list_for_each_entry_from_rcu (pos, head, member)``h]j)}(hjh]h0list_for_each_entry_from_rcu (pos, head, member)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM0hjhhubj)}(h'iterate over a list from current point h]h)}(h&iterate over a list from current pointh]h&iterate over a list from current point}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM.hjubah}(h]h ]h"]h$]h&]uh1jhjhM.hjhhubj)}(hX**Parameters** ``pos`` the type * to use as a loop cursor. ``head`` the head for your list. ``member`` the name of the list_node within the struct. **Description** Iterate over the tail of a list starting from a given position, which must have been in the list when the RCU read lock was taken. This would typically require either that you obtained the node from a previous walk of the list in the same RCU read-side critical section, or that you held some sort of non-RCU reference (such as a reference count) to keep the node alive *and* in the list. This iterator is similar to list_for_each_entry_continue_rcu() except this starts from the given position and that one starts from the position after the given position.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM2hjubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hjّh]hpos}(hjۑhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjבubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM/hjӑubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM/hjubah}(h]h ]h"]h$]h&]uh1j1hjӑubeh}(h]h ]h"]h$]h&]uh1jhjhM/hjБubj)}(h!``head`` the head for your list. h](j)}(h``head``h]j)}(hjh]hhead}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM0hj ubj2)}(hhh]h)}(hthe head for your list.h]hthe head for your list.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hM0hj(ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj'hM0hjБubj)}(h8``member`` the name of the list_node within the struct. h](j)}(h ``member``h]j)}(hjKh]hmember}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM1hjEubj2)}(hhh]h)}(h,the name of the list_node within the struct.h]h,the name of the list_node within the struct.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hM1hjaubah}(h]h ]h"]h$]h&]uh1j1hjEubeh}(h]h ]h"]h$]h&]uh1jhj`hM1hjБubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM3hjubh)}(hXIterate over the tail of a list starting from a given position, which must have been in the list when the RCU read lock was taken. This would typically require either that you obtained the node from a previous walk of the list in the same RCU read-side critical section, or that you held some sort of non-RCU reference (such as a reference count) to keep the node alive *and* in the list.h](hXrIterate over the tail of a list starting from a given position, which must have been in the list when the RCU read lock was taken. This would typically require either that you obtained the node from a previous walk of the list in the same RCU read-side critical section, or that you held some sort of non-RCU reference (such as a reference count) to keep the node alive }(hjhhhNhNubj)}(h*and*h]hand}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh in the list.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM2hjubh)}(hThis iterator is similar to list_for_each_entry_continue_rcu() except this starts from the given position and that one starts from the position after the given position.h]hThis iterator is similar to list_for_each_entry_continue_rcu() except this starts from the given position and that one starts from the position after the given position.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM9hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j hlist_del_rcu (C function)c.hlist_del_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h)void hlist_del_rcu (struct hlist_node *n)h]j)}(h(void hlist_del_rcu(struct hlist_node *n)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMCubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMCubj{)}(h hlist_del_rcuh]j)}(h hlist_del_rcuh]h hlist_del_rcu}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMCubj)}(h(struct hlist_node *n)h]j)}(hstruct hlist_node *nh](j)}(hjAh]hstruct}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj2)}(h h]h }(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%ubh)}(hhh]j)}(h hlist_nodeh]h hlist_node}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjImodnameN classnameNj] j` )}jc ]jf )}jY jsbc.hlist_del_rcuasbuh1hhj%ubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj%ubj)}(hjh]h*}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMCubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMCubah}(h]jߒah ](jjeh"]h$]h&]jj)jhuh1jhjhMChjhhubj)}(hhh]h)}(h6deletes entry from hash list without re-initializationh]h6deletes entry from hash list without re-initialization}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMChjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMCubeh}(h]h ](jfunctioneh"]h$]h&]jjjjÓjjÓjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct hlist_node *n`` the element to delete from the hash list. **Note** list_unhashed() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal. In particular, it means that we can not poison the forward pointers that may still be used for walking the hash list. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry().h](h)}(h**Parameters**h]j)}(hj͓h]h Parameters}(hjϓhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj˓ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMGhjǓubj )}(hhh]j)}(hC``struct hlist_node *n`` the element to delete from the hash list. h](j)}(h``struct hlist_node *n``h]j)}(hjh]hstruct hlist_node *n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMDhjubj2)}(hhh]h)}(h)the element to delete from the hash list.h]h)the element to delete from the hash list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMDhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMDhjubah}(h]h ]h"]h$]h&]uh1j hjǓubh)}(h**Note**h]j)}(hj'h]hNote}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMFhjǓubh)}(hlist_unhashed() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal.h]hlist_unhashed() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMFhjǓubh)}(huIn particular, it means that we can not poison the forward pointers that may still be used for walking the hash list.h]huIn particular, it means that we can not poison the forward pointers that may still be used for walking the hash list.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMJhjǓubh)}(hXYThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry().h]hXYThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry().}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMMhjǓubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j hlist_replace_rcu (C function)c.hlist_replace_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hGvoid hlist_replace_rcu (struct hlist_node *old, struct hlist_node *new)h]j)}(hFvoid hlist_replace_rcu(struct hlist_node *old, struct hlist_node *new)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM\ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhM\ubj{)}(hhlist_replace_rcuh]j)}(hhlist_replace_rcuh]hhlist_replace_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhM\ubj)}(h0(struct hlist_node *old, struct hlist_node *new)h](j)}(hstruct hlist_node *oldh](j)}(hjAh]hstruct}(hjǔhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjÔubj2)}(h h]h }(hjԔhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjÔubh)}(hhh]j)}(h hlist_nodeh]h hlist_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.hlist_replace_rcuasbuh1hhjÔubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjÔubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjÔubj)}(holdh]hold}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjÔubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct hlist_node *newh](j)}(hjAh]hstruct}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubh)}(hhh]j)}(h hlist_nodeh]h hlist_node}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjYmodnameN classnameNj] j` )}jc ]jc.hlist_replace_rcuasbuh1hhj5ubj2)}(h h]h }(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj5ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hnewh]hnew}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM\ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM\ubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1jhjhM\hjhhubj)}(hhh]h)}(hreplace old entry by new oneh]hreplace old entry by new one}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM\hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM\ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjҕjjҕjjjuh1jhhhjhNhNubj)}(hXV**Parameters** ``struct hlist_node *old`` the element to be replaced ``struct hlist_node *new`` the new element to insert **Description** The **old** entry will be replaced with the **new** entry atomically from the perspective of concurrent readers. It is the caller's responsibility to synchronize with concurrent updaters, if any.h](h)}(h**Parameters**h]j)}(hjܕh]h Parameters}(hjޕhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjڕubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM`hj֕ubj )}(hhh](j)}(h6``struct hlist_node *old`` the element to be replaced h](j)}(h``struct hlist_node *old``h]j)}(hjh]hstruct hlist_node *old}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM]hjubj2)}(hhh]h)}(hthe element to be replacedh]hthe element to be replaced}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM]hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM]hjubj)}(h5``struct hlist_node *new`` the new element to insert h](j)}(h``struct hlist_node *new``h]j)}(hj4h]hstruct hlist_node *new}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM^hj.ubj2)}(hhh]h)}(hthe new element to inserth]hthe new element to insert}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhM^hjJubah}(h]h ]h"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhM^hjubeh}(h]h ]h"]h$]h&]uh1j hj֕ubh)}(h**Description**h]j)}(hjoh]h Description}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM`hj֕ubh)}(hThe **old** entry will be replaced with the **new** entry atomically from the perspective of concurrent readers. It is the caller's responsibility to synchronize with concurrent updaters, if any.h](hThe }(hjhhhNhNubj)}(h**old**h]hold}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh! entry will be replaced with the }(hjhhhNhNubj)}(h**new**h]hnew}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh entry atomically from the perspective of concurrent readers. It is the caller’s responsibility to synchronize with concurrent updaters, if any.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM_hj֕ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "hlists_swap_heads_rcu (C function)c.hlists_swap_heads_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hNvoid hlists_swap_heads_rcu (struct hlist_head *left, struct hlist_head *right)h]j)}(hMvoid hlists_swap_heads_rcu(struct hlist_head *left, struct hlist_head *right)h](j )}(hvoidh]hvoid}(hjؖhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjԖhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMrubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjԖhhhjhMrubj{)}(hhlists_swap_heads_rcuh]j)}(hhlists_swap_heads_rcuh]hhlists_swap_heads_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjԖhhhjhMrubj)}(h3(struct hlist_head *left, struct hlist_head *right)h](j)}(hstruct hlist_head *lefth](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj"hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h hlist_headh]h hlist_head}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj5modnameN classnameNj] j` )}jc ]jf )}jY jsbc.hlists_swap_heads_rcuasbuh1hhjubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlefth]hleft}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubj)}(hstruct hlist_head *righth](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h hlist_headh]h hlist_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jOc.hlists_swap_heads_rcuasbuh1hhjubj2)}(h h]h }(hj×hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjїhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrighth]hright}(hjޗhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjԖhhhjhMrubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjЖhhhjhMrubah}(h]j˖ah ](jjeh"]h$]h&]jj)jhuh1jhjhMrhj͖hhubj)}(hhh]h)}(h'swap the lists the hlist heads point toh]h'swap the lists the hlist heads point to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMrhjhhubah}(h]h ]h"]h$]h&]uh1jhj͖hhhjhMrubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj)}(hXZ**Parameters** ``struct hlist_head *left`` The hlist head on the left ``struct hlist_head *right`` The hlist head on the right **Description** The lists start out as [**left** ][node1 ... ] and [**right** ][node2 ... ] The lists end up as [**left** ][node2 ... ] [**right** ][node1 ... ]h](h)}(h**Parameters**h]j)}(hj*h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMvhj$ubj )}(hhh](j)}(h7``struct hlist_head *left`` The hlist head on the left h](j)}(h``struct hlist_head *left``h]j)}(hjIh]hstruct hlist_head *left}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMshjCubj2)}(hhh]h)}(hThe hlist head on the lefth]hThe hlist head on the left}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hMshj_ubah}(h]h ]h"]h$]h&]uh1j1hjCubeh}(h]h ]h"]h$]h&]uh1jhj^hMshj@ubj)}(h9``struct hlist_head *right`` The hlist head on the right h](j)}(h``struct hlist_head *right``h]j)}(hjh]hstruct hlist_head *right}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMthj|ubj2)}(hhh]h)}(hThe hlist head on the righth]hThe hlist head on the right}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMthjubah}(h]h ]h"]h$]h&]uh1j1hj|ubeh}(h]h ]h"]h$]h&]uh1jhjhMthj@ubeh}(h]h ]h"]h$]h&]uh1j hj$ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMvhj$ubj )}(hhh](j)}(hLThe lists start out as [**left** ][node1 ... ] and [**right** ][node2 ... ]h](j)}(h3The lists start out as [**left** ][node1 ... ] andh](hThe lists start out as [}(hjژhhhNhNubj)}(h**left**h]hleft}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjژubh ][node1 ... ] and}(hjژhhhNhNubeh}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMuhj֘ubj2)}(hhh]h)}(h[**right** ][node2 ... ]h](h[}(hjhhhNhNubj)}(h **right**h]hright}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ][node2 ... ]}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMvhjubah}(h]h ]h"]h$]h&]uh1j1hj֘ubeh}(h]h ]h"]h$]h&]uh1jhjhMuhjӘubj)}(hHThe lists end up as [**left** ][node2 ... ] [**right** ][node1 ... ]h](j)}(h/The lists end up as [**left** ][node2 ... ]h](hThe lists end up as [}(hj/hhhNhNubj)}(h**left**h]hleft}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh ][node2 ... ]}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMwhj+ubj2)}(hhh]h)}(h[**right** ][node1 ... ]h](h[}(hjShhhNhNubj)}(h **right**h]hright}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubh ][node1 ... ]}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMxhjPubah}(h]h ]h"]h$]h&]uh1j1hj+ubeh}(h]h ]h"]h$]h&]uh1jhjOhMwhjӘubeh}(h]h ]h"]h$]h&]uh1j hj$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j hlist_add_head_rcu (C function)c.hlist_add_head_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hDvoid hlist_add_head_rcu (struct hlist_node *n, struct hlist_head *h)h]j)}(hCvoid hlist_add_head_rcu(struct hlist_node *n, struct hlist_head *h)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hhlist_add_head_rcuh]j)}(hhlist_add_head_rcuh]hhlist_add_head_rcu}(hjǙhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjÙubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h,(struct hlist_node *n, struct hlist_head *h)h](j)}(hstruct hlist_node *nh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjߙubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjߙubh)}(hhh]j)}(h hlist_nodeh]h hlist_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jəsbc.hlist_add_head_rcuasbuh1hhjߙubj2)}(h h]h }(hj!hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjߙubj)}(hjh]h*}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjߙubj)}(hjh]hn}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjߙubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjۙubj)}(hstruct hlist_head *hh](j)}(hjAh]hstruct}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubh)}(hhh]j)}(h hlist_headh]h hlist_head}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]jc.hlist_add_head_rcuasbuh1hhjPubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hjeh]hh}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjۙubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjݚjjݚjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct hlist_node *n`` the element to add to the hash list. ``struct hlist_head *h`` the list to add to. **Description** Adds the specified element to the specified hlist, while permitting racing traversals. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj )}(hhh](j)}(h>``struct hlist_node *n`` the element to add to the hash list. h](j)}(h``struct hlist_node *n``h]j)}(hjh]hstruct hlist_node *n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h$the element to add to the hash list.h]h$the element to add to the hash list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h-``struct hlist_head *h`` the list to add to. h](j)}(h``struct hlist_head *h``h]j)}(hj?h]hstruct hlist_head *h}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj9ubj2)}(hhh]h)}(hthe list to add to.h]hthe list to add to.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThMhjUubah}(h]h ]h"]h$]h&]uh1j1hj9ubeh}(h]h ]h"]h$]h&]uh1jhjThMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjzh]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubh)}(hVAdds the specified element to the specified hlist, while permitting racing traversals.h]hVAdds the specified element to the specified hlist, while permitting racing traversals.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubh)}(hXThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().h]hXThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j hlist_add_tail_rcu (C function)c.hlist_add_tail_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hDvoid hlist_add_tail_rcu (struct hlist_node *n, struct hlist_head *h)h]j)}(hCvoid hlist_add_tail_rcu(struct hlist_node *n, struct hlist_head *h)h](j )}(hvoidh]hvoid}(hjΛhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjʛhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubj2)}(h h]h }(hjݛhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjʛhhhjܛhMubj{)}(hhlist_add_tail_rcuh]j)}(hhlist_add_tail_rcuh]hhlist_add_tail_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjʛhhhjܛhMubj)}(h,(struct hlist_node *n, struct hlist_head *h)h](j)}(hstruct hlist_node *nh](j)}(hjAh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h hlist_nodeh]h hlist_node}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj+modnameN classnameNj] j` )}jc ]jf )}jY jsbc.hlist_add_tail_rcuasbuh1hhjubj2)}(h h]h }(hjIhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hn}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct hlist_head *hh](j)}(hjAh]hstruct}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubh)}(hhh]j)}(h hlist_headh]h hlist_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jEc.hlist_add_tail_rcuasbuh1hhjxubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjxubj)}(hjh]h*}(hjƜhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(hjeh]hh}(hjӜhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjʛhhhjܛhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjƛhhhjܛhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjܛhMhjÛhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjÛhhhjܛhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct hlist_node *n`` the element to add to the hash list. ``struct hlist_head *h`` the list to add to. **Description** Adds the specified element to the specified hlist, while permitting racing traversals. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj ubj )}(hhh](j)}(h>``struct hlist_node *n`` the element to add to the hash list. h](j)}(h``struct hlist_node *n``h]j)}(hj.h]hstruct hlist_node *n}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj(ubj2)}(hhh]h)}(h$the element to add to the hash list.h]h$the element to add to the hash list.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMhjDubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhjChMhj%ubj)}(h-``struct hlist_head *h`` the list to add to. h](j)}(h``struct hlist_head *h``h]j)}(hjgh]hstruct hlist_head *h}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjaubj2)}(hhh]h)}(hthe list to add to.h]hthe list to add to.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hMhj}ubah}(h]h ]h"]h$]h&]uh1j1hjaubeh}(h]h ]h"]h$]h&]uh1jhj|hMhj%ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj ubh)}(hVAdds the specified element to the specified hlist, while permitting racing traversals.h]hVAdds the specified element to the specified hlist, while permitting racing traversals.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj ubh)}(hXThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().h]hXThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().}(hjǝhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !hlist_add_before_rcu (C function)c.hlist_add_before_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hIvoid hlist_add_before_rcu (struct hlist_node *n, struct hlist_node *next)h]j)}(hHvoid hlist_add_before_rcu(struct hlist_node *n, struct hlist_node *next)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hhlist_add_before_rcuh]j)}(hhlist_add_before_rcuh]hhlist_add_before_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h/(struct hlist_node *n, struct hlist_node *next)h](j)}(hstruct hlist_node *nh](j)}(hjAh]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubh)}(hhh]j)}(h hlist_nodeh]h hlist_node}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjSmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.hlist_add_before_rcuasbuh1hhj/ubj2)}(h h]h }(hjqhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubj)}(hstruct hlist_node *nexth](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(h hlist_nodeh]h hlist_node}(hjžhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjĞmodnameN classnameNj] j` )}jc ]jmc.hlist_add_before_rcuasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnexth]hnext}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj+ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj.jj.jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct hlist_node *n`` the new element to add to the hash list. ``struct hlist_node *next`` the existing element to add the new element before. **Description** Adds the specified element to the specified hlist before the specified node while permitting racing traversals. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs.h](h)}(h**Parameters**h]j)}(hj8h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj2ubj )}(hhh](j)}(hB``struct hlist_node *n`` the new element to add to the hash list. h](j)}(h``struct hlist_node *n``h]j)}(hjWh]hstruct hlist_node *n}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjQubj2)}(hhh]h)}(h(the new element to add to the hash list.h]h(the new element to add to the hash list.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhMhjmubah}(h]h ]h"]h$]h&]uh1j1hjQubeh}(h]h ]h"]h$]h&]uh1jhjlhMhjNubj)}(hP``struct hlist_node *next`` the existing element to add the new element before. h](j)}(h``struct hlist_node *next``h]j)}(hjh]hstruct hlist_node *next}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h3the existing element to add the new element before.h]h3the existing element to add the new element before.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjNubeh}(h]h ]h"]h$]h&]uh1j hj2ubh)}(h**Description**h]j)}(hj˟h]h Description}(hj͟hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɟubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj2ubh)}(hoAdds the specified element to the specified hlist before the specified node while permitting racing traversals.h]hoAdds the specified element to the specified hlist before the specified node while permitting racing traversals.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj2ubh)}(hXThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs.h]hXThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !hlist_add_behind_rcu (C function)c.hlist_add_behind_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hIvoid hlist_add_behind_rcu (struct hlist_node *n, struct hlist_node *prev)h]j)}(hHvoid hlist_add_behind_rcu(struct hlist_node *n, struct hlist_node *prev)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj-hMubj{)}(hhlist_add_behind_rcuh]j)}(hhlist_add_behind_rcuh]hhlist_add_behind_rcu}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj-hMubj)}(h/(struct hlist_node *n, struct hlist_node *prev)h](j)}(hstruct hlist_node *nh](j)}(hjAh]hstruct}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubh)}(hhh]j)}(h hlist_nodeh]h hlist_node}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj|modnameN classnameNj] j` )}jc ]jf )}jY jBsbc.hlist_add_behind_rcuasbuh1hhjXubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjXubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubj)}(hstruct hlist_node *prevh](j)}(hjAh]hstruct}(hj͠hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɠubj2)}(h h]h }(hjڠhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjɠubh)}(hhh]j)}(h hlist_nodeh]h hlist_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.hlist_add_behind_rcuasbuh1hhjɠubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjɠubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɠubj)}(hprevh]hprev}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɠubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjTubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj-hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj-hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj-hMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj-hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjWjjWjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct hlist_node *n`` the new element to add to the hash list. ``struct hlist_node *prev`` the existing element to add the new element after. **Description** Adds the specified element to the specified hlist after the specified node while permitting racing traversals. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs.h](h)}(h**Parameters**h]j)}(hjah]h Parameters}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj[ubj )}(hhh](j)}(hB``struct hlist_node *n`` the new element to add to the hash list. h](j)}(h``struct hlist_node *n``h]j)}(hjh]hstruct hlist_node *n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjzubj2)}(hhh]h)}(h(the new element to add to the hash list.h]h(the new element to add to the hash list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjzubeh}(h]h ]h"]h$]h&]uh1jhjhMhjwubj)}(hO``struct hlist_node *prev`` the existing element to add the new element after. h](j)}(h``struct hlist_node *prev``h]j)}(hjh]hstruct hlist_node *prev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(h2the existing element to add the new element after.h]h2the existing element to add the new element after.}(hjҡhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjΡhMhjϡubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjΡhMhjwubeh}(h]h ]h"]h$]h&]uh1j hj[ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj[ubh)}(hnAdds the specified element to the specified hlist after the specified node while permitting racing traversals.h]hnAdds the specified element to the specified hlist after the specified node while permitting racing traversals.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj[ubh)}(hXThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs.h]hXThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_add_head_rcu() or hlist_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "hlist_for_each_entry_rcu (C macro)c.hlist_for_each_entry_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hhlist_for_each_entry_rcuh]j)}(hhlist_for_each_entry_rcuh]j{)}(hhlist_for_each_entry_rcuh]j)}(hjBh]hhlist_for_each_entry_rcu}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjDhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj@hhhj_hMubah}(h]j;ah ](jjeh"]h$]h&]jj)jhuh1jhj_hMhj=hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj=hhhj_hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjxjjxjjjuh1jhhhjhNhNubh)}(h9``hlist_for_each_entry_rcu (pos, head, member, cond...)``h]j)}(hj~h]h5hlist_for_each_entry_rcu (pos, head, member, cond...)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjhhubj)}(h$iterate over rcu list of given type h]h)}(h#iterate over rcu list of given typeh]h#iterate over rcu list of given type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubj)}(hX**Parameters** ``pos`` the type * to use as a loop cursor. ``head`` the head for your list. ``member`` the name of the hlist_node within the struct. ``cond...`` optional lockdep expression if called from non-RCU protection. **Description** This list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by rcu_read_lock().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hjҢh]hpos}(hjԢhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjТubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj̢ubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hj̢ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjɢubj)}(h!``head`` the head for your list. h](j)}(h``head``h]j)}(hj h]hhead}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubj2)}(hhh]h)}(hthe head for your list.h]hthe head for your list.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj!ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjɢubj)}(h9``member`` the name of the hlist_node within the struct. h](j)}(h ``member``h]j)}(hjDh]hmember}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhj>ubj2)}(hhh]h)}(h-the name of the hlist_node within the struct.h]h-the name of the hlist_node within the struct.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMhjZubah}(h]h ]h"]h$]h&]uh1j1hj>ubeh}(h]h ]h"]h$]h&]uh1jhjYhMhjɢubj)}(hK``cond...`` optional lockdep expression if called from non-RCU protection. h](j)}(h ``cond...``h]j)}(hj}h]hcond...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjwubj2)}(hhh]h)}(h>optional lockdep expression if called from non-RCU protection.h]h>optional lockdep expression if called from non-RCU protection.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjwubeh}(h]h ]h"]h$]h&]uh1jhjhMhjɢubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubh)}(hThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by rcu_read_lock().h]hThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by rcu_read_lock().}(hjΣhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j #hlist_for_each_entry_srcu (C macro)c.hlist_for_each_entry_srcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hhlist_for_each_entry_srcuh]j)}(hhlist_for_each_entry_srcuh]j{)}(hhlist_for_each_entry_srcuh]j)}(hjh]hhlist_for_each_entry_srcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM!ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM!ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM!hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhM!ubeh}(h]h ](jmacroeh"]h$]h&]jjjj-jj-jjjuh1jhhhjhNhNubh)}(h7``hlist_for_each_entry_srcu (pos, head, member, cond)``h]j)}(hj3h]h3hlist_for_each_entry_srcu (pos, head, member, cond)}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM#hjhhubj)}(h$iterate over rcu list of given type h]h)}(h#iterate over rcu list of given typeh]h#iterate over rcu list of given type}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM!hjIubah}(h]h ]h"]h$]h&]uh1jhj[hM!hjhhubj)}(hX**Parameters** ``pos`` the type * to use as a loop cursor. ``head`` the head for your list. ``member`` the name of the hlist_node within the struct. ``cond`` lockdep expression for the lock required to traverse the list. **Description** This list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by srcu_read_lock(). The lockdep expression srcu_read_lock_held() can be passed as the cond argument from read side.h](h)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM%hjbubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hjh]hpos}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM"hjubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM"hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM"hj~ubj)}(h!``head`` the head for your list. h](j)}(h``head``h]j)}(hjh]hhead}(hj¤hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM#hjubj2)}(hhh]h)}(hthe head for your list.h]hthe head for your list.}(hj٤hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjդhM#hj֤ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjդhM#hj~ubj)}(h9``member`` the name of the hlist_node within the struct. h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM$hjubj2)}(hhh]h)}(h-the name of the hlist_node within the struct.h]h-the name of the hlist_node within the struct.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM$hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhM$hj~ubj)}(hH``cond`` lockdep expression for the lock required to traverse the list. h](j)}(h``cond``h]j)}(hj2h]hcond}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM%hj,ubj2)}(hhh]h)}(h>lockdep expression for the lock required to traverse the list.h]h>lockdep expression for the lock required to traverse the list.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhM%hjHubah}(h]h ]h"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]uh1jhjGhM%hj~ubeh}(h]h ]h"]h$]h&]uh1j hjbubh)}(h**Description**h]j)}(hjmh]h Description}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM'hjbubh)}(hXThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by srcu_read_lock(). The lockdep expression srcu_read_lock_held() can be passed as the cond argument from read side.h]hXThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by srcu_read_lock(). The lockdep expression srcu_read_lock_held() can be passed as the cond argument from read side.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM&hjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j *hlist_for_each_entry_rcu_notrace (C macro)"c.hlist_for_each_entry_rcu_notracehNtauh1hhjhhhNhNubj)}(hhh](j)}(h hlist_for_each_entry_rcu_notraceh]j)}(h hlist_for_each_entry_rcu_notraceh]j{)}(h hlist_for_each_entry_rcu_notraceh]j)}(hjh]h hlist_for_each_entry_rcu_notrace}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM6ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjɥhM6ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjɥhM6hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjɥhM6ubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h8``hlist_for_each_entry_rcu_notrace (pos, head, member)``h]j)}(hjh]h4hlist_for_each_entry_rcu_notrace (pos, head, member)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM8hjhhubj)}(h2iterate over rcu list of given type (for tracing) h]h)}(h1iterate over rcu list of given type (for tracing)h]h1iterate over rcu list of given type (for tracing)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM6hjubah}(h]h ]h"]h$]h&]uh1jhjhM6hjhhubj)}(hX**Parameters** ``pos`` the type * to use as a loop cursor. ``head`` the head for your list. ``member`` the name of the hlist_node within the struct. **Description** This list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by rcu_read_lock(). This is the same as hlist_for_each_entry_rcu() except that it does not do any RCU debugging or tracing.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM:hjubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hj<h]hpos}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM7hj6ubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhM7hjRubah}(h]h ]h"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhM7hj3ubj)}(h!``head`` the head for your list. h](j)}(h``head``h]j)}(hjuh]hhead}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM8hjoubj2)}(hhh]h)}(hthe head for your list.h]hthe head for your list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM8hjubah}(h]h ]h"]h$]h&]uh1j1hjoubeh}(h]h ]h"]h$]h&]uh1jhjhM8hj3ubj)}(h9``member`` the name of the hlist_node within the struct. h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM9hjubj2)}(hhh]h)}(h-the name of the hlist_node within the struct.h]h-the name of the hlist_node within the struct.}(hjǦhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjæhM9hjĦubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjæhM9hj3ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM;hjubh)}(hThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by rcu_read_lock().h]hThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by rcu_read_lock().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM:hjubh)}(hgThis is the same as hlist_for_each_entry_rcu() except that it does not do any RCU debugging or tracing.h]hgThis is the same as hlist_for_each_entry_rcu() except that it does not do any RCU debugging or tracing.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM>hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %hlist_for_each_entry_rcu_bh (C macro)c.hlist_for_each_entry_rcu_bhhNtauh1hhjhhhNhNubj)}(hhh](j)}(hhlist_for_each_entry_rcu_bhh]j)}(hhlist_for_each_entry_rcu_bhh]j{)}(hhlist_for_each_entry_rcu_bhh]j)}(hj7h]hhlist_for_each_entry_rcu_bh}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj9hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMJubah}(h]h ]h"]h$]h&]jjjuh1jjjhj5hhhjThMJubah}(h]j0ah ](jjeh"]h$]h&]jj)jhuh1jhjThMJhj2hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj2hhhjThMJubeh}(h]h ](jmacroeh"]h$]h&]jjjjmjjmjjjuh1jhhhjhNhNubh)}(h3``hlist_for_each_entry_rcu_bh (pos, head, member)``h]j)}(hjsh]h/hlist_for_each_entry_rcu_bh (pos, head, member)}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMLhjhhubj)}(h$iterate over rcu list of given type h]h)}(h#iterate over rcu list of given typeh]h#iterate over rcu list of given type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMJhjubah}(h]h ]h"]h$]h&]uh1jhjhMJhjhhubj)}(hXe**Parameters** ``pos`` the type * to use as a loop cursor. ``head`` the head for your list. ``member`` the name of the hlist_node within the struct. **Description** This list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by rcu_read_lock().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMNhjubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hjǧh]hpos}(hjɧhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjŧubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMKhjubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjܧhMKhjݧubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjܧhMKhjubj)}(h!``head`` the head for your list. h](j)}(h``head``h]j)}(hjh]hhead}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMLhjubj2)}(hhh]h)}(hthe head for your list.h]hthe head for your list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMLhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMLhjubj)}(h9``member`` the name of the hlist_node within the struct. h](j)}(h ``member``h]j)}(hj9h]hmember}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMMhj3ubj2)}(hhh]h)}(h-the name of the hlist_node within the struct.h]h-the name of the hlist_node within the struct.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMMhjOubah}(h]h ]h"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]uh1jhjNhMMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjth]h Description}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMOhjubh)}(hThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by rcu_read_lock().h]hThis list-traversal primitive may safely run concurrently with the _rcu list-mutation primitives such as hlist_add_head_rcu() as long as the traversal is guarded by rcu_read_lock().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMNhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j +hlist_for_each_entry_continue_rcu (C macro)#c.hlist_for_each_entry_continue_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h!hlist_for_each_entry_continue_rcuh]j)}(h!hlist_for_each_entry_continue_rcuh]j{)}(h!hlist_for_each_entry_continue_rcuh]j)}(hjh]h!hlist_for_each_entry_continue_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM[ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjШhM[ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjШhM[hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjШhM[ubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h3``hlist_for_each_entry_continue_rcu (pos, member)``h]j)}(hjh]h/hlist_for_each_entry_continue_rcu (pos, member)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM]hjhhubj)}(h4iterate over a hlist continuing after current point h]h)}(h3iterate over a hlist continuing after current pointh]h3iterate over a hlist continuing after current point}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM[hjubah}(h]h ]h"]h$]h&]uh1jhjhM[hjhhubj)}(hy**Parameters** ``pos`` the type * to use as a loop cursor. ``member`` the name of the hlist_node within the struct.h](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM_hjubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hjCh]hpos}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM\hj=ubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhM\hjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhM\hj:ubj)}(h8``member`` the name of the hlist_node within the struct.h](j)}(h ``member``h]j)}(hj|h]hmember}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM^hjvubj2)}(hhh]h)}(h-the name of the hlist_node within the struct.h]h-the name of the hlist_node within the struct.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhM]hjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhM^hj:ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j .hlist_for_each_entry_continue_rcu_bh (C macro)&c.hlist_for_each_entry_continue_rcu_bhhNtauh1hhjhhhNhNubj)}(hhh](j)}(h$hlist_for_each_entry_continue_rcu_bhh]j)}(h$hlist_for_each_entry_continue_rcu_bhh]j{)}(h$hlist_for_each_entry_continue_rcu_bhh]j)}(hjЩh]h$hlist_for_each_entry_continue_rcu_bh}(hjکhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֩ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjҩhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMgubah}(h]h ]h"]h$]h&]jjjuh1jjjhjΩhhhjhMgubah}(h]jɩah ](jjeh"]h$]h&]jj)jhuh1jhjhMghj˩hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj˩hhhjhMgubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h6``hlist_for_each_entry_continue_rcu_bh (pos, member)``h]j)}(hj h]h2hlist_for_each_entry_continue_rcu_bh (pos, member)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMihjhhubj)}(h4iterate over a hlist continuing after current point h]h)}(h3iterate over a hlist continuing after current pointh]h3iterate over a hlist continuing after current point}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMghj"ubah}(h]h ]h"]h$]h&]uh1jhj4hMghjhhubj)}(hy**Parameters** ``pos`` the type * to use as a loop cursor. ``member`` the name of the hlist_node within the struct.h](h)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMkhj;ubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hj`h]hpos}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMhhjZubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhMhhjvubah}(h]h ]h"]h$]h&]uh1j1hjZubeh}(h]h ]h"]h$]h&]uh1jhjuhMhhjWubj)}(h8``member`` the name of the hlist_node within the struct.h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMjhjubj2)}(hhh]h)}(h-the name of the hlist_node within the struct.h]h-the name of the hlist_node within the struct.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMihjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMjhjWubeh}(h]h ]h"]h$]h&]uh1j hj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'hlist_for_each_entry_from_rcu (C macro)c.hlist_for_each_entry_from_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hhlist_for_each_entry_from_rcuh]j)}(hhlist_for_each_entry_from_rcuh]j{)}(hhlist_for_each_entry_from_rcuh]j)}(hjh]hhlist_for_each_entry_from_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMsubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj hMsubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hMshjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj hMsubeh}(h]h ](jmacroeh"]h$]h&]jjjj#jj#jjjuh1jhhhjhNhNubh)}(h/``hlist_for_each_entry_from_rcu (pos, member)``h]j)}(hj)h]h+hlist_for_each_entry_from_rcu (pos, member)}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMuhjhhubj)}(h3iterate over a hlist continuing from current point h]h)}(h2iterate over a hlist continuing from current pointh]h2iterate over a hlist continuing from current point}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMshj?ubah}(h]h ]h"]h$]h&]uh1jhjQhMshjhhubj)}(hy**Parameters** ``pos`` the type * to use as a loop cursor. ``member`` the name of the hlist_node within the struct.h](h)}(h**Parameters**h]j)}(hj^h]h Parameters}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMwhjXubj )}(hhh](j)}(h,``pos`` the type * to use as a loop cursor. h](j)}(h``pos``h]j)}(hj}h]hpos}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMthjwubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMthjubah}(h]h ]h"]h$]h&]uh1j1hjwubeh}(h]h ]h"]h$]h&]uh1jhjhMthjtubj)}(h8``member`` the name of the hlist_node within the struct.h](j)}(h ``member``h]j)}(hjh]hmember}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMvhjubj2)}(hhh]h)}(h-the name of the hlist_node within the struct.h]h-the name of the hlist_node within the struct.}(hjϫhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:413: ./include/linux/rculist.hhMuhj̫ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj˫hMvhjtubeh}(h]h ]h"]h$]h&]uh1j hjXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %hlist_nulls_del_init_rcu (C function)c.hlist_nulls_del_init_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h:void hlist_nulls_del_init_rcu (struct hlist_nulls_node *n)h]j)}(h9void hlist_nulls_del_init_rcu(struct hlist_nulls_node *n)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhKubj{)}(hhlist_nulls_del_init_rcuh]j)}(hhlist_nulls_del_init_rcuh]hhlist_nulls_del_init_rcu}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhKubj)}(h(struct hlist_nulls_node *n)h]j)}(hstruct hlist_nulls_node *nh](j)}(hjAh]hstruct}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubh)}(hhh]j)}(hhlist_nulls_nodeh]hhlist_nulls_node}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmmodnameN classnameNj] j` )}jc ]jf )}jY j3sbc.hlist_nulls_del_init_rcuasbuh1hhjIubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjIubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjEubah}(h]h ]h"]h$]h&]jjuh1jhj hhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h3deletes entry from hash list with re-initializationh]h3deletes entry from hash list with re-initialization}(hjϬhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhj̬hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXf**Parameters** ``struct hlist_nulls_node *n`` the element to delete from the hash list. **Note** hlist_nulls_unhashed() on the node return true after this. It is useful for RCU based read lockfree traversal if the writer side must know if the list entry is still hashed or already unhashed. In particular, it means that we can not poison the forward pointers that may still be used for walking the hash list and we can only zero the pprev pointer so list_unhashed() will return true after this. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubj )}(hhh]j)}(hI``struct hlist_nulls_node *n`` the element to delete from the hash list. h](j)}(h``struct hlist_nulls_node *n``h]j)}(hjh]hstruct hlist_nulls_node *n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhj ubj2)}(hhh]h)}(h)the element to delete from the hash list.h]h)the element to delete from the hash list.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hKhj&ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj%hKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Note**h]j)}(hjKh]hNote}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubh)}(hhlist_nulls_unhashed() on the node return true after this. It is useful for RCU based read lockfree traversal if the writer side must know if the list entry is still hashed or already unhashed.h]hhlist_nulls_unhashed() on the node return true after this. It is useful for RCU based read lockfree traversal if the writer side must know if the list entry is still hashed or already unhashed.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubh)}(hIn particular, it means that we can not poison the forward pointers that may still be used for walking the hash list and we can only zero the pprev pointer so list_unhashed() will return true after this.h]hIn particular, it means that we can not poison the forward pointers that may still be used for walking the hash list and we can only zero the pprev pointer so list_unhashed() will return true after this.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubh)}(hXpThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu().h]hXpThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j hlist_nulls_first_rcu (C macro)c.hlist_nulls_first_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hhlist_nulls_first_rcuh]j)}(hhlist_nulls_first_rcuh]j{)}(hhlist_nulls_first_rcuh]j)}(hjh]hhlist_nulls_first_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK*ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjŭhK*ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjŭhK*hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjŭhK*ubeh}(h]h ](jmacroeh"]h$]h&]jjjjޭjjޭjjjuh1jhhhjhNhNubh)}(h ``hlist_nulls_first_rcu (head)``h]j)}(hjh]hhlist_nulls_first_rcu (head)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK,hjhhubj)}(h,returns the first element of the hash list. h]h)}(h+returns the first element of the hash list.h]h+returns the first element of the hash list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK*hjubah}(h]h ]h"]h$]h&]uh1jhj hK*hjhhubj)}(h0**Parameters** ``head`` the head of the list.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK.hjubj )}(hhh]j)}(h``head`` the head of the list.h](j)}(h``head``h]j)}(hj8h]hhead}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK0hj2ubj2)}(hhh]h)}(hthe head of the list.h]hthe head of the list.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK+hjNubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhK0hj/ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j hlist_nulls_next_rcu (C macro)c.hlist_nulls_next_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hhlist_nulls_next_rcuh]j)}(hhlist_nulls_next_rcuh]j{)}(hhlist_nulls_next_rcuh]j)}(hjh]hhlist_nulls_next_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK1ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK1ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK1hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhK1ubeh}(h]h ](jmacroeh"]h$]h&]jjjj®jj®jjjuh1jhhhjhNhNubh)}(h``hlist_nulls_next_rcu (node)``h]j)}(hjȮh]hhlist_nulls_next_rcu (node)}(hjʮhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƮubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK3hjhhubj)}(h0returns the element of the list after **node**. h]h)}(h/returns the element of the list after **node**.h](h&returns the element of the list after }(hjhhhNhNubj)}(h**node**h]hnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK1hjޮubah}(h]h ]h"]h$]h&]uh1jhjhK1hjhhubj)}(h/**Parameters** ``node`` element of the list.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK5hj ubj )}(hhh]j)}(h``node`` element of the list.h](j)}(h``node``h]j)}(hj.h]hnode}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK7hj(ubj2)}(hhh]h)}(helement of the list.h]helement of the list.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK2hjDubah}(h]h ]h"]h$]h&]uh1j1hj(ubeh}(h]h ]h"]h$]h&]uh1jhjChK7hj%ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j hlist_nulls_pprev_rcu (C macro)c.hlist_nulls_pprev_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hhlist_nulls_pprev_rcuh]j)}(hhlist_nulls_pprev_rcuh]j{)}(hhlist_nulls_pprev_rcuh]j)}(hjh]hhlist_nulls_pprev_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK8ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK8ubah}(h]j{ah ](jjeh"]h$]h&]jj)jhuh1jhjhK8hj}hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj}hhhjhK8ubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h ``hlist_nulls_pprev_rcu (node)``h]j)}(hjh]hhlist_nulls_pprev_rcu (node)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK:hjhhubj)}(h,returns the dereferenced pprev of **node**. h]h)}(h+returns the dereferenced pprev of **node**.h](h"returns the dereferenced pprev of }(hjدhhhNhNubj)}(h**node**h]hnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjدubh.}(hjدhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK8hjԯubah}(h]h ]h"]h$]h&]uh1jhjhK8hjhhubj)}(h/**Parameters** ``node`` element of the list.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubj2)}(hhh]h)}(helement of the list.h]helement of the list.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK9hj:ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj9hK>hjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  hlist_nulls_del_rcu (C function)c.hlist_nulls_del_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h5void hlist_nulls_del_rcu (struct hlist_nulls_node *n)h]j)}(h4void hlist_nulls_del_rcu(struct hlist_nulls_node *n)h](j )}(hvoidh]hvoid}(hj~hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjzhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK?ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjzhhhjhK?ubj{)}(hhlist_nulls_del_rcuh]j)}(hhlist_nulls_del_rcuh]hhlist_nulls_del_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjzhhhjhK?ubj)}(h(struct hlist_nulls_node *n)h]j)}(hstruct hlist_nulls_node *nh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjȰhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hhlist_nulls_nodeh]hhlist_nulls_node}(hjٰhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjְubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj۰modnameN classnameNj] j` )}jc ]jf )}jY jsbc.hlist_nulls_del_rcuasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjzhhhjhK?ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjvhhhjhK?ubah}(h]jqah ](jjeh"]h$]h&]jj)jhuh1jhjhK?hjshhubj)}(hhh]h)}(h6deletes entry from hash list without re-initializationh]h6deletes entry from hash list without re-initialization}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK?hj:hhubah}(h]h ]h"]h$]h&]uh1jhjshhhjhK?ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjUjjUjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct hlist_nulls_node *n`` the element to delete from the hash list. **Note** hlist_nulls_unhashed() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal. In particular, it means that we can not poison the forward pointers that may still be used for walking the hash list. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry().h](h)}(h**Parameters**h]j)}(hj_h]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKChjYubj )}(hhh]j)}(hI``struct hlist_nulls_node *n`` the element to delete from the hash list. h](j)}(h``struct hlist_nulls_node *n``h]j)}(hj~h]hstruct hlist_nulls_node *n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK@hjxubj2)}(hhh]h)}(h)the element to delete from the hash list.h]h)the element to delete from the hash list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK@hjubah}(h]h ]h"]h$]h&]uh1j1hjxubeh}(h]h ]h"]h$]h&]uh1jhjhK@hjuubah}(h]h ]h"]h$]h&]uh1j hjYubh)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKBhjYubh)}(hhlist_nulls_unhashed() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal.h]hhlist_nulls_unhashed() on entry does not return true after this, the entry is in an undefined state. It is useful for RCU based lockfree traversal.}(hjϱhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKBhjYubh)}(huIn particular, it means that we can not poison the forward pointers that may still be used for walking the hash list.h]huIn particular, it means that we can not poison the forward pointers that may still be used for walking the hash list.}(hjޱhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKFhjYubh)}(hXkThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry().h]hXkThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKIhjYubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %hlist_nulls_add_head_rcu (C function)c.hlist_nulls_add_head_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hVvoid hlist_nulls_add_head_rcu (struct hlist_nulls_node *n, struct hlist_nulls_head *h)h]j)}(hUvoid hlist_nulls_add_head_rcu(struct hlist_nulls_node *n, struct hlist_nulls_head *h)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKXubj2)}(h h]h }(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj*hKXubj{)}(hhlist_nulls_add_head_rcuh]j)}(hhlist_nulls_add_head_rcuh]hhlist_nulls_add_head_rcu}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj*hKXubj)}(h8(struct hlist_nulls_node *n, struct hlist_nulls_head *h)h](j)}(hstruct hlist_nulls_node *nh](j)}(hjAh]hstruct}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj2)}(h h]h }(hjfhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubh)}(hhh]j)}(hhlist_nulls_nodeh]hhlist_nulls_node}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjymodnameN classnameNj] j` )}jc ]jf )}jY j?sbc.hlist_nulls_add_head_rcuasbuh1hhjUubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjUubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubj)}(hstruct hlist_nulls_head *hh](j)}(hjAh]hstruct}(hjʲhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƲubj2)}(h h]h }(hjײhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjƲubh)}(hhh]j)}(hhlist_nulls_headh]hhlist_nulls_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.hlist_nulls_add_head_rcuasbuh1hhjƲubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjƲubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƲubj)}(hjeh]hh}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƲubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjQubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj*hKXubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj*hKXubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj*hKXhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj*hKXubeh}(h]h ](jfunctioneh"]h$]h&]jjjjSjjSjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct hlist_nulls_node *n`` the element to add to the hash list. ``struct hlist_nulls_head *h`` the list to add to. **Description** Adds the specified element to the specified hlist_nulls, while permitting racing traversals. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().h](h)}(h**Parameters**h]j)}(hj]h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK\hjWubj )}(hhh](j)}(hD``struct hlist_nulls_node *n`` the element to add to the hash list. h](j)}(h``struct hlist_nulls_node *n``h]j)}(hj|h]hstruct hlist_nulls_node *n}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKYhjvubj2)}(hhh]h)}(h$the element to add to the hash list.h]h$the element to add to the hash list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKYhjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhKYhjsubj)}(h3``struct hlist_nulls_head *h`` the list to add to. h](j)}(h``struct hlist_nulls_head *h``h]j)}(hjh]hstruct hlist_nulls_head *h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKZhjubj2)}(hhh]h)}(hthe list to add to.h]hthe list to add to.}(hjγhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjʳhKZhj˳ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjʳhKZhjsubeh}(h]h ]h"]h$]h&]uh1j hjWubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK\hjWubh)}(h\Adds the specified element to the specified hlist_nulls, while permitting racing traversals.h]h\Adds the specified element to the specified hlist_nulls, while permitting racing traversals.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK\hjWubh)}(hX The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().h]hX The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK_hjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j %hlist_nulls_add_tail_rcu (C function)c.hlist_nulls_add_tail_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hVvoid hlist_nulls_add_tail_rcu (struct hlist_nulls_node *n, struct hlist_nulls_head *h)h]j)}(hUvoid hlist_nulls_add_tail_rcu(struct hlist_nulls_node *n, struct hlist_nulls_head *h)h](j )}(hvoidh]hvoid}(hjDhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj@hhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKwubj2)}(h h]h }(hjShhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj@hhhjRhKwubj{)}(hhlist_nulls_add_tail_rcuh]j)}(hhlist_nulls_add_tail_rcuh]hhlist_nulls_add_tail_rcu}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj@hhhjRhKwubj)}(h8(struct hlist_nulls_node *n, struct hlist_nulls_head *h)h](j)}(hstruct hlist_nulls_node *nh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubh)}(hhh]j)}(hhlist_nulls_nodeh]hhlist_nulls_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jgsbc.hlist_nulls_add_tail_rcuasbuh1hhj}ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj}ubj)}(hjh]h*}(hjʹhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj)}(hjh]hn}(hjڴhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubj)}(hstruct hlist_nulls_head *hh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hhlist_nulls_headh]hhlist_nulls_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jc.hlist_nulls_add_tail_rcuasbuh1hhjubj2)}(h h]h }(hj.hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjeh]hh}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjyubeh}(h]h ]h"]h$]h&]jjuh1jhj@hhhjRhKwubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj<hhhjRhKwubah}(h]j7ah ](jjeh"]h$]h&]jj)jhuh1jhjRhKwhj9hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj9hhhjRhKwubeh}(h]h ](jfunctioneh"]h$]h&]jjjj{jj{jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct hlist_nulls_node *n`` the element to add to the hash list. ``struct hlist_nulls_head *h`` the list to add to. **Description** Adds the specified element to the specified hlist_nulls, while permitting racing traversals. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK{hjubj )}(hhh](j)}(hD``struct hlist_nulls_node *n`` the element to add to the hash list. h](j)}(h``struct hlist_nulls_node *n``h]j)}(hjh]hstruct hlist_nulls_node *n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKxhjubj2)}(hhh]h)}(h$the element to add to the hash list.h]h$the element to add to the hash list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKxhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKxhjubj)}(h3``struct hlist_nulls_head *h`` the list to add to. h](j)}(h``struct hlist_nulls_head *h``h]j)}(hjݵh]hstruct hlist_nulls_head *h}(hjߵhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj۵ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKyhj׵ubj2)}(hhh]h)}(hthe list to add to.h]hthe list to add to.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKyhjubah}(h]h ]h"]h$]h&]uh1j1hj׵ubeh}(h]h ]h"]h$]h&]uh1jhjhKyhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK{hjubh)}(h\Adds the specified element to the specified hlist_nulls, while permitting racing traversals.h]h\Adds the specified element to the specified hlist_nulls, while permitting racing traversals.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK{hjubh)}(hX The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().h]hX The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu(), used to prevent memory-consistency problems on Alpha CPUs. Regardless of the type of CPU, the list-traversal primitive must be guarded by rcu_read_lock().}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhK~hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $hlist_nulls_replace_rcu (C function)c.hlist_nulls_replace_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hYvoid hlist_nulls_replace_rcu (struct hlist_nulls_node *old, struct hlist_nulls_node *new)h]j)}(hXvoid hlist_nulls_replace_rcu(struct hlist_nulls_node *old, struct hlist_nulls_node *new)h](j )}(hvoidh]hvoid}(hjlhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhhjzhKubj{)}(hhlist_nulls_replace_rcuh]j)}(hhlist_nulls_replace_rcuh]hhlist_nulls_replace_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhhjzhKubj)}(h<(struct hlist_nulls_node *old, struct hlist_nulls_node *new)h](j)}(hstruct hlist_nulls_node *oldh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hhlist_nulls_nodeh]hhlist_nulls_node}(hjǶhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjĶubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjɶmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.hlist_nulls_replace_rcuasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(holdh]hold}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct hlist_nulls_node *newh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hhlist_nulls_nodeh]hhlist_nulls_node}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj;modnameN classnameNj] j` )}jc ]jc.hlist_nulls_replace_rcuasbuh1hhjubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnewh]hnew}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhhjzhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjdhhhjzhKubah}(h]j_ah ](jjeh"]h$]h&]jj)jhuh1jhjzhKhjahhubj)}(hhh]h)}(h!replace an old entry by a new oneh]h!replace an old entry by a new one}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjahhhjzhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXz**Parameters** ``struct hlist_nulls_node *old`` the element to be replaced ``struct hlist_nulls_node *new`` the new element to insert **Description** Replace the old entry with the new one in a RCU-protected hlist_nulls, while permitting racing traversals. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubj )}(hhh](j)}(h<``struct hlist_nulls_node *old`` the element to be replaced h](j)}(h ``struct hlist_nulls_node *old``h]j)}(hjݷh]hstruct hlist_nulls_node *old}(hj߷hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj۷ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhj׷ubj2)}(hhh]h)}(hthe element to be replacedh]hthe element to be replaced}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hj׷ubeh}(h]h ]h"]h$]h&]uh1jhjhKhjԷubj)}(h;``struct hlist_nulls_node *new`` the new element to insert h](j)}(h ``struct hlist_nulls_node *new``h]j)}(hjh]hstruct hlist_nulls_node *new}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubj2)}(hhh]h)}(hthe new element to inserth]hthe new element to insert}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hKhj,ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj+hKhjԷubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjQh]h Description}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubh)}(hjReplace the old entry with the new one in a RCU-protected hlist_nulls, while permitting racing traversals.h]hjReplace the old entry with the new one in a RCU-protected hlist_nulls, while permitting racing traversals.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubh)}(hXpThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu().h]hXpThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu().}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )hlist_nulls_replace_init_rcu (C function)c.hlist_nulls_replace_init_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(h^void hlist_nulls_replace_init_rcu (struct hlist_nulls_node *old, struct hlist_nulls_node *new)h]j)}(h]void hlist_nulls_replace_init_rcu(struct hlist_nulls_node *old, struct hlist_nulls_node *new)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hhlist_nulls_replace_init_rcuh]j)}(hhlist_nulls_replace_init_rcuh]hhlist_nulls_replace_init_rcu}(hjƸhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj¸ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h<(struct hlist_nulls_node *old, struct hlist_nulls_node *new)h](j)}(hstruct hlist_nulls_node *oldh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj޸ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj޸ubh)}(hhh]j)}(hhlist_nulls_nodeh]hhlist_nulls_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jȸsbc.hlist_nulls_replace_init_rcuasbuh1hhj޸ubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj޸ubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj޸ubj)}(holdh]hold}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj޸ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjڸubj)}(hstruct hlist_nulls_node *newh](j)}(hjAh]hstruct}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubh)}(hhh]j)}(hhlist_nulls_nodeh]hhlist_nulls_node}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]jc.hlist_nulls_replace_init_rcuasbuh1hhjPubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hnewh]hnew}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjڸubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h8replace an old entry by a new one and initialize the oldh]h8replace an old entry by a new one and initialize the old}(hjչhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjҹhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct hlist_nulls_node *old`` the element to be replaced ``struct hlist_nulls_node *new`` the new element to insert **Description** Replace the old entry with the new one in a RCU-protected hlist_nulls, while permitting racing traversals, and reinitialize the old entry. **Note** **old** must be hashed. The caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubj )}(hhh](j)}(h<``struct hlist_nulls_node *old`` the element to be replaced h](j)}(h ``struct hlist_nulls_node *old``h]j)}(hjh]hstruct hlist_nulls_node *old}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubj2)}(hhh]h)}(hthe element to be replacedh]hthe element to be replaced}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hKhj,ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj+hKhj ubj)}(h;``struct hlist_nulls_node *new`` the new element to insert h](j)}(h ``struct hlist_nulls_node *new``h]j)}(hjOh]hstruct hlist_nulls_node *new}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjIubj2)}(hhh]h)}(hthe new element to inserth]hthe new element to insert}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhKhjeubah}(h]h ]h"]h$]h&]uh1j1hjIubeh}(h]h ]h"]h$]h&]uh1jhjdhKhj ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubh)}(hReplace the old entry with the new one in a RCU-protected hlist_nulls, while permitting racing traversals, and reinitialize the old entry.h]hReplace the old entry with the new one in a RCU-protected hlist_nulls, while permitting racing traversals, and reinitialize the old entry.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubh)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubh)}(h**old** must be hashed.h](j)}(h**old**h]hold}(hj˺hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjǺubh must be hashed.}(hjǺhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubh)}(hXoThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu().h]hXoThe caller must take whatever precautions are necessary (such as holding appropriate locks) to avoid racing with another list-mutation primitive, such as hlist_nulls_add_head_rcu() or hlist_nulls_del_rcu(), running on this same list. However, it is perfectly legal to run concurrently with the _rcu list-traversal primitives, such as hlist_nulls_for_each_entry_rcu().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (hlist_nulls_for_each_entry_rcu (C macro) c.hlist_nulls_for_each_entry_rcuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hhlist_nulls_for_each_entry_rcuh]j)}(hhlist_nulls_for_each_entry_rcuh]j{)}(hhlist_nulls_for_each_entry_rcuh]j)}(hj h]hhlist_nulls_for_each_entry_rcu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj*hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj*hKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhj*hKubeh}(h]h ](jmacroeh"]h$]h&]jjjjCjjCjjjuh1jhhhjhNhNubh)}(h<``hlist_nulls_for_each_entry_rcu (tpos, pos, head, member)``h]j)}(hjIh]h8hlist_nulls_for_each_entry_rcu (tpos, pos, head, member)}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjhhubj)}(h$iterate over rcu list of given type h]h)}(h#iterate over rcu list of given typeh]h#iterate over rcu list of given type}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhj_ubah}(h]h ]h"]h$]h&]uh1jhjqhKhjhhubj)}(hX**Parameters** ``tpos`` the type * to use as a loop cursor. ``pos`` the :c:type:`struct hlist_nulls_node ` to use as a loop cursor. ``head`` the head of the list. ``member`` the name of the hlist_nulls_node within the struct. **Description** The barrier() is needed to make sure compiler doesn't cache first element [1], as this loop can be restarted [2] [1] Documentation/memory-barriers.txt around line 1533 [2] Documentation/RCU/rculist_nulls.rst around line 146h](h)}(h**Parameters**h]j)}(hj~h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjxubj )}(hhh](j)}(h-``tpos`` the type * to use as a loop cursor. h](j)}(h``tpos``h]j)}(hjh]htpos}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hZ``pos`` the :c:type:`struct hlist_nulls_node ` to use as a loop cursor. h](j)}(h``pos``h]j)}(hjֻh]hpos}(hjػhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԻubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjлubj2)}(hhh]h)}(hQthe :c:type:`struct hlist_nulls_node ` to use as a loop cursor.h](hthe }(hjhhhNhNubh)}(h4:c:type:`struct hlist_nulls_node `h]j)}(hjh]hstruct hlist_nulls_node}(hjhhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjhlist_nulls_nodeuh1hhjhKhjubh to use as a loop cursor.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjлubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h``head`` the head of the list. h](j)}(h``head``h]j)}(hj2h]hhead}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhj,ubj2)}(hhh]h)}(hthe head of the list.h]hthe head of the list.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhKhjHubah}(h]h ]h"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]uh1jhjGhKhjubj)}(h?``member`` the name of the hlist_nulls_node within the struct. h](j)}(h ``member``h]j)}(hjkh]hmember}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjeubj2)}(hhh]h)}(h3the name of the hlist_nulls_node within the struct.h]h3the name of the hlist_nulls_node within the struct.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjeubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1j hjxubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjxubh)}(hThe barrier() is needed to make sure compiler doesn't cache first element [1], as this loop can be restarted [2] [1] Documentation/memory-barriers.txt around line 1533 [2] Documentation/RCU/rculist_nulls.rst around line 146h]hThe barrier() is needed to make sure compiler doesn’t cache first element [1], as this loop can be restarted [2] [1] Documentation/memory-barriers.txt around line 1533 [2] Documentation/RCU/rculist_nulls.rst around line 146}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j )hlist_nulls_for_each_entry_safe (C macro)!c.hlist_nulls_for_each_entry_safehNtauh1hhjhhhNhNubj)}(hhh](j)}(hhlist_nulls_for_each_entry_safeh]j)}(hhlist_nulls_for_each_entry_safeh]j{)}(hhlist_nulls_for_each_entry_safeh]j)}(hjh]hhlist_nulls_for_each_entry_safe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]j޼ah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h=``hlist_nulls_for_each_entry_safe (tpos, pos, head, member)``h]j)}(hj!h]h9hlist_nulls_for_each_entry_safe (tpos, pos, head, member)}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjhhubj)}(hCiterate over list of given type safe against removal of list entry h]h)}(hBiterate over list of given type safe against removal of list entryh]hBiterate over list of given type safe against removal of list entry}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhj7ubah}(h]h ]h"]h$]h&]uh1jhjIhKhjhhubj)}(h**Parameters** ``tpos`` the type * to use as a loop cursor. ``pos`` the :c:type:`struct hlist_nulls_node ` to use as a loop cursor. ``head`` the head of the list. ``member`` the name of the hlist_nulls_node within the struct.h](h)}(h**Parameters**h]j)}(hjVh]h Parameters}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjPubj )}(hhh](j)}(h-``tpos`` the type * to use as a loop cursor. h](j)}(h``tpos``h]j)}(hjuh]htpos}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjoubj2)}(hhh]h)}(h#the type * to use as a loop cursor.h]h#the type * to use as a loop cursor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjoubeh}(h]h ]h"]h$]h&]uh1jhjhKhjlubj)}(hZ``pos`` the :c:type:`struct hlist_nulls_node ` to use as a loop cursor. h](j)}(h``pos``h]j)}(hjh]hpos}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubj2)}(hhh]h)}(hQthe :c:type:`struct hlist_nulls_node ` to use as a loop cursor.h](hthe }(hjǽhhhNhNubh)}(h4:c:type:`struct hlist_nulls_node `h]j)}(hjѽh]hstruct hlist_nulls_node}(hjӽhhhNhNubah}(h]h ](jهjc-typeeh"]h$]h&]uh1jhjϽubah}(h]h ]h"]h$]h&]refdocj07 refdomainjreftypetype refexplicitrefwarnj] jjhlist_nulls_nodeuh1hhjýhKhjǽubh to use as a loop cursor.}(hjǽhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjýhKhjĽubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjýhKhjlubj)}(h``head`` the head of the list. h](j)}(h``head``h]j)}(hj h]hhead}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjubj2)}(hhh]h)}(hthe head of the list.h]hthe head of the list.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjlubj)}(h>``member`` the name of the hlist_nulls_node within the struct.h](j)}(h ``member``h]j)}(hjCh]hmember}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhj=ubj2)}(hhh]h)}(h3the name of the hlist_nulls_node within the struct.h]h3the name of the hlist_nulls_node within the struct.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:415: ./include/linux/rculist_nulls.hhKhjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhKhjlubeh}(h]h ]h"]h$]h&]uh1j hjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_sync_is_idle (C function)c.rcu_sync_is_idlehNtauh1hhjhhhNhNubj)}(hhh](j)}(h,bool rcu_sync_is_idle (struct rcu_sync *rsp)h]j)}(h+bool rcu_sync_is_idle(struct rcu_sync *rsp)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:417: ./include/linux/rcu_sync.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hrcu_sync_is_idleh]j)}(hrcu_sync_is_idleh]hrcu_sync_is_idle}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(struct rcu_sync *rsp)h]j)}(hstruct rcu_sync *rsph](j)}(hjAh]hstruct}(hjپhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjվubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjվubh)}(hhh]j)}(hrcu_synch]hrcu_sync}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.rcu_sync_is_idleasbuh1hhjվubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjվubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjվubj)}(hrsph]hrsp}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjվubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjѾubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h-Are readers permitted to use their fastpaths?h]h-Are readers permitted to use their fastpaths?}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:417: ./include/linux/rcu_sync.hhKhjYhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjtjjtjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct rcu_sync *rsp`` Pointer to rcu_sync structure to use for synchronization **Description** Returns true if readers are permitted to use their fastpaths. Must be invoked within some flavor of RCU read-side critical section.h](h)}(h**Parameters**h]j)}(hj~h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:417: ./include/linux/rcu_sync.hhKhjxubj )}(hhh]j)}(hR``struct rcu_sync *rsp`` Pointer to rcu_sync structure to use for synchronization h](j)}(h``struct rcu_sync *rsp``h]j)}(hjh]hstruct rcu_sync *rsp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:417: ./include/linux/rcu_sync.hhKhjubj2)}(hhh]h)}(h8Pointer to rcu_sync structure to use for synchronizationh]h8Pointer to rcu_sync structure to use for synchronization}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjxubh)}(h**Description**h]j)}(hjؿh]h Description}(hjڿhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjֿubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:417: ./include/linux/rcu_sync.hhKhjxubh)}(hReturns true if readers are permitted to use their fastpaths. Must be invoked within some flavor of RCU read-side critical section.h]hReturns true if readers are permitted to use their fastpaths. Must be invoked within some flavor of RCU read-side critical section.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:417: ./include/linux/rcu_sync.hhKhjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_sync_init (C function)c.rcu_sync_inithNtauh1hhjhhhNhNubj)}(hhh](j)}(h)void rcu_sync_init (struct rcu_sync *rsp)h]j)}(h(void rcu_sync_init(struct rcu_sync *rsp)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKubj2)}(h h]h }(hj,hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj+hKubj{)}(h rcu_sync_inith]j)}(h rcu_sync_inith]h rcu_sync_init}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj+hKubj)}(h(struct rcu_sync *rsp)h]j)}(hstruct rcu_sync *rsph](j)}(hjAh]hstruct}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj2)}(h h]h }(hjghhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubh)}(hhh]j)}(hrcu_synch]hrcu_sync}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjzmodnameN classnameNj] j` )}jc ]jf )}jY j@sbc.rcu_sync_initasbuh1hhjVubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjVubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj)}(hrsph]hrsp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjRubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj+hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj+hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj+hKhjhhubj)}(hhh]h)}(h Initialize an rcu_sync structureh]h Initialize an rcu_sync structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj+hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hZ**Parameters** ``struct rcu_sync *rsp`` Pointer to rcu_sync structure to be initializedh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhjubj )}(hhh]j)}(hH``struct rcu_sync *rsp`` Pointer to rcu_sync structure to be initializedh](j)}(h``struct rcu_sync *rsp``h]j)}(hjh]hstruct rcu_sync *rsp}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhjubj2)}(hhh]h)}(h/Pointer to rcu_sync structure to be initializedh]h/Pointer to rcu_sync structure to be initialized}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhj4ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj3hKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_sync_func (C function)c.rcu_sync_funchNtauh1hhjhhhNhNubj)}(hhh](j)}(h)void rcu_sync_func (struct rcu_head *rhp)h]j)}(h(void rcu_sync_func(struct rcu_head *rhp)h](j )}(hvoidh]hvoid}(hjxhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjthhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK#ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjthhhjhK#ubj{)}(h rcu_sync_funch]j)}(h rcu_sync_funch]h rcu_sync_func}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjthhhjhK#ubj)}(h(struct rcu_head *rhp)h]j)}(hstruct rcu_head *rhph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hrcu_headh]hrcu_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.rcu_sync_funcasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrhph]hrhp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjthhhjhK#ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjphhhjhK#ubah}(h]jkah ](jjeh"]h$]h&]jj)jhuh1jhjhK#hjmhhubj)}(hhh]h)}(h4Callback function managing reader access to fastpathh]h4Callback function managing reader access to fastpath}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK#hj5hhubah}(h]h ]h"]h$]h&]uh1jhjmhhhjhK#ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjPjjPjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_head *rhp`` Pointer to rcu_head in rcu_sync structure to use for synchronization **Description** This function is passed to call_rcu() function by rcu_sync_enter() and rcu_sync_exit(), so that it is invoked after a grace period following the that invocation of enter/exit. If it is called by rcu_sync_enter() it signals that all the readers were switched onto slow path. If it is called by rcu_sync_exit() it takes action based on events that have taken place in the meantime, so that closely spaced rcu_sync_enter() and rcu_sync_exit() pairs need not wait for a grace period. If another rcu_sync_enter() is invoked before the grace period ended, reset state to allow the next rcu_sync_exit() to let the readers back onto their fastpaths (after a grace period). If both another rcu_sync_enter() and its matching rcu_sync_exit() are invoked before the grace period ended, re-invoke call_rcu() on behalf of that rcu_sync_exit(). Otherwise, set all state back to idle so that readers can again use their fastpaths.h](h)}(h**Parameters**h]j)}(hjZh]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK'hjTubj )}(hhh]j)}(h^``struct rcu_head *rhp`` Pointer to rcu_head in rcu_sync structure to use for synchronization h](j)}(h``struct rcu_head *rhp``h]j)}(hjyh]hstruct rcu_head *rhp}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK$hjsubj2)}(hhh]h)}(hDPointer to rcu_head in rcu_sync structure to use for synchronizationh]hDPointer to rcu_head in rcu_sync structure to use for synchronization}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK$hjubah}(h]h ]h"]h$]h&]uh1j1hjsubeh}(h]h ]h"]h$]h&]uh1jhjhK$hjpubah}(h]h ]h"]h$]h&]uh1j hjTubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK&hjTubh)}(hThis function is passed to call_rcu() function by rcu_sync_enter() and rcu_sync_exit(), so that it is invoked after a grace period following the that invocation of enter/exit.h]hThis function is passed to call_rcu() function by rcu_sync_enter() and rcu_sync_exit(), so that it is invoked after a grace period following the that invocation of enter/exit.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK%hjTubh)}(haIf it is called by rcu_sync_enter() it signals that all the readers were switched onto slow path.h]haIf it is called by rcu_sync_enter() it signals that all the readers were switched onto slow path.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK)hjTubh)}(hIf it is called by rcu_sync_exit() it takes action based on events that have taken place in the meantime, so that closely spaced rcu_sync_enter() and rcu_sync_exit() pairs need not wait for a grace period.h]hIf it is called by rcu_sync_exit() it takes action based on events that have taken place in the meantime, so that closely spaced rcu_sync_enter() and rcu_sync_exit() pairs need not wait for a grace period.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK,hjTubh)}(hXIf another rcu_sync_enter() is invoked before the grace period ended, reset state to allow the next rcu_sync_exit() to let the readers back onto their fastpaths (after a grace period). If both another rcu_sync_enter() and its matching rcu_sync_exit() are invoked before the grace period ended, re-invoke call_rcu() on behalf of that rcu_sync_exit(). Otherwise, set all state back to idle so that readers can again use their fastpaths.h]hXIf another rcu_sync_enter() is invoked before the grace period ended, reset state to allow the next rcu_sync_exit() to let the readers back onto their fastpaths (after a grace period). If both another rcu_sync_enter() and its matching rcu_sync_exit() are invoked before the grace period ended, re-invoke call_rcu() on behalf of that rcu_sync_exit(). Otherwise, set all state back to idle so that readers can again use their fastpaths.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK0hjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_sync_enter (C function)c.rcu_sync_enterhNtauh1hhjhhhNhNubj)}(hhh](j)}(h*void rcu_sync_enter (struct rcu_sync *rsp)h]j)}(h)void rcu_sync_enter(struct rcu_sync *rsp)h](j )}(hvoidh]hvoid}(hj&hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj"hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK[ubj2)}(h h]h }(hj5hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"hhhj4hK[ubj{)}(hrcu_sync_enterh]j)}(hrcu_sync_enterh]hrcu_sync_enter}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj"hhhj4hK[ubj)}(h(struct rcu_sync *rsp)h]j)}(hstruct rcu_sync *rsph](j)}(hjAh]hstruct}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj2)}(h h]h }(hjphhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubh)}(hhh]j)}(hrcu_synch]hrcu_sync}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jIsbc.rcu_sync_enterasbuh1hhj_ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj_ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hrsph]hrsp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj[ubah}(h]h ]h"]h$]h&]jjuh1jhj"hhhj4hK[ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj4hK[ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj4hK[hjhhubj)}(hhh]h)}(hForce readers onto slowpathh]hForce readers onto slowpath}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK[hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj4hK[ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_sync *rsp`` Pointer to rcu_sync structure to use for synchronization **Description** This function is used by updaters who need readers to make use of a slowpath during the update. After this function returns, all subsequent calls to rcu_sync_is_idle() will return false, which tells readers to stay off their fastpaths. A later call to rcu_sync_exit() re-enables reader fastpaths. When called in isolation, rcu_sync_enter() must wait for a grace period, however, closely spaced calls to rcu_sync_enter() can optimize away the grace-period wait via a state machine implemented by rcu_sync_enter(), rcu_sync_exit(), and rcu_sync_func().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK_hjubj )}(hhh]j)}(hR``struct rcu_sync *rsp`` Pointer to rcu_sync structure to use for synchronization h](j)}(h``struct rcu_sync *rsp``h]j)}(hj'h]hstruct rcu_sync *rsp}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK\hj!ubj2)}(hhh]h)}(h8Pointer to rcu_sync structure to use for synchronizationh]h8Pointer to rcu_sync structure to use for synchronization}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hK\hj=ubah}(h]h ]h"]h$]h&]uh1j1hj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hK\hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjbh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK^hjubh)}(hX*This function is used by updaters who need readers to make use of a slowpath during the update. After this function returns, all subsequent calls to rcu_sync_is_idle() will return false, which tells readers to stay off their fastpaths. A later call to rcu_sync_exit() re-enables reader fastpaths.h]hX*This function is used by updaters who need readers to make use of a slowpath during the update. After this function returns, all subsequent calls to rcu_sync_is_idle() will return false, which tells readers to stay off their fastpaths. A later call to rcu_sync_exit() re-enables reader fastpaths.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chK]hjubh)}(hWhen called in isolation, rcu_sync_enter() must wait for a grace period, however, closely spaced calls to rcu_sync_enter() can optimize away the grace-period wait via a state machine implemented by rcu_sync_enter(), rcu_sync_exit(), and rcu_sync_func().h]hWhen called in isolation, rcu_sync_enter() must wait for a grace period, however, closely spaced calls to rcu_sync_enter() can optimize away the grace-period wait via a state machine implemented by rcu_sync_enter(), rcu_sync_exit(), and rcu_sync_func().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKchjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_sync_exit (C function)c.rcu_sync_exithNtauh1hhjhhhNhNubj)}(hhh](j)}(h)void rcu_sync_exit (struct rcu_sync *rsp)h]j)}(h(void rcu_sync_exit(struct rcu_sync *rsp)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(h rcu_sync_exith]j)}(h rcu_sync_exith]h rcu_sync_exit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(struct rcu_sync *rsp)h]j)}(hstruct rcu_sync *rsph](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hrcu_synch]hrcu_sync}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.rcu_sync_exitasbuh1hhjubj2)}(h h]h }(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(h j?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrsph]hrsp}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h4Allow readers back onto fast path after grace periodh]h4Allow readers back onto fast path after grace period}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhjshhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_sync *rsp`` Pointer to rcu_sync structure to use for synchronization **Description** This function is used by updaters who have completed, and can therefore now allow readers to make use of their fastpaths after a grace period has elapsed. After this grace period has completed, all subsequent calls to rcu_sync_is_idle() will return true, which tells readers that they can once again use their fastpaths.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhjubj )}(hhh]j)}(hR``struct rcu_sync *rsp`` Pointer to rcu_sync structure to use for synchronization h](j)}(h``struct rcu_sync *rsp``h]j)}(hjh]hstruct rcu_sync *rsp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhjubj2)}(hhh]h)}(h8Pointer to rcu_sync structure to use for synchronizationh]h8Pointer to rcu_sync structure to use for synchronization}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhjubh)}(hXAThis function is used by updaters who have completed, and can therefore now allow readers to make use of their fastpaths after a grace period has elapsed. After this grace period has completed, all subsequent calls to rcu_sync_is_idle() will return true, which tells readers that they can once again use their fastpaths.h]hXAThis function is used by updaters who have completed, and can therefore now allow readers to make use of their fastpaths after a grace period has elapsed. After this grace period has completed, all subsequent calls to rcu_sync_is_idle() will return true, which tells readers that they can once again use their fastpaths.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_sync_dtor (C function)c.rcu_sync_dtorhNtauh1hhjhhhNhNubj)}(hhh](j)}(h)void rcu_sync_dtor (struct rcu_sync *rsp)h]j)}(h(void rcu_sync_dtor(struct rcu_sync *rsp)h](j )}(hvoidh]hvoid}(hj7hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj3hhhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKubj2)}(h h]h }(hjFhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3hhhjEhKubj{)}(h rcu_sync_dtorh]j)}(h rcu_sync_dtorh]h rcu_sync_dtor}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj3hhhjEhKubj)}(h(struct rcu_sync *rsp)h]j)}(hstruct rcu_sync *rsph](j)}(hjAh]hstruct}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubh)}(hhh]j)}(hrcu_synch]hrcu_sync}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jZsbc.rcu_sync_dtorasbuh1hhjpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjpubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj)}(hrsph]hrsp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjlubah}(h]h ]h"]h$]h&]jjuh1jhj3hhhjEhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj/hhhjEhKubah}(h]j*ah ](jjeh"]h$]h&]jj)jhuh1jhjEhKhj,hhubj)}(hhh]h)}(hClean up an rcu_sync structureh]hClean up an rcu_sync structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhj,hhhjEhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hY**Parameters** ``struct rcu_sync *rsp`` Pointer to rcu_sync structure to be cleaned uph](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhjubj )}(hhh]j)}(hG``struct rcu_sync *rsp`` Pointer to rcu_sync structure to be cleaned uph](j)}(h``struct rcu_sync *rsp``h]j)}(hj8h]hstruct rcu_sync *rsp}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhj2ubj2)}(hhh]h)}(h.Pointer to rcu_sync structure to be cleaned uph]h.Pointer to rcu_sync structure to be cleaned up}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:419: ./kernel/rcu/sync.chKhjNubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhKhj/ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_tasks_percpu (C struct)c.rcu_tasks_percpuhNtauh1hhjhhhNhNubj)}(hhh](j)}(hrcu_tasks_percpuh]j)}(hstruct rcu_tasks_percpuh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hrcu_tasks_percpuh]j)}(hjh]hrcu_tasks_percpu}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h?Per-CPU component of definition for a Tasks-RCU-like mechanism.h]h?Per-CPU component of definition for a Tasks-RCU-like mechanism.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Definition**:: struct rcu_tasks_percpu { struct rcu_segcblist cblist; raw_spinlock_t lock; unsigned long rtp_jiffies; unsigned long rtp_n_lock_retries; struct timer_list lazy_timer; unsigned int urgent_gp; struct work_struct rtp_work; struct irq_work rtp_irq_work; struct rcu_head barrier_q_head; struct list_head rtp_blkd_tasks; struct list_head rtp_exit_list; int cpu; int index; struct rcu_tasks *rtpp; }; **Members** ``cblist`` Callback list. ``lock`` Lock protecting per-CPU callback list. ``rtp_jiffies`` Jiffies counter value for statistics. ``rtp_n_lock_retries`` Rough lock-contention statistic. ``lazy_timer`` Timer to unlazify callbacks. ``urgent_gp`` Number of additional non-lazy grace periods. ``rtp_work`` Work queue for invoking callbacks. ``rtp_irq_work`` IRQ work queue for deferred wakeups. ``barrier_q_head`` RCU callback for barrier operation. ``rtp_blkd_tasks`` List of tasks blocked as readers. ``rtp_exit_list`` List of tasks in the latter portion of do_exit(). ``cpu`` CPU number corresponding to this entry. ``index`` Index of this CPU in rtpcp_array of the rcu_tasks structure. ``rtpp`` Pointer to the rcu_tasks structure.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjubj7C)}(hXstruct rcu_tasks_percpu { struct rcu_segcblist cblist; raw_spinlock_t lock; unsigned long rtp_jiffies; unsigned long rtp_n_lock_retries; struct timer_list lazy_timer; unsigned int urgent_gp; struct work_struct rtp_work; struct irq_work rtp_irq_work; struct rcu_head barrier_q_head; struct list_head rtp_blkd_tasks; struct list_head rtp_exit_list; int cpu; int index; struct rcu_tasks *rtpp; };h]hXstruct rcu_tasks_percpu { struct rcu_segcblist cblist; raw_spinlock_t lock; unsigned long rtp_jiffies; unsigned long rtp_n_lock_retries; struct timer_list lazy_timer; unsigned int urgent_gp; struct work_struct rtp_work; struct irq_work rtp_irq_work; struct rcu_head barrier_q_head; struct list_head rtp_blkd_tasks; struct list_head rtp_exit_list; int cpu; int index; struct rcu_tasks *rtpp; };}hjsbah}(h]h ]h"]h$]h&]jjuh1j6ChW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjubh)}(h **Members**h]j)}(hj"h]hMembers}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK/hjubj )}(hhh](j)}(h``cblist`` Callback list. h](j)}(h ``cblist``h]j)}(hjAh]hcblist}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhj;ubj2)}(hhh]h)}(hCallback list.h]hCallback list.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhKhjWubah}(h]h ]h"]h$]h&]uh1j1hj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhKhj8ubj)}(h0``lock`` Lock protecting per-CPU callback list. h](j)}(h``lock``h]j)}(hjzh]hlock}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjtubj2)}(hhh]h)}(h&Lock protecting per-CPU callback list.h]h&Lock protecting per-CPU callback list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjtubeh}(h]h ]h"]h$]h&]uh1jhjhKhj8ubj)}(h6``rtp_jiffies`` Jiffies counter value for statistics. h](j)}(h``rtp_jiffies``h]j)}(hjh]h rtp_jiffies}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjubj2)}(hhh]h)}(h%Jiffies counter value for statistics.h]h%Jiffies counter value for statistics.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj8ubj)}(h8``rtp_n_lock_retries`` Rough lock-contention statistic. h](j)}(h``rtp_n_lock_retries``h]j)}(hjh]hrtp_n_lock_retries}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjubj2)}(hhh]h)}(h Rough lock-contention statistic.h]h Rough lock-contention statistic.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj8ubj)}(h,``lazy_timer`` Timer to unlazify callbacks. h](j)}(h``lazy_timer``h]j)}(hj%h]h lazy_timer}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjubj2)}(hhh]h)}(hTimer to unlazify callbacks.h]hTimer to unlazify callbacks.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hKhj;ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj:hKhj8ubj)}(h;``urgent_gp`` Number of additional non-lazy grace periods. h](j)}(h ``urgent_gp``h]j)}(hj^h]h urgent_gp}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjXubj2)}(hhh]h)}(h,Number of additional non-lazy grace periods.h]h,Number of additional non-lazy grace periods.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshKhjtubah}(h]h ]h"]h$]h&]uh1j1hjXubeh}(h]h ]h"]h$]h&]uh1jhjshKhj8ubj)}(h0``rtp_work`` Work queue for invoking callbacks. h](j)}(h ``rtp_work``h]j)}(hjh]hrtp_work}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK hjubj2)}(hhh]h)}(h"Work queue for invoking callbacks.h]h"Work queue for invoking callbacks.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK hj8ubj)}(h6``rtp_irq_work`` IRQ work queue for deferred wakeups. h](j)}(h``rtp_irq_work``h]j)}(hjh]h rtp_irq_work}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK!hjubj2)}(hhh]h)}(h$IRQ work queue for deferred wakeups.h]h$IRQ work queue for deferred wakeups.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK!hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK!hj8ubj)}(h7``barrier_q_head`` RCU callback for barrier operation. h](j)}(h``barrier_q_head``h]j)}(hj h]hbarrier_q_head}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK"hjubj2)}(hhh]h)}(h#RCU callback for barrier operation.h]h#RCU callback for barrier operation.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK"hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK"hj8ubj)}(h5``rtp_blkd_tasks`` List of tasks blocked as readers. h](j)}(h``rtp_blkd_tasks``h]j)}(hjBh]hrtp_blkd_tasks}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK#hj<ubj2)}(hhh]h)}(h!List of tasks blocked as readers.h]h!List of tasks blocked as readers.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhK#hjXubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhjWhK#hj8ubj)}(hD``rtp_exit_list`` List of tasks in the latter portion of do_exit(). h](j)}(h``rtp_exit_list``h]j)}(hj{h]h rtp_exit_list}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK$hjuubj2)}(hhh]h)}(h1List of tasks in the latter portion of do_exit().h]h1List of tasks in the latter portion of do_exit().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK$hjubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjhK$hj8ubj)}(h0``cpu`` CPU number corresponding to this entry. h](j)}(h``cpu``h]j)}(hjh]hcpu}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK%hjubj2)}(hhh]h)}(h'CPU number corresponding to this entry.h]h'CPU number corresponding to this entry.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK%hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK%hj8ubj)}(hG``index`` Index of this CPU in rtpcp_array of the rcu_tasks structure. h](j)}(h ``index``h]j)}(hjh]hindex}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK&hjubj2)}(hhh]h)}(hah"]h$]h&]uh1j1hj|hhhjhK-ubj{)}(h rcu_tasksh]j)}(hjzh]h rcu_tasks}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj|hhhjhK-ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjxhhhjhK-ubah}(h]jsah ](jjeh"]h$]h&]jj)jhuh1jhjhK-hjuhhubj)}(hhh]h)}(h*Definition for a Tasks-RCU-like mechanism.h]h*Definition for a Tasks-RCU-like mechanism.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK:hjhhubah}(h]h ]h"]h$]h&]uh1jhjuhhhjhK-ubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX **Definition**:: struct rcu_tasks { struct rcuwait cbs_wait; raw_spinlock_t cbs_gbl_lock; struct mutex tasks_gp_mutex; int gp_state; int gp_sleep; int init_fract; unsigned long gp_jiffies; unsigned long gp_start; unsigned long tasks_gp_seq; unsigned long n_ipis; unsigned long n_ipis_fails; struct task_struct *kthread_ptr; unsigned long lazy_jiffies; rcu_tasks_gp_func_t gp_func; pregp_func_t pregp_func; pertask_func_t pertask_func; postscan_func_t postscan_func; holdouts_func_t holdouts_func; postgp_func_t postgp_func; call_rcu_func_t call_func; unsigned int wait_state; struct rcu_tasks_percpu __percpu *rtpcpu; struct rcu_tasks_percpu **rtpcp_array; int percpu_enqueue_shift; int percpu_enqueue_lim; int percpu_dequeue_lim; unsigned long percpu_dequeue_gpseq; struct mutex barrier_q_mutex; atomic_t barrier_q_count; struct completion barrier_q_completion; unsigned long barrier_q_seq; unsigned long barrier_q_start; char *name; char *kname; }; **Members** ``cbs_wait`` RCU wait allowing a new callback to get kthread's attention. ``cbs_gbl_lock`` Lock protecting callback list. ``tasks_gp_mutex`` Mutex protecting grace period, needed during mid-boot dead zone. ``gp_state`` Grace period's most recent state transition (debugging). ``gp_sleep`` Per-grace-period sleep to prevent CPU-bound looping. ``init_fract`` Initial backoff sleep interval. ``gp_jiffies`` Time of last **gp_state** transition. ``gp_start`` Most recent grace-period start in jiffies. ``tasks_gp_seq`` Number of grace periods completed since boot in upper bits. ``n_ipis`` Number of IPIs sent to encourage grace periods to end. ``n_ipis_fails`` Number of IPI-send failures. ``kthread_ptr`` This flavor's grace-period/callback-invocation kthread. ``lazy_jiffies`` Number of jiffies to allow callbacks to be lazy. ``gp_func`` This flavor's grace-period-wait function. ``pregp_func`` This flavor's pre-grace-period function (optional). ``pertask_func`` This flavor's per-task scan function (optional). ``postscan_func`` This flavor's post-task scan function (optional). ``holdouts_func`` This flavor's holdout-list scan function (optional). ``postgp_func`` This flavor's post-grace-period function (optional). ``call_func`` This flavor's call_rcu()-equivalent function. ``wait_state`` Task state for synchronous grace-period waits (default TASK_UNINTERRUPTIBLE). ``rtpcpu`` This flavor's rcu_tasks_percpu structure. ``rtpcp_array`` Array of pointers to rcu_tasks_percpu structure of CPUs in cpu_possible_mask. ``percpu_enqueue_shift`` Shift down CPU ID this much when enqueuing callbacks. ``percpu_enqueue_lim`` Number of per-CPU callback queues in use for enqueuing. ``percpu_dequeue_lim`` Number of per-CPU callback queues in use for dequeuing. ``percpu_dequeue_gpseq`` RCU grace-period number to propagate enqueue limit to dequeuers. ``barrier_q_mutex`` Serialize barrier operations. ``barrier_q_count`` Number of queues being waited on. ``barrier_q_completion`` Barrier wait/wakeup mechanism. ``barrier_q_seq`` Sequence number for barrier operations. ``barrier_q_start`` Most recent barrier start in jiffies. ``name`` This flavor's textual name. ``kname`` This flavor's kthread name.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK>hjubj7C)}(hX-struct rcu_tasks { struct rcuwait cbs_wait; raw_spinlock_t cbs_gbl_lock; struct mutex tasks_gp_mutex; int gp_state; int gp_sleep; int init_fract; unsigned long gp_jiffies; unsigned long gp_start; unsigned long tasks_gp_seq; unsigned long n_ipis; unsigned long n_ipis_fails; struct task_struct *kthread_ptr; unsigned long lazy_jiffies; rcu_tasks_gp_func_t gp_func; pregp_func_t pregp_func; pertask_func_t pertask_func; postscan_func_t postscan_func; holdouts_func_t holdouts_func; postgp_func_t postgp_func; call_rcu_func_t call_func; unsigned int wait_state; struct rcu_tasks_percpu __percpu *rtpcpu; struct rcu_tasks_percpu **rtpcp_array; int percpu_enqueue_shift; int percpu_enqueue_lim; int percpu_dequeue_lim; unsigned long percpu_dequeue_gpseq; struct mutex barrier_q_mutex; atomic_t barrier_q_count; struct completion barrier_q_completion; unsigned long barrier_q_seq; unsigned long barrier_q_start; char *name; char *kname; };h]hX-struct rcu_tasks { struct rcuwait cbs_wait; raw_spinlock_t cbs_gbl_lock; struct mutex tasks_gp_mutex; int gp_state; int gp_sleep; int init_fract; unsigned long gp_jiffies; unsigned long gp_start; unsigned long tasks_gp_seq; unsigned long n_ipis; unsigned long n_ipis_fails; struct task_struct *kthread_ptr; unsigned long lazy_jiffies; rcu_tasks_gp_func_t gp_func; pregp_func_t pregp_func; pertask_func_t pertask_func; postscan_func_t postscan_func; holdouts_func_t holdouts_func; postgp_func_t postgp_func; call_rcu_func_t call_func; unsigned int wait_state; struct rcu_tasks_percpu __percpu *rtpcpu; struct rcu_tasks_percpu **rtpcp_array; int percpu_enqueue_shift; int percpu_enqueue_lim; int percpu_dequeue_lim; unsigned long percpu_dequeue_gpseq; struct mutex barrier_q_mutex; atomic_t barrier_q_count; struct completion barrier_q_completion; unsigned long barrier_q_seq; unsigned long barrier_q_start; char *name; char *kname; };}hjsbah}(h]h ]h"]h$]h&]jjuh1j6ChW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK@hjubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKehjubj )}(hhh](j)}(hJ``cbs_wait`` RCU wait allowing a new callback to get kthread's attention. h](j)}(h ``cbs_wait``h]j)}(hj/h]hcbs_wait}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKRCU wait allowing a new callback to get kthread’s attention.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhKhjubj2)}(hhh]h)}(h@Mutex protecting grace period, needed during mid-boot dead zone.h]h@Mutex protecting grace period, needed during mid-boot dead zone.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK>hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK>hj&ubj)}(hF``gp_state`` Grace period's most recent state transition (debugging). h](j)}(h ``gp_state``h]j)}(hjh]hgp_state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK@hjubj2)}(hhh]h)}(h8Grace period's most recent state transition (debugging).h]h:Grace period’s most recent state transition (debugging).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK@hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK@hj&ubj)}(hB``gp_sleep`` Per-grace-period sleep to prevent CPU-bound looping. h](j)}(h ``gp_sleep``h]j)}(hjh]hgp_sleep}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKAhj ubj2)}(hhh]h)}(h4Per-grace-period sleep to prevent CPU-bound looping.h]h4Per-grace-period sleep to prevent CPU-bound looping.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hKAhj)ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj(hKAhj&ubj)}(h/``init_fract`` Initial backoff sleep interval. h](j)}(h``init_fract``h]j)}(hjLh]h init_fract}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKBhjFubj2)}(hhh]h)}(hInitial backoff sleep interval.h]hInitial backoff sleep interval.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahKBhjbubah}(h]h ]h"]h$]h&]uh1j1hjFubeh}(h]h ]h"]h$]h&]uh1jhjahKBhj&ubj)}(h5``gp_jiffies`` Time of last **gp_state** transition. h](j)}(h``gp_jiffies``h]j)}(hjh]h gp_jiffies}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKChjubj2)}(hhh]h)}(h%Time of last **gp_state** transition.h](h Time of last }(hjhhhNhNubj)}(h **gp_state**h]hgp_state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh transition.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKChjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKChj&ubj)}(h8``gp_start`` Most recent grace-period start in jiffies. h](j)}(h ``gp_start``h]j)}(hjh]hgp_start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKDhjubj2)}(hhh]h)}(h*Most recent grace-period start in jiffies.h]h*Most recent grace-period start in jiffies.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKDhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKDhj&ubj)}(hM``tasks_gp_seq`` Number of grace periods completed since boot in upper bits. h](j)}(h``tasks_gp_seq``h]j)}(hj h]h tasks_gp_seq}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKEhjubj2)}(hhh]h)}(h;Number of grace periods completed since boot in upper bits.h]h;Number of grace periods completed since boot in upper bits.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKEhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKEhj&ubj)}(hB``n_ipis`` Number of IPIs sent to encourage grace periods to end. h](j)}(h ``n_ipis``h]j)}(hjBh]hn_ipis}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKFhj<ubj2)}(hhh]h)}(h6Number of IPIs sent to encourage grace periods to end.h]h6Number of IPIs sent to encourage grace periods to end.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhKFhjXubah}(h]h ]h"]h$]h&]uh1j1hj<ubeh}(h]h ]h"]h$]h&]uh1jhjWhKFhj&ubj)}(h.``n_ipis_fails`` Number of IPI-send failures. h](j)}(h``n_ipis_fails``h]j)}(hj{h]h n_ipis_fails}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKGhjuubj2)}(hhh]h)}(hNumber of IPI-send failures.h]hNumber of IPI-send failures.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKGhjubah}(h]h ]h"]h$]h&]uh1j1hjuubeh}(h]h ]h"]h$]h&]uh1jhjhKGhj&ubj)}(hH``kthread_ptr`` This flavor's grace-period/callback-invocation kthread. h](j)}(h``kthread_ptr``h]j)}(hjh]h kthread_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKHhjubj2)}(hhh]h)}(h7This flavor's grace-period/callback-invocation kthread.h]h9This flavor’s grace-period/callback-invocation kthread.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKHhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKHhj&ubj)}(hB``lazy_jiffies`` Number of jiffies to allow callbacks to be lazy. h](j)}(h``lazy_jiffies``h]j)}(hjh]h lazy_jiffies}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKIhjubj2)}(hhh]h)}(h0Number of jiffies to allow callbacks to be lazy.h]h0Number of jiffies to allow callbacks to be lazy.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKIhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKIhj&ubj)}(h6``gp_func`` This flavor's grace-period-wait function. h](j)}(h ``gp_func``h]j)}(hj&h]hgp_func}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK?hj ubj2)}(hhh]h)}(h)This flavor's grace-period-wait function.h]h+This flavor’s grace-period-wait function.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hK?hj<ubah}(h]h ]h"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]uh1jhj;hK?hj&ubj)}(hC``pregp_func`` This flavor's pre-grace-period function (optional). h](j)}(h``pregp_func``h]j)}(hj_h]h pregp_func}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKJhjYubj2)}(hhh]h)}(h3This flavor's pre-grace-period function (optional).h]h5This flavor’s pre-grace-period function (optional).}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthKJhjuubah}(h]h ]h"]h$]h&]uh1j1hjYubeh}(h]h ]h"]h$]h&]uh1jhjthKJhj&ubj)}(hB``pertask_func`` This flavor's per-task scan function (optional). h](j)}(h``pertask_func``h]j)}(hjh]h pertask_func}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKKhjubj2)}(hhh]h)}(h0This flavor's per-task scan function (optional).h]h2This flavor’s per-task scan function (optional).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKKhj&ubj)}(hD``postscan_func`` This flavor's post-task scan function (optional). h](j)}(h``postscan_func``h]j)}(hjh]h postscan_func}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKLhjubj2)}(hhh]h)}(h1This flavor's post-task scan function (optional).h]h3This flavor’s post-task scan function (optional).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKLhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKLhj&ubj)}(hG``holdouts_func`` This flavor's holdout-list scan function (optional). h](j)}(h``holdouts_func``h]j)}(hj h]h holdouts_func}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKMhjubj2)}(hhh]h)}(h4This flavor's holdout-list scan function (optional).h]h6This flavor’s holdout-list scan function (optional).}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKMhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKMhj&ubj)}(hE``postgp_func`` This flavor's post-grace-period function (optional). h](j)}(h``postgp_func``h]j)}(hjCh]h postgp_func}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKNhj=ubj2)}(hhh]h)}(h4This flavor's post-grace-period function (optional).h]h6This flavor’s post-grace-period function (optional).}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhKNhjYubah}(h]h ]h"]h$]h&]uh1j1hj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhKNhj&ubj)}(h<``call_func`` This flavor's call_rcu()-equivalent function. h](j)}(h ``call_func``h]j)}(hj|h]h call_func}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKOhjvubj2)}(hhh]h)}(h-This flavor's call_rcu()-equivalent function.h]h/This flavor’s call_rcu()-equivalent function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKOhjubah}(h]h ]h"]h$]h&]uh1j1hjvubeh}(h]h ]h"]h$]h&]uh1jhjhKOhj&ubj)}(h]``wait_state`` Task state for synchronous grace-period waits (default TASK_UNINTERRUPTIBLE). h](j)}(h``wait_state``h]j)}(hjh]h wait_state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKPhjubj2)}(hhh]h)}(hMTask state for synchronous grace-period waits (default TASK_UNINTERRUPTIBLE).h]hMTask state for synchronous grace-period waits (default TASK_UNINTERRUPTIBLE).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKPhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKPhj&ubj)}(h5``rtpcpu`` This flavor's rcu_tasks_percpu structure. h](j)}(h ``rtpcpu``h]j)}(hjh]hrtpcpu}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKQhjubj2)}(hhh]h)}(h)This flavor's rcu_tasks_percpu structure.h]h+This flavor’s rcu_tasks_percpu structure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKQhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKQhj&ubj)}(h^``rtpcp_array`` Array of pointers to rcu_tasks_percpu structure of CPUs in cpu_possible_mask. h](j)}(h``rtpcp_array``h]j)}(hj'h]h rtpcp_array}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKRhj!ubj2)}(hhh]h)}(hMArray of pointers to rcu_tasks_percpu structure of CPUs in cpu_possible_mask.h]hMArray of pointers to rcu_tasks_percpu structure of CPUs in cpu_possible_mask.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hKRhj=ubah}(h]h ]h"]h$]h&]uh1j1hj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hKRhj&ubj)}(hO``percpu_enqueue_shift`` Shift down CPU ID this much when enqueuing callbacks. h](j)}(h``percpu_enqueue_shift``h]j)}(hj`h]hpercpu_enqueue_shift}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKShjZubj2)}(hhh]h)}(h5Shift down CPU ID this much when enqueuing callbacks.h]h5Shift down CPU ID this much when enqueuing callbacks.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhKShjvubah}(h]h ]h"]h$]h&]uh1j1hjZubeh}(h]h ]h"]h$]h&]uh1jhjuhKShj&ubj)}(hO``percpu_enqueue_lim`` Number of per-CPU callback queues in use for enqueuing. h](j)}(h``percpu_enqueue_lim``h]j)}(hjh]hpercpu_enqueue_lim}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKThjubj2)}(hhh]h)}(h7Number of per-CPU callback queues in use for enqueuing.h]h7Number of per-CPU callback queues in use for enqueuing.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKThjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKThj&ubj)}(hO``percpu_dequeue_lim`` Number of per-CPU callback queues in use for dequeuing. h](j)}(h``percpu_dequeue_lim``h]j)}(hjh]hpercpu_dequeue_lim}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKUhjubj2)}(hhh]h)}(h7Number of per-CPU callback queues in use for dequeuing.h]h7Number of per-CPU callback queues in use for dequeuing.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKUhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKUhj&ubj)}(hZ``percpu_dequeue_gpseq`` RCU grace-period number to propagate enqueue limit to dequeuers. h](j)}(h``percpu_dequeue_gpseq``h]j)}(hj h]hpercpu_dequeue_gpseq}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKVhjubj2)}(hhh]h)}(h@RCU grace-period number to propagate enqueue limit to dequeuers.h]h@RCU grace-period number to propagate enqueue limit to dequeuers.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKVhj!ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj hKVhj&ubj)}(h2``barrier_q_mutex`` Serialize barrier operations. h](j)}(h``barrier_q_mutex``h]j)}(hjDh]hbarrier_q_mutex}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKWhj>ubj2)}(hhh]h)}(hSerialize barrier operations.h]hSerialize barrier operations.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhKWhjZubah}(h]h ]h"]h$]h&]uh1j1hj>ubeh}(h]h ]h"]h$]h&]uh1jhjYhKWhj&ubj)}(h6``barrier_q_count`` Number of queues being waited on. h](j)}(h``barrier_q_count``h]j)}(hj}h]hbarrier_q_count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKXhjwubj2)}(hhh]h)}(h!Number of queues being waited on.h]h!Number of queues being waited on.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKXhjubah}(h]h ]h"]h$]h&]uh1j1hjwubeh}(h]h ]h"]h$]h&]uh1jhjhKXhj&ubj)}(h8``barrier_q_completion`` Barrier wait/wakeup mechanism. h](j)}(h``barrier_q_completion``h]j)}(hjh]hbarrier_q_completion}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKYhjubj2)}(hhh]h)}(hBarrier wait/wakeup mechanism.h]hBarrier wait/wakeup mechanism.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKYhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKYhj&ubj)}(h:``barrier_q_seq`` Sequence number for barrier operations. h](j)}(h``barrier_q_seq``h]j)}(hjh]h barrier_q_seq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKZhjubj2)}(hhh]h)}(h'Sequence number for barrier operations.h]h'Sequence number for barrier operations.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKZhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKZhj&ubj)}(h:``barrier_q_start`` Most recent barrier start in jiffies. h](j)}(h``barrier_q_start``h]j)}(hj(h]hbarrier_q_start}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK[hj"ubj2)}(hhh]h)}(h%Most recent barrier start in jiffies.h]h%Most recent barrier start in jiffies.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK[hj>ubah}(h]h ]h"]h$]h&]uh1j1hj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hK[hj&ubj)}(h%``name`` This flavor's textual name. h](j)}(h``name``h]j)}(hjah]hname}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK\hj[ubj2)}(hhh]h)}(hThis flavor's textual name.h]hThis flavor’s textual name.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhK\hjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhK\hj&ubj)}(h%``kname`` This flavor's kthread name.h](j)}(h ``kname``h]j)}(hjh]hkname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK\hjubj2)}(hhh]h)}(hThis flavor's kthread name.h]hThis flavor’s kthread name.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhK]hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK\hj&ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j call_rcu_tasks (C function)c.call_rcu_taskshNtauh1hhjhhhNhNubj)}(hhh](j)}(h?void call_rcu_tasks (struct rcu_head *rhp, rcu_callback_t func)h]j)}(h>void call_rcu_tasks(struct rcu_head *rhp, rcu_callback_t func)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hcall_rcu_tasksh]j)}(hcall_rcu_tasksh]hcall_rcu_tasks}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h+(struct rcu_head *rhp, rcu_callback_t func)h](j)}(hstruct rcu_head *rhph](j)}(hjAh]hstruct}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj2)}(h h]h }(hj>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubh)}(hhh]j)}(hrcu_headh]hrcu_head}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjQmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.call_rcu_tasksasbuh1hhj-ubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hrhph]hrhp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubj)}(hrcu_callback_t funch](h)}(hhh]j)}(hrcu_callback_th]hrcu_callback_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jkc.call_rcu_tasksasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hfunch]hfunc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h3Queue an RCU for invocation task-based grace periodh]h3Queue an RCU for invocation task-based grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_head *rhp`` structure to be used for queueing the RCU updates. ``rcu_callback_t func`` actual callback function to be invoked after the grace period **Description** The callback function will be invoked some time after a full grace period elapses, in other words after all currently executing RCU read-side critical sections have completed. call_rcu_tasks() assumes that the read-side critical sections end at a voluntary context switch (not a preemption!), cond_resched_tasks_rcu_qs(), entry into idle, or transition to usermode execution. As such, there are no read-side primitives analogous to rcu_read_lock() and rcu_read_unlock() because this primitive is intended to determine that all tasks have passed through a safe state, not so much for data-structure synchronization. See the description of call_rcu() for more detailed information on memory ordering guarantees.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjubj )}(hhh](j)}(hL``struct rcu_head *rhp`` structure to be used for queueing the RCU updates. h](j)}(h``struct rcu_head *rhp``h]j)}(hj=h]hstruct rcu_head *rhp}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhj7ubj2)}(hhh]h)}(h2structure to be used for queueing the RCU updates.h]h2structure to be used for queueing the RCU updates.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhjSubah}(h]h ]h"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhMhj4ubj)}(hV``rcu_callback_t func`` actual callback function to be invoked after the grace period h](j)}(h``rcu_callback_t func``h]j)}(hjvh]hrcu_callback_t func}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjpubj2)}(hhh]h)}(h=actual callback function to be invoked after the grace periodh]h=actual callback function to be invoked after the grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjpubeh}(h]h ]h"]h$]h&]uh1jhjhMhj4ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjubh)}(hXgThe callback function will be invoked some time after a full grace period elapses, in other words after all currently executing RCU read-side critical sections have completed. call_rcu_tasks() assumes that the read-side critical sections end at a voluntary context switch (not a preemption!), cond_resched_tasks_rcu_qs(), entry into idle, or transition to usermode execution. As such, there are no read-side primitives analogous to rcu_read_lock() and rcu_read_unlock() because this primitive is intended to determine that all tasks have passed through a safe state, not so much for data-structure synchronization.h]hXgThe callback function will be invoked some time after a full grace period elapses, in other words after all currently executing RCU read-side critical sections have completed. call_rcu_tasks() assumes that the read-side critical sections end at a voluntary context switch (not a preemption!), cond_resched_tasks_rcu_qs(), entry into idle, or transition to usermode execution. As such, there are no read-side primitives analogous to rcu_read_lock() and rcu_read_unlock() because this primitive is intended to determine that all tasks have passed through a safe state, not so much for data-structure synchronization.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjubh)}(h^See the description of call_rcu() for more detailed information on memory ordering guarantees.h]h^See the description of call_rcu() for more detailed information on memory ordering guarantees.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "synchronize_rcu_tasks (C function)c.synchronize_rcu_taskshNtauh1hhjhhhNhNubj)}(hhh](j)}(h!void synchronize_rcu_tasks (void)h]j)}(h void synchronize_rcu_tasks(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(hsynchronize_rcu_tasksh]j)}(hsynchronize_rcu_tasksh]hsynchronize_rcu_tasks}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjBhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h1wait until an rcu-tasks grace period has elapsed.h]h1wait until an rcu-tasks grace period has elapsed.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjihhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX7**Parameters** ``void`` no arguments **Description** Control will return to the caller some time after a full rcu-tasks grace period has elapsed, in other words after all currently executing rcu-tasks read-side critical sections have elapsed. These read-side critical sections are delimited by calls to schedule(), cond_resched_tasks_rcu_qs(), idle execution, userspace execution, calls to synchronize_rcu_tasks(), and (in theory, anyway) cond_resched(). This is a very specialized primitive, intended only for a few uses in tracing and other situations requiring manipulation of function preambles and profiling hooks. The synchronize_rcu_tasks() function is not (yet) intended for heavy use from multiple CPUs. See the description of synchronize_rcu() for more detailed information on memory ordering guarantees.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjubh)}(hXControl will return to the caller some time after a full rcu-tasks grace period has elapsed, in other words after all currently executing rcu-tasks read-side critical sections have elapsed. These read-side critical sections are delimited by calls to schedule(), cond_resched_tasks_rcu_qs(), idle execution, userspace execution, calls to synchronize_rcu_tasks(), and (in theory, anyway) cond_resched().h]hXControl will return to the caller some time after a full rcu-tasks grace period has elapsed, in other words after all currently executing rcu-tasks read-side critical sections have elapsed. These read-side critical sections are delimited by calls to schedule(), cond_resched_tasks_rcu_qs(), idle execution, userspace execution, calls to synchronize_rcu_tasks(), and (in theory, anyway) cond_resched().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjubh)}(hXThis is a very specialized primitive, intended only for a few uses in tracing and other situations requiring manipulation of function preambles and profiling hooks. The synchronize_rcu_tasks() function is not (yet) intended for heavy use from multiple CPUs.h]hXThis is a very specialized primitive, intended only for a few uses in tracing and other situations requiring manipulation of function preambles and profiling hooks. The synchronize_rcu_tasks() function is not (yet) intended for heavy use from multiple CPUs.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjubh)}(heSee the description of synchronize_rcu() for more detailed information on memory ordering guarantees.h]heSee the description of synchronize_rcu() for more detailed information on memory ordering guarantees.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcu_barrier_tasks (C function)c.rcu_barrier_taskshNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_barrier_tasks (void)h]j)}(hvoid rcu_barrier_tasks(void)h](j )}(hvoidh]hvoid}(hjKhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjGhhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMubj2)}(h h]h }(hjZhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjGhhhjYhMubj{)}(hrcu_barrier_tasksh]j)}(hrcu_barrier_tasksh]hrcu_barrier_tasks}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjGhhhjYhMubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjGhhhjYhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjChhhjYhMubah}(h]j>ah ](jjeh"]h$]h&]jj)jhuh1jhjYhMhj@hhubj)}(hhh]h)}(h.Wait for in-flight call_rcu_tasks() callbacks.h]h.Wait for in-flight call_rcu_tasks() callbacks.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhj@hhhjYhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``void`` no arguments **Description** Although the current implementation is guaranteed to wait, it is not obligated to, for example, if there are no pending callbacks.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj.h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjubh)}(hAlthough the current implementation is guaranteed to wait, it is not obligated to, for example, if there are no pending callbacks.h]hAlthough the current implementation is guaranteed to wait, it is not obligated to, for example, if there are no pending callbacks.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 'synchronize_rcu_tasks_rude (C function)c.synchronize_rcu_tasks_rudehNtauh1hhjhhhNhNubj)}(hhh](j)}(h&void synchronize_rcu_tasks_rude (void)h]j)}(h%void synchronize_rcu_tasks_rude(void)h](j )}(hvoidh]hvoid}(hjshhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjohhhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjohhhjhMhubj{)}(hsynchronize_rcu_tasks_rudeh]j)}(hsynchronize_rcu_tasks_rudeh]hsynchronize_rcu_tasks_rude}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjohhhjhMhubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjohhhjhMhubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjkhhhjhMhubah}(h]jfah ](jjeh"]h$]h&]jj)jhuh1jhjhMhhjhhhubj)}(hhh]h)}(h&wait for a rude rcu-tasks grace periodh]h&wait for a rude rcu-tasks grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMhhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhhjhMhubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX+**Parameters** ``void`` no arguments **Description** Control will return to the caller some time after a rude rcu-tasks grace period has elapsed, in other words after all currently executing rcu-tasks read-side critical sections have elapsed. These read-side critical sections are delimited by calls to schedule(), cond_resched_tasks_rcu_qs(), userspace execution (which is a schedulable context), and (in theory, anyway) cond_resched(). This is a very specialized primitive, intended only for a few uses in tracing and other situations requiring manipulation of function preambles and profiling hooks. The synchronize_rcu_tasks_rude() function is not (yet) intended for heavy use from multiple CPUs. See the description of synchronize_rcu() for more detailed information on memory ordering guarantees.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMlhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hKhj1ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj0hKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjVh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhKhjubh)}(hXControl will return to the caller some time after a rude rcu-tasks grace period has elapsed, in other words after all currently executing rcu-tasks read-side critical sections have elapsed. These read-side critical sections are delimited by calls to schedule(), cond_resched_tasks_rcu_qs(), userspace execution (which is a schedulable context), and (in theory, anyway) cond_resched().h]hXControl will return to the caller some time after a rude rcu-tasks grace period has elapsed, in other words after all currently executing rcu-tasks read-side critical sections have elapsed. These read-side critical sections are delimited by calls to schedule(), cond_resched_tasks_rcu_qs(), userspace execution (which is a schedulable context), and (in theory, anyway) cond_resched().}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMihjubh)}(hXThis is a very specialized primitive, intended only for a few uses in tracing and other situations requiring manipulation of function preambles and profiling hooks. The synchronize_rcu_tasks_rude() function is not (yet) intended for heavy use from multiple CPUs.h]hXThis is a very specialized primitive, intended only for a few uses in tracing and other situations requiring manipulation of function preambles and profiling hooks. The synchronize_rcu_tasks_rude() function is not (yet) intended for heavy use from multiple CPUs.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMphjubh)}(heSee the description of synchronize_rcu() for more detailed information on memory ordering guarantees.h]heSee the description of synchronize_rcu() for more detailed information on memory ordering guarantees.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:421: ./kernel/rcu/tasks.hhMuhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  rcu_cpu_stall_reset (C function)c.rcu_cpu_stall_resethNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_cpu_stall_reset (void)h]j)}(hvoid rcu_cpu_stall_reset(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(hrcu_cpu_stall_reseth]j)}(hrcu_cpu_stall_reseth]hrcu_cpu_stall_reset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h6restart stall-warning timeout for current grace periodh]h6restart stall-warning timeout for current grace period}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj8jj8jjjuh1jhhhjhNhNubj)}(hXg**Parameters** ``void`` no arguments **Description** To perform the reset request from the caller, disable stall detection until 3 fqs loops have passed. This is required to ensure a fresh jiffies is loaded. It should be safe to do from the fqs loop as enough timer interrupts and context switches should have passed. The caller must disable hard irqs.h](h)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhKhj<ubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjah]hvoid}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhKhj[ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhKhjwubah}(h]h ]h"]h$]h&]uh1j1hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhKhjXubah}(h]h ]h"]h$]h&]uh1j hj<ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhKhj<ubh)}(hX To perform the reset request from the caller, disable stall detection until 3 fqs loops have passed. This is required to ensure a fresh jiffies is loaded. It should be safe to do from the fqs loop as enough timer interrupts and context switches should have passed.h]hX To perform the reset request from the caller, disable stall detection until 3 fqs loops have passed. This is required to ensure a fresh jiffies is loaded. It should be safe to do from the fqs loop as enough timer interrupts and context switches should have passed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhKhj<ubh)}(h"The caller must disable hard irqs.h]h"The caller must disable hard irqs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhKhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j .rcu_stall_chain_notifier_register (C function)#c.rcu_stall_chain_notifier_registerhNtauh1hhjhhhNhNubj)}(hhh](j)}(h@int rcu_stall_chain_notifier_register (struct notifier_block *n)h]j)}(h?int rcu_stall_chain_notifier_register(struct notifier_block *n)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMkubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMkubj{)}(h!rcu_stall_chain_notifier_registerh]j)}(h!rcu_stall_chain_notifier_registerh]h!rcu_stall_chain_notifier_register}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMkubj)}(h(struct notifier_block *n)h]j)}(hstruct notifier_block *nh](j)}(hjAh]hstruct}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj2)}(h h]h }(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubh)}(hhh]j)}(hnotifier_blockh]hnotifier_block}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjMmodnameN classnameNj] j` )}jc ]jf )}jY jsb#c.rcu_stall_chain_notifier_registerasbuh1hhj)ubj2)}(h h]h }(hjkhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hjh]hn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj%ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMkubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMkubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMkhjhhubj)}(hhh]h)}(hAdd an RCU CPU stall notifierh]hAdd an RCU CPU stall notifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMkhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMkubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXq**Parameters** ``struct notifier_block *n`` Entry to add. **Description** Adds an RCU CPU stall notifier to an atomic notifier chain. The **action** passed to a notifier will be **RCU_STALL_NOTIFY_NORM** or friends. The **data** will be the duration of the stalled grace period, in jiffies, coerced to a void* pointer. Returns 0 on success, ``-EEXIST`` on error.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMohjubj )}(hhh]j)}(h+``struct notifier_block *n`` Entry to add. h](j)}(h``struct notifier_block *n``h]j)}(hjh]hstruct notifier_block *n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMlhjubj2)}(hhh]h)}(h Entry to add.h]h Entry to add.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMlhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMlhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj+h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMnhjubh)}(hAdds an RCU CPU stall notifier to an atomic notifier chain. The **action** passed to a notifier will be **RCU_STALL_NOTIFY_NORM** or friends. The **data** will be the duration of the stalled grace period, in jiffies, coerced to a void* pointer.h](h@Adds an RCU CPU stall notifier to an atomic notifier chain. The }(hjAhhhNhNubj)}(h **action**h]haction}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh passed to a notifier will be }(hjAhhhNhNubj)}(h**RCU_STALL_NOTIFY_NORM**h]hRCU_STALL_NOTIFY_NORM}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh or friends. The }(hjAhhhNhNubj)}(h**data**h]hdata}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubhZ will be the duration of the stalled grace period, in jiffies, coerced to a void* pointer.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMmhjubh)}(h+Returns 0 on success, ``-EEXIST`` on error.h](hReturns 0 on success, }(hjhhhNhNubj)}(h ``-EEXIST``h]h-EEXIST}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh on error.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMrhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j 0rcu_stall_chain_notifier_unregister (C function)%c.rcu_stall_chain_notifier_unregisterhNtauh1hhjhhhNhNubj)}(hhh](j)}(hBint rcu_stall_chain_notifier_unregister (struct notifier_block *n)h]j)}(hAint rcu_stall_chain_notifier_unregister(struct notifier_block *n)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhMubj{)}(h#rcu_stall_chain_notifier_unregisterh]j)}(h#rcu_stall_chain_notifier_unregisterh]h#rcu_stall_chain_notifier_unregister}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhMubj)}(h(struct notifier_block *n)h]j)}(hstruct notifier_block *nh](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hnotifier_blockh]hnotifier_block}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj$modnameN classnameNj] j` )}jc ]jf )}jY jsb%c.rcu_stall_chain_notifier_unregisterasbuh1hhjubj2)}(h h]h }(hjBhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hn}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h Remove an RCU CPU stall notifierh]h Remove an RCU CPU stall notifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct notifier_block *n`` Entry to add. **Description** Removes an RCU CPU stall notifier from an atomic notifier chain. Returns zero on success, ``-ENOENT`` on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMhjubj )}(hhh]j)}(h+``struct notifier_block *n`` Entry to add. h](j)}(h``struct notifier_block *n``h]j)}(hjh]hstruct notifier_block *n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMhjubj2)}(hhh]h)}(h Entry to add.h]h Entry to add.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMhjubh)}(h@Removes an RCU CPU stall notifier from an atomic notifier chain.h]h@Removes an RCU CPU stall notifier from an atomic notifier chain.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMhjubh)}(h0Returns zero on success, ``-ENOENT`` on failure.h](hReturns zero on success, }(hj'hhhNhNubj)}(h ``-ENOENT``h]h-ENOENT}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh on failure.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:423: ./kernel/rcu/tree_stall.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j &rcu_read_lock_tasks_trace (C function)c.rcu_read_lock_tasks_tracehNtauh1hhjhhhNhNubj)}(hhh](j)}(h;struct srcu_ctr __percpu * rcu_read_lock_tasks_trace (void)h]j)}(h9struct srcu_ctr __percpu *rcu_read_lock_tasks_trace(void)h](j)}(hjAh]hstruct}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdhhhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhK&ubj2)}(h h]h }(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdhhhjuhK&ubh)}(hhh]j)}(hsrcu_ctrh]hsrcu_ctr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY rcu_read_lock_tasks_tracesbc.rcu_read_lock_tasks_traceasbuh1hhjdhhhjuhK&ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdhhhjuhK&ubh__percpu}(hjdhhhNhNubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjdhhhjuhK&ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdhhhjuhK&ubj{)}(hrcu_read_lock_tasks_traceh]j)}(hjh]hrcu_read_lock_tasks_trace}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjdhhhjuhK&ubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjdhhhjuhK&ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj`hhhjuhK&ubah}(h]j[ah ](jjeh"]h$]h&]jj)jhuh1jhjuhK&hj]hhubj)}(hhh]h)}(h6mark beginning of RCU-trace read-side critical sectionh]h6mark beginning of RCU-trace read-side critical section}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhK&hjhhubah}(h]h ]h"]h$]h&]uh1jhj]hhhjuhK&ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj6jj6jjjuh1jhhhjhNhNubj)}(hXh**Parameters** ``void`` no arguments **Description** When synchronize_rcu_tasks_trace() is invoked by one task, then that task is guaranteed to block until all other tasks exit their read-side critical sections. Similarly, if call_rcu_trace() is invoked on one task while other tasks are within RCU read-side critical sections, invocation of the corresponding RCU callback is deferred until after the all the other tasks exit their critical sections. For more details, please see the documentation for srcu_read_lock_fast(). For a description of how implicit RCU readers provide the needed ordering for architectures defining the ARCH_WANTS_NO_INSTR Kconfig option (and thus promising never to trace code where RCU is not watching), please see the __srcu_read_lock_fast() (non-kerneldoc) header comment. Otherwise, the smp_mb() below provided the needed ordering.h](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhK*hj:ubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj_h]hvoid}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjYubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthKhjuubah}(h]h ]h"]h$]h&]uh1j1hjYubeh}(h]h ]h"]h$]h&]uh1jhjthKhjVubah}(h]h ]h"]h$]h&]uh1j hj:ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhj:ubh)}(hXWhen synchronize_rcu_tasks_trace() is invoked by one task, then that task is guaranteed to block until all other tasks exit their read-side critical sections. Similarly, if call_rcu_trace() is invoked on one task while other tasks are within RCU read-side critical sections, invocation of the corresponding RCU callback is deferred until after the all the other tasks exit their critical sections.h]hXWhen synchronize_rcu_tasks_trace() is invoked by one task, then that task is guaranteed to block until all other tasks exit their read-side critical sections. Similarly, if call_rcu_trace() is invoked on one task while other tasks are within RCU read-side critical sections, invocation of the corresponding RCU callback is deferred until after the all the other tasks exit their critical sections.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhK'hj:ubh)}(hXFor more details, please see the documentation for srcu_read_lock_fast(). For a description of how implicit RCU readers provide the needed ordering for architectures defining the ARCH_WANTS_NO_INSTR Kconfig option (and thus promising never to trace code where RCU is not watching), please see the __srcu_read_lock_fast() (non-kerneldoc) header comment. Otherwise, the smp_mb() below provided the needed ordering.h]hXFor more details, please see the documentation for srcu_read_lock_fast(). For a description of how implicit RCU readers provide the needed ordering for architectures defining the ARCH_WANTS_NO_INSTR Kconfig option (and thus promising never to trace code where RCU is not watching), please see the __srcu_read_lock_fast() (non-kerneldoc) header comment. Otherwise, the smp_mb() below provided the needed ordering.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhK.hj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (rcu_read_unlock_tasks_trace (C function)c.rcu_read_unlock_tasks_tracehNtauh1hhjhhhNhNubj)}(hhh](j)}(h@void rcu_read_unlock_tasks_trace (struct srcu_ctr __percpu *scp)h]j)}(h?void rcu_read_unlock_tasks_trace(struct srcu_ctr __percpu *scp)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKBubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKBubj{)}(hrcu_read_unlock_tasks_traceh]j)}(hrcu_read_unlock_tasks_traceh]hrcu_read_unlock_tasks_trace}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKBubj)}(h(struct srcu_ctr __percpu *scp)h]j)}(hstruct srcu_ctr __percpu *scph](j)}(hjAh]hstruct}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj2)}(h h]h }(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'ubh)}(hhh]j)}(hsrcu_ctrh]hsrcu_ctr}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjKmodnameN classnameNj] j` )}jc ]jf )}jY jsbc.rcu_read_unlock_tasks_traceasbuh1hhj'ubj2)}(h h]h }(hjihhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'ubh__percpu}(hj'hhhNhNubj2)}(h h]h }(hj{hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj'ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hscph]hscp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj#ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKBubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKBubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKBhjhhubj)}(hhh]h)}(h0mark end of RCU-trace read-side critical sectionh]h0mark end of RCU-trace read-side critical section}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKBhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKBubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct srcu_ctr __percpu *scp`` return value from corresponding rcu_read_lock_tasks_trace(). **Description** Pairs with the preceding call to rcu_read_lock_tasks_trace() that returned the value passed in via scp. For more details, please see the documentation for rcu_read_unlock(). For memory-ordering information, please see the header comment for the rcu_read_lock_tasks_trace() function.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKFhjubj )}(hhh]j)}(h_``struct srcu_ctr __percpu *scp`` return value from corresponding rcu_read_lock_tasks_trace(). h](j)}(h!``struct srcu_ctr __percpu *scp``h]j)}(hjh]hstruct srcu_ctr __percpu *scp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKChjubj2)}(hhh]h)}(hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKEhjubh)}(hgPairs with the preceding call to rcu_read_lock_tasks_trace() that returned the value passed in via scp.h]hgPairs with the preceding call to rcu_read_lock_tasks_trace() that returned the value passed in via scp.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKDhjubh)}(hFor more details, please see the documentation for rcu_read_unlock(). For memory-ordering information, please see the header comment for the rcu_read_lock_tasks_trace() function.h]hFor more details, please see the documentation for rcu_read_unlock(). For memory-ordering information, please see the header comment for the rcu_read_lock_tasks_trace() function.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKGhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j  rcu_read_lock_trace (C function)c.rcu_read_lock_tracehNtauh1hhjhhhNhNubj)}(hhh](j)}(hvoid rcu_read_lock_trace (void)h]j)}(hvoid rcu_read_lock_trace(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKUubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKUubj{)}(hrcu_read_lock_traceh]j)}(hrcu_read_lock_traceh]hrcu_read_lock_trace}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKUubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKUubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKUubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKUhjhhubj)}(hhh]h)}(h6mark beginning of RCU-trace read-side critical sectionh]h6mark beginning of RCU-trace read-side critical section}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKUhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKUubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX **Parameters** ``void`` no arguments **Description** When synchronize_rcu_tasks_trace() is invoked by one task, then that task is guaranteed to block until all other tasks exit their read-side critical sections. Similarly, if call_rcu_trace() is invoked on one task while other tasks are within RCU read-side critical sections, invocation of the corresponding RCU callback is deferred until after the all the other tasks exit their critical sections. For more details, please see the documentation for rcu_read_lock().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKYhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj8h]hvoid}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhj2ubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhKhjNubah}(h]h ]h"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhKhj/ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjsh]h Description}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubh)}(hXWhen synchronize_rcu_tasks_trace() is invoked by one task, then that task is guaranteed to block until all other tasks exit their read-side critical sections. Similarly, if call_rcu_trace() is invoked on one task while other tasks are within RCU read-side critical sections, invocation of the corresponding RCU callback is deferred until after the all the other tasks exit their critical sections.h]hXWhen synchronize_rcu_tasks_trace() is invoked by one task, then that task is guaranteed to block until all other tasks exit their read-side critical sections. Similarly, if call_rcu_trace() is invoked on one task while other tasks are within RCU read-side critical sections, invocation of the corresponding RCU callback is deferred until after the all the other tasks exit their critical sections.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKVhjubh)}(hCFor more details, please see the documentation for rcu_read_lock().h]hCFor more details, please see the documentation for rcu_read_lock().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhK]hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j "rcu_read_unlock_trace (C function)c.rcu_read_unlock_tracehNtauh1hhjhhhNhNubj)}(hhh](j)}(h!void rcu_read_unlock_trace (void)h]j)}(h void rcu_read_unlock_trace(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKpubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKpubj{)}(hrcu_read_unlock_traceh]j)}(hrcu_read_unlock_traceh]hrcu_read_unlock_trace}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKpubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKpubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKpubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKphjhhubj)}(hhh]h)}(h0mark end of RCU-trace read-side critical sectionh]h0mark end of RCU-trace read-side critical section}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKphj+hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKpubeh}(h]h ](jfunctioneh"]h$]h&]jjjjFjjFjjjuh1jhhhjhNhNubj)}(hXV**Parameters** ``void`` no arguments **Description** Pairs with a preceding call to rcu_read_lock_trace(), and nesting is allowed. Invoking a rcu_read_unlock_trace() when there is no matching rcu_read_lock_trace() is verboten, and will result in lockdep complaints. For more details, please see the documentation for rcu_read_unlock().h](h)}(h**Parameters**h]j)}(hjPh]h Parameters}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKthjJubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjoh]hvoid}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjiubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjiubeh}(h]h ]h"]h$]h&]uh1jhjhKhjfubah}(h]h ]h"]h$]h&]uh1j hjJubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjJubh)}(hPairs with a preceding call to rcu_read_lock_trace(), and nesting is allowed. Invoking a rcu_read_unlock_trace() when there is no matching rcu_read_lock_trace() is verboten, and will result in lockdep complaints.h]hPairs with a preceding call to rcu_read_lock_trace(), and nesting is allowed. Invoking a rcu_read_unlock_trace() when there is no matching rcu_read_lock_trace() is verboten, and will result in lockdep complaints.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKqhjJubh)}(hEFor more details, please see the documentation for rcu_read_unlock().h]hEFor more details, please see the documentation for rcu_read_unlock().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKuhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j !call_rcu_tasks_trace (C function)c.call_rcu_tasks_tracehNtauh1hhjhhhNhNubj)}(hhh](j)}(hEvoid call_rcu_tasks_trace (struct rcu_head *rhp, rcu_callback_t func)h]j)}(hDvoid call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj hKubj{)}(hcall_rcu_tasks_traceh]j)}(hcall_rcu_tasks_traceh]hcall_rcu_tasks_trace}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj hKubj)}(h+(struct rcu_head *rhp, rcu_callback_t func)h](j)}(hstruct rcu_head *rhph](j)}(hjAh]hstruct}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj2)}(h h]h }(hjHhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7ubh)}(hhh]j)}(hrcu_headh]hrcu_head}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj[modnameN classnameNj] j` )}jc ]jf )}jY j!sbc.call_rcu_tasks_traceasbuh1hhj7ubj2)}(h h]h }(hjyhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj7ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(hrhph]hrhp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubj)}(hrcu_callback_t funch](h)}(hhh]j)}(hrcu_callback_th]hrcu_callback_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]juc.call_rcu_tasks_traceasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hfunch]hfunc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj3ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hKhjhhubj)}(hhh]h)}(h.Queue a callback trace task-based grace periodh]h.Queue a callback trace task-based grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX^**Parameters** ``struct rcu_head *rhp`` structure to be used for queueing the RCU updates. ``rcu_callback_t func`` actual callback function to be invoked after the grace period **Description** The callback function will be invoked some time after a trace rcu-tasks grace period elapses, in other words after all currently executing trace rcu-tasks read-side critical sections have completed. These read-side critical sections are delimited by calls to rcu_read_lock_trace() and rcu_read_unlock_trace(). See the description of call_rcu() for more detailed information on memory ordering guarantees.h](h)}(h**Parameters**h]j)}(hj(h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhj"ubj )}(hhh](j)}(hL``struct rcu_head *rhp`` structure to be used for queueing the RCU updates. h](j)}(h``struct rcu_head *rhp``h]j)}(hjGh]hstruct rcu_head *rhp}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjAubj2)}(hhh]h)}(h2structure to be used for queueing the RCU updates.h]h2structure to be used for queueing the RCU updates.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hKhj]ubah}(h]h ]h"]h$]h&]uh1j1hjAubeh}(h]h ]h"]h$]h&]uh1jhj\hKhj>ubj)}(hV``rcu_callback_t func`` actual callback function to be invoked after the grace period h](j)}(h``rcu_callback_t func``h]j)}(hjh]hrcu_callback_t func}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjzubj2)}(hhh]h)}(h=actual callback function to be invoked after the grace periodh]h=actual callback function to be invoked after the grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjzubeh}(h]h ]h"]h$]h&]uh1jhjhKhj>ubeh}(h]h ]h"]h$]h&]uh1j hj"ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhj"ubh)}(hX5The callback function will be invoked some time after a trace rcu-tasks grace period elapses, in other words after all currently executing trace rcu-tasks read-side critical sections have completed. These read-side critical sections are delimited by calls to rcu_read_lock_trace() and rcu_read_unlock_trace().h]hX5The callback function will be invoked some time after a trace rcu-tasks grace period elapses, in other words after all currently executing trace rcu-tasks read-side critical sections have completed. These read-side critical sections are delimited by calls to rcu_read_lock_trace() and rcu_read_unlock_trace().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhj"ubh)}(h^See the description of call_rcu() for more detailed information on memory ordering guarantees.h]h^See the description of call_rcu() for more detailed information on memory ordering guarantees.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j (synchronize_rcu_tasks_trace (C function)c.synchronize_rcu_tasks_tracehNtauh1hhjhhhNhNubj)}(hhh](j)}(h'void synchronize_rcu_tasks_trace (void)h]j)}(h&void synchronize_rcu_tasks_trace(void)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj hhhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhjhKubj{)}(hsynchronize_rcu_tasks_traceh]j)}(hsynchronize_rcu_tasks_traceh]hsynchronize_rcu_tasks_trace}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj hhhjhKubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjLhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]noemphjjuh1jhjDubah}(h]h ]h"]h$]h&]jjuh1jhj hhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h'wait for a trace rcu-tasks grace periodh]h'wait for a trace rcu-tasks grace period}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjshhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``void`` no arguments **Description** Control will return to the caller some time after a trace rcu-tasks grace period has elapsed, in other words after all currently executing trace rcu-tasks read-side critical sections have elapsed. These read-side critical sections are delimited by calls to rcu_read_lock_trace() and rcu_read_unlock_trace(). This is a very specialized primitive, intended only for a few uses in tracing and other situations requiring manipulation of function preambles and profiling hooks. The synchronize_rcu_tasks_trace() function is not (yet) intended for heavy use from multiple CPUs. See the description of synchronize_rcu() for more detailed information on memory ordering guarantees.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubh)}(hX3Control will return to the caller some time after a trace rcu-tasks grace period has elapsed, in other words after all currently executing trace rcu-tasks read-side critical sections have elapsed. These read-side critical sections are delimited by calls to rcu_read_lock_trace() and rcu_read_unlock_trace().h]hX3Control will return to the caller some time after a trace rcu-tasks grace period has elapsed, in other words after all currently executing trace rcu-tasks read-side critical sections have elapsed. These read-side critical sections are delimited by calls to rcu_read_lock_trace() and rcu_read_unlock_trace().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubh)}(hXThis is a very specialized primitive, intended only for a few uses in tracing and other situations requiring manipulation of function preambles and profiling hooks. The synchronize_rcu_tasks_trace() function is not (yet) intended for heavy use from multiple CPUs.h]hXThis is a very specialized primitive, intended only for a few uses in tracing and other situations requiring manipulation of function preambles and profiling hooks. The synchronize_rcu_tasks_trace() function is not (yet) intended for heavy use from multiple CPUs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubh)}(heSee the description of synchronize_rcu() for more detailed information on memory ordering guarantees.h]heSee the description of synchronize_rcu() for more detailed information on memory ordering guarantees.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j $rcu_barrier_tasks_trace (C function)c.rcu_barrier_tasks_tracehNtauh1hhjhhhNhNubj)}(hhh](j)}(h#void rcu_barrier_tasks_trace (void)h]j)}(h"void rcu_barrier_tasks_trace(void)h](j )}(hvoidh]hvoid}(hjUhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjQhhhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKubj2)}(h h]h }(hjdhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQhhhjchKubj{)}(hrcu_barrier_tasks_traceh]j)}(hrcu_barrier_tasks_traceh]hrcu_barrier_tasks_trace}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjQhhhjchKubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjQhhhjchKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjMhhhjchKubah}(h]jHah ](jjeh"]h$]h&]jj)jhuh1jhjchKhjJhhubj)}(hhh]h)}(h4Wait for in-flight call_rcu_tasks_trace() callbacks.h]h4Wait for in-flight call_rcu_tasks_trace() callbacks.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjJhhhjchKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``void`` no arguments **Description** Note that rcu_barrier_tasks_trace() is not obligated to actually wait, for example, if there are no pending callbacks.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj8h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubh)}(hvNote that rcu_barrier_tasks_trace() is not obligated to actually wait, for example, if there are no pending callbacks.h]hvNote that rcu_barrier_tasks_trace() is not obligated to actually wait, for example, if there are no pending callbacks.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j -rcu_tasks_trace_expedite_current (C function)"c.rcu_tasks_trace_expedite_currenthNtauh1hhjhhhNhNubj)}(hhh](j)}(h,void rcu_tasks_trace_expedite_current (void)h]j)}(h+void rcu_tasks_trace_expedite_current(void)h](j )}(hvoidh]hvoid}(hj}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjyhhhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjyhhhjhKubj{)}(h rcu_tasks_trace_expedite_currenth]j)}(h rcu_tasks_trace_expedite_currenth]h rcu_tasks_trace_expedite_current}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjyhhhjhKubj)}(h(void)h]j)}(hvoidh]j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjyhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjuhhhjhKubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjrhhubj)}(hhh]h)}(h1Expedite the current Tasks Trace RCU grace periodh]h1Expedite the current Tasks Trace RCU grace period}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjrhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXm**Parameters** ``void`` no arguments **Description** Cause the current Tasks Trace RCU grace period to become expedited. The grace period following the current one might also be expedited. If there is no current grace period, one might be created. If the current grace period is currently sleeping, that sleep will complete before expediting will take effect.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubj )}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj%h]hvoid}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubj2)}(hhh]h)}(h no argumentsh]h no arguments}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hKhj;ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj:hKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj`h]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubh)}(hX3Cause the current Tasks Trace RCU grace period to become expedited. The grace period following the current one might also be expedited. If there is no current grace period, one might be created. If the current grace period is currently sleeping, that sleep will complete before expediting will take effect.h]hX3Cause the current Tasks Trace RCU grace period to become expedited. The grace period following the current one might also be expedited. If there is no current grace period, one might be created. If the current grace period is currently sleeping, that sleep will complete before expediting will take effect.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:425: ./include/linux/rcupdate_trace.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j synchronize_rcu_mult (C macro)c.synchronize_rcu_multhNtauh1hhjhhhNhNubj)}(hhh](j)}(hsynchronize_rcu_multh]j)}(hsynchronize_rcu_multh]j{)}(hsynchronize_rcu_multh]j)}(hjh]hsynchronize_rcu_mult}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:427: ./include/linux/rcupdate_wait.hhK'ubah}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK'ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK'hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhK'ubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubh)}(h``synchronize_rcu_mult (...)``h]j)}(hjh]hsynchronize_rcu_mult (...)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:427: ./include/linux/rcupdate_wait.hhK)hjhhubj)}(h-Wait concurrently for multiple grace periods h]h)}(h,Wait concurrently for multiple grace periodsh]h,Wait concurrently for multiple grace periods}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:427: ./include/linux/rcupdate_wait.hhK'hjubah}(h]h ]h"]h$]h&]uh1jhjhK'hjhhubj)}(hX**Parameters** ``...`` List of call_rcu() functions for different grace periods to wait on **Description** This macro waits concurrently for multiple types of RCU grace periods. For example, synchronize_rcu_mult(call_rcu, call_rcu_tasks) would wait on concurrent RCU and RCU-tasks grace periods. Waiting on a given SRCU domain requires you to write a wrapper function for that SRCU domain's call_srcu() function, with this wrapper supplying the pointer to the corresponding srcu_struct. Note that call_rcu_hurry() should be used instead of call_rcu() because in kernels built with CONFIG_RCU_LAZY=y the delay between the invocation of call_rcu() and that of the corresponding RCU callback can be multiple seconds. The first argument tells Tiny RCU's _wait_rcu_gp() not to bother waiting for RCU. The reason for this is because anywhere synchronize_rcu_mult() can be called is automatically already a full grace period.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:427: ./include/linux/rcupdate_wait.hhK+hj ubj )}(hhh]j)}(hL``...`` List of call_rcu() functions for different grace periods to wait on h](j)}(h``...``h]j)}(hj/h]h...}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:427: ./include/linux/rcupdate_wait.hhK(hj)ubj2)}(hhh]h)}(hCList of call_rcu() functions for different grace periods to wait onh]hCList of call_rcu() functions for different grace periods to wait on}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhK(hjEubah}(h]h ]h"]h$]h&]uh1j1hj)ubeh}(h]h ]h"]h$]h&]uh1jhjDhK(hj&ubah}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjjh]h Description}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:427: ./include/linux/rcupdate_wait.hhK*hj ubh)}(hX|This macro waits concurrently for multiple types of RCU grace periods. For example, synchronize_rcu_mult(call_rcu, call_rcu_tasks) would wait on concurrent RCU and RCU-tasks grace periods. Waiting on a given SRCU domain requires you to write a wrapper function for that SRCU domain's call_srcu() function, with this wrapper supplying the pointer to the corresponding srcu_struct.h]hX~This macro waits concurrently for multiple types of RCU grace periods. For example, synchronize_rcu_mult(call_rcu, call_rcu_tasks) would wait on concurrent RCU and RCU-tasks grace periods. Waiting on a given SRCU domain requires you to write a wrapper function for that SRCU domain’s call_srcu() function, with this wrapper supplying the pointer to the corresponding srcu_struct.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:427: ./include/linux/rcupdate_wait.hhK)hj ubh)}(hNote that call_rcu_hurry() should be used instead of call_rcu() because in kernels built with CONFIG_RCU_LAZY=y the delay between the invocation of call_rcu() and that of the corresponding RCU callback can be multiple seconds.h]hNote that call_rcu_hurry() should be used instead of call_rcu() because in kernels built with CONFIG_RCU_LAZY=y the delay between the invocation of call_rcu() and that of the corresponding RCU callback can be multiple seconds.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:427: ./include/linux/rcupdate_wait.hhK0hj ubh)}(hThe first argument tells Tiny RCU's _wait_rcu_gp() not to bother waiting for RCU. The reason for this is because anywhere synchronize_rcu_mult() can be called is automatically already a full grace period.h]hThe first argument tells Tiny RCU’s _wait_rcu_gp() not to bother waiting for RCU. The reason for this is because anywhere synchronize_rcu_mult() can be called is automatically already a full grace period.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhb/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:427: ./include/linux/rcupdate_wait.hhK5hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcuref_init (C function) c.rcuref_inithNtauh1hhjhhhNhNubj)}(hhh](j)}(h2void rcuref_init (rcuref_t *ref, unsigned int cnt)h]j)}(h1void rcuref_init(rcuref_t *ref, unsigned int cnt)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(h rcuref_inith]j)}(h rcuref_inith]h rcuref_init}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h!(rcuref_t *ref, unsigned int cnt)h](j)}(h rcuref_t *refh](h)}(hhh]j)}(hrcuref_th]hrcuref_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.rcuref_initasbuh1hhjubj2)}(h h]h }(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrefh]href}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hunsigned int cnth](j )}(hunsignedh]hunsigned}(hjahhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hjohhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj )}(hinth]hint}(hj}hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj]ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(hcnth]hcnt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(hBInitialize a rcuref reference count with the given reference counth]hBInitialize a rcuref reference count with the given reference count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``rcuref_t *ref`` Pointer to the reference count ``unsigned int cnt`` The initial reference count typically '1'h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubj )}(hhh](j)}(h1``rcuref_t *ref`` Pointer to the reference count h](j)}(h``rcuref_t *ref``h]j)}(hjh]h rcuref_t *ref}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubj2)}(hhh]h)}(hPointer to the reference counth]hPointer to the reference count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h>``unsigned int cnt`` The initial reference count typically '1'h](j)}(h``unsigned int cnt``h]j)}(hj=h]hunsigned int cnt}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhj7ubj2)}(hhh]h)}(h)The initial reference count typically '1'h]h-The initial reference count typically ‘1’}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjSubah}(h]h ]h"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcuref_read (C function) c.rcuref_readhNtauh1hhjhhhNhNubj)}(hhh](j)}(h(unsigned int rcuref_read (rcuref_t *ref)h]j)}(h'unsigned int rcuref_read(rcuref_t *ref)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhhjhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(h rcuref_readh]j)}(h rcuref_readh]h rcuref_read}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(rcuref_t *ref)h]j)}(h rcuref_t *refh](h)}(hhh]j)}(hrcuref_th]hrcuref_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.rcuref_readasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrefh]href}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h4Read the number of held reference counts of a rcurefh]h4Read the number of held reference counts of a rcuref}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjUhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjpjjpjjjuh1jhhhjhNhNubj)}(hXu**Parameters** ``rcuref_t *ref`` Pointer to the reference count **Return** The number of held references (0 ... N). The value 0 does not indicate that it is safe to schedule the object, protected by this reference counter, for deconstruction. If you want to know if the reference counter has been marked DEAD (as signaled by rcuref_put()) please use rcuread_is_dead().h](h)}(h**Parameters**h]j)}(hjzh]h Parameters}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK"hjtubj )}(hhh]j)}(h1``rcuref_t *ref`` Pointer to the reference count h](j)}(h``rcuref_t *ref``h]j)}(hjh]h rcuref_t *ref}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubj2)}(hhh]h)}(hPointer to the reference counth]hPointer to the reference count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjtubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK!hjtubh)}(hX%The number of held references (0 ... N). The value 0 does not indicate that it is safe to schedule the object, protected by this reference counter, for deconstruction. If you want to know if the reference counter has been marked DEAD (as signaled by rcuref_put()) please use rcuread_is_dead().h]hX%The number of held references (0 ... N). The value 0 does not indicate that it is safe to schedule the object, protected by this reference counter, for deconstruction. If you want to know if the reference counter has been marked DEAD (as signaled by rcuref_put()) please use rcuread_is_dead().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK!hjtubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcuref_is_dead (C function)c.rcuref_is_deadhNtauh1hhjhhhNhNubj)}(hhh](j)}(h#bool rcuref_is_dead (rcuref_t *ref)h]j)}(h"bool rcuref_is_dead(rcuref_t *ref)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK0ubj2)}(h h]h }(hj'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhj&hK0ubj{)}(hrcuref_is_deadh]j)}(hrcuref_is_deadh]hrcuref_is_dead}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhj&hK0ubj)}(h(rcuref_t *ref)h]j)}(h rcuref_t *refh](h)}(hhh]j)}(hrcuref_th]hrcuref_t}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjZmodnameN classnameNj] j` )}jc ]jf )}jY j;sbc.rcuref_is_deadasbuh1hhjQubj2)}(h h]h }(hjxhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjQubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(hrefh]href}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjMubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj&hK0ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj&hK0ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj&hK0hjhhubj)}(hhh]h)}(h0Check if the rcuref has been already marked deadh]h0Check if the rcuref has been already marked dead}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK0hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj&hK0ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX;**Parameters** ``rcuref_t *ref`` Pointer to the reference count **Return** True if the object has been marked DEAD. This signals that a previous invocation of rcuref_put() returned true on this reference counter meaning the protected object can safely be scheduled for deconstruction. Otherwise, returns false.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK4hjubj )}(hhh]j)}(h1``rcuref_t *ref`` Pointer to the reference count h](j)}(h``rcuref_t *ref``h]j)}(hjh]h rcuref_t *ref}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK1hjubj2)}(hhh]h)}(hPointer to the reference counth]hPointer to the reference count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK1hjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhK1hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hj9h]hReturn}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK3hjubh)}(hTrue if the object has been marked DEAD. This signals that a previous invocation of rcuref_put() returned true on this reference counter meaning the protected object can safely be scheduled for deconstruction. Otherwise, returns false.h]hTrue if the object has been marked DEAD. This signals that a previous invocation of rcuref_put() returned true on this reference counter meaning the protected object can safely be scheduled for deconstruction. Otherwise, returns false.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK3hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcuref_get (C function) c.rcuref_gethNtauh1hhjhhhNhNubj)}(hhh](j)}(hbool rcuref_get (rcuref_t *ref)h]j)}(hbool rcuref_get(rcuref_t *ref)h](j )}(hj8h]hbool}(hj~hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjzhhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKBubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjzhhhjhKBubj{)}(h rcuref_geth]j)}(h rcuref_geth]h rcuref_get}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjzhhhjhKBubj)}(h(rcuref_t *ref)h]j)}(h rcuref_t *refh](h)}(hhh]j)}(hrcuref_th]hrcuref_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb c.rcuref_getasbuh1hhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrefh]href}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjzhhhjhKBubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjvhhhjhKBubah}(h]jqah ](jjeh"]h$]h&]jj)jhuh1jhjhKBhjshhubj)}(hhh]h)}(h1Acquire one reference on a rcuref reference counth]h1Acquire one reference on a rcuref reference count}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKBhjhhubah}(h]h ]h"]h$]h&]uh1jhjshhhjhKBubeh}(h]h ](jfunctioneh"]h$]h&]jjjj:jj:jjjuh1jhhhjhNhNubj)}(hX **Parameters** ``rcuref_t *ref`` Pointer to the reference count **Description** Similar to atomic_inc_not_zero() but saturates at RCUREF_MAXREF. Provides no memory ordering, it is assumed the caller has guaranteed the object memory to be stable (RCU, etc.). It does provide a control dependency and thereby orders future stores. See documentation in lib/rcuref.c True if a reference was successfully acquired **Return** False if the attempt to acquire a reference failed. This happens when the last reference has been put alreadyh](h)}(h**Parameters**h]j)}(hjDh]h Parameters}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKFhj>ubj )}(hhh]j)}(h1``rcuref_t *ref`` Pointer to the reference count h](j)}(h``rcuref_t *ref``h]j)}(hjch]h rcuref_t *ref}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKChj]ubj2)}(hhh]h)}(hPointer to the reference counth]hPointer to the reference count}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhKChjyubah}(h]h ]h"]h$]h&]uh1j1hj]ubeh}(h]h ]h"]h$]h&]uh1jhjxhKChjZubah}(h]h ]h"]h$]h&]uh1j hj>ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKEhj>ubh)}(h@Similar to atomic_inc_not_zero() but saturates at RCUREF_MAXREF.h]h@Similar to atomic_inc_not_zero() but saturates at RCUREF_MAXREF.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKDhj>ubh)}(hProvides no memory ordering, it is assumed the caller has guaranteed the object memory to be stable (RCU, etc.). It does provide a control dependency and thereby orders future stores. See documentation in lib/rcuref.ch]hProvides no memory ordering, it is assumed the caller has guaranteed the object memory to be stable (RCU, etc.). It does provide a control dependency and thereby orders future stores. See documentation in lib/rcuref.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKFhj>ubj)}(h.True if a reference was successfully acquired h]h)}(h-True if a reference was successfully acquiredh]h-True if a reference was successfully acquired}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKKhjubah}(h]h ]h"]h$]h&]uh1jhjhKKhj>ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKMhj>ubh)}(hmFalse if the attempt to acquire a reference failed. This happens when the last reference has been put alreadyh]hmFalse if the attempt to acquire a reference failed. This happens when the last reference has been put already}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKKhj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcuref_put_rcusafe (C function)c.rcuref_put_rcusafehNtauh1hhjhhhNhNubj)}(hhh](j)}(h'bool rcuref_put_rcusafe (rcuref_t *ref)h]j)}(h&bool rcuref_put_rcusafe(rcuref_t *ref)h](j )}(hj8h]hbool}(hj2hhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhj.hhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKyubj2)}(h h]h }(hj@hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj.hhhj?hKyubj{)}(hrcuref_put_rcusafeh]j)}(hrcuref_put_rcusafeh]hrcuref_put_rcusafe}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ](jjeh"]h$]h&]jjuh1jzhj.hhhj?hKyubj)}(h(rcuref_t *ref)h]j)}(h rcuref_t *refh](h)}(hhh]j)}(hrcuref_th]hrcuref_t}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjsmodnameN classnameNj] j` )}jc ]jf )}jY jTsbc.rcuref_put_rcusafeasbuh1hhjjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(hrefh]href}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjfubah}(h]h ]h"]h$]h&]jjuh1jhj.hhhj?hKyubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj*hhhj?hKyubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj?hKyhj'hhubj)}(hhh]j)}(hhh]j)}(h;Release one reference for a rcuref reference count RCU safeh]h)}(hjh]h;Release one reference for a rcuref reference count RCU safe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKyhjubah}(h]h ]h"]h$]h&]uh1jhjhhhjhNubah}(h]h ]h"]h$]h&]jjuh1jhjhKyhjhhubah}(h]h ]h"]h$]h&]uh1jhj'hhhj?hKyubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hXt**Parameters** ``rcuref_t *ref`` Pointer to the reference count **Description** Provides release memory ordering, such that prior loads and stores are done before, and provides an acquire ordering on success such that free() must come after. Can be invoked from contexts, which guarantee that no grace period can happen which would free the object concurrently if the decrement drops the last reference and the slowpath races against a concurrent get() and put() pair. rcu_read_lock()'ed and atomic contexts qualify. False if there are still active references or the put() raced with a concurrent get()/put() pair. Caller is not allowed to release the protected object. **Return** True if this was the last reference with no future references possible. This signals the caller that it can safely release the object which is protected by the reference counter.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK}hjubj )}(hhh]j)}(h1``rcuref_t *ref`` Pointer to the reference count h](j)}(h``rcuref_t *ref``h]j)}(hj)h]h rcuref_t *ref}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKzhj#ubj2)}(hhh]h)}(hPointer to the reference counth]hPointer to the reference count}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hKzhj?ubah}(h]h ]h"]h$]h&]uh1j1hj#ubeh}(h]h ]h"]h$]h&]uh1jhj>hKzhj ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjdh]h Description}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK|hjubh)}(hProvides release memory ordering, such that prior loads and stores are done before, and provides an acquire ordering on success such that free() must come after.h]hProvides release memory ordering, such that prior loads and stores are done before, and provides an acquire ordering on success such that free() must come after.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhK{hjubh)}(hXCan be invoked from contexts, which guarantee that no grace period can happen which would free the object concurrently if the decrement drops the last reference and the slowpath races against a concurrent get() and put() pair. rcu_read_lock()'ed and atomic contexts qualify.h]hXCan be invoked from contexts, which guarantee that no grace period can happen which would free the object concurrently if the decrement drops the last reference and the slowpath races against a concurrent get() and put() pair. rcu_read_lock()’ed and atomic contexts qualify.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubj)}(hFalse if there are still active references or the put() raced with a concurrent get()/put() pair. Caller is not allowed to release the protected object. h]h)}(hFalse if there are still active references or the put() raced with a concurrent get()/put() pair. Caller is not allowed to release the protected object.h]hFalse if there are still active references or the put() raced with a concurrent get()/put() pair. Caller is not allowed to release the protected object.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubh)}(hTrue if this was the last reference with no future references possible. This signals the caller that it can safely release the object which is protected by the reference counter.h]hTrue if this was the last reference with no future references possible. This signals the caller that it can safely release the object which is protected by the reference counter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j rcuref_put (C function) c.rcuref_puthNtauh1hhjhhhNhNubj)}(hhh](j)}(hbool rcuref_put (rcuref_t *ref)h]j)}(hbool rcuref_put(rcuref_t *ref)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhKubj{)}(h rcuref_puth]j)}(h rcuref_puth]h rcuref_put}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhKubj)}(h(rcuref_t *ref)h]j)}(h rcuref_t *refh](h)}(hhh]j)}(hrcuref_th]hrcuref_t}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetj9modnameN classnameNj] j` )}jc ]jf )}jY jsb c.rcuref_putasbuh1hhj0ubj2)}(h h]h }(hjWhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj0ubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hrefh]href}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj,ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]j)}(hhh]j)}(h2Release one reference for a rcuref reference counth]h)}(hjh]h2Release one reference for a rcuref reference count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhjhNubah}(h]h ]h"]h$]h&]jjuh1jhjhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``rcuref_t *ref`` Pointer to the reference count **Description** Can be invoked from any context. Provides release memory ordering, such that prior loads and stores are done before, and provides an acquire ordering on success such that free() must come after. True if this was the last reference with no future references possible. This signals the caller that it can safely schedule the object, which is protected by the reference counter, for deconstruction. False if there are still active references or the put() raced with a concurrent get()/put() pair. Caller is not allowed to deconstruct the protected object.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubj )}(hhh]j)}(h1``rcuref_t *ref`` Pointer to the reference count h](j)}(h``rcuref_t *ref``h]j)}(hjh]h rcuref_t *ref}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubj2)}(hhh]h)}(hPointer to the reference counth]hPointer to the reference count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj*h]h Description}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubh)}(h Can be invoked from any context.h]h Can be invoked from any context.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubh)}(hProvides release memory ordering, such that prior loads and stores are done before, and provides an acquire ordering on success such that free() must come after.h]hProvides release memory ordering, such that prior loads and stores are done before, and provides an acquire ordering on success such that free() must come after.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhjubj)}(hXfTrue if this was the last reference with no future references possible. This signals the caller that it can safely schedule the object, which is protected by the reference counter, for deconstruction. False if there are still active references or the put() raced with a concurrent get()/put() pair. Caller is not allowed to deconstruct the protected object.h](h)}(hTrue if this was the last reference with no future references possible. This signals the caller that it can safely schedule the object, which is protected by the reference counter, for deconstruction.h]hTrue if this was the last reference with no future references possible. This signals the caller that it can safely schedule the object, which is protected by the reference counter, for deconstruction.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhj^ubh)}(hFalse if there are still active references or the put() raced with a concurrent get()/put() pair. Caller is not allowed to deconstruct the protected object.h]hFalse if there are still active references or the put() raced with a concurrent get()/put() pair. Caller is not allowed to deconstruct the protected object.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:429: ./include/linux/rcuref.hhKhj^ubeh}(h]h ]h"]h$]h&]uh1jhjphKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j ,same_state_synchronize_rcu_full (C function)!c.same_state_synchronize_rcu_fullhNtauh1hhjhhhNhNubj)}(hhh](j)}(hebool same_state_synchronize_rcu_full (struct rcu_gp_oldstate *rgosp1, struct rcu_gp_oldstate *rgosp2)h]j)}(hdbool same_state_synchronize_rcu_full(struct rcu_gp_oldstate *rgosp1, struct rcu_gp_oldstate *rgosp2)h](j )}(hj8h]hbool}(hjhhhNhNubah}(h]h ]j,ah"]h$]h&]uh1jhjhhh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:431: ./include/linux/rcutree.hhK3ubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhjhK3ubj{)}(hsame_state_synchronize_rcu_fullh]j)}(hsame_state_synchronize_rcu_fullh]hsame_state_synchronize_rcu_full}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jzhjhhhjhK3ubj)}(h@(struct rcu_gp_oldstate *rgosp1, struct rcu_gp_oldstate *rgosp2)h](j)}(hstruct rcu_gp_oldstate *rgosp1h](j)}(hjAh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubh)}(hhh]j)}(hrcu_gp_oldstateh]hrcu_gp_oldstate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjmodnameN classnameNj] j` )}jc ]jf )}jY jsb!c.same_state_synchronize_rcu_fullasbuh1hhjubj2)}(h h]h }(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrgosp1h]hrgosp1}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubj)}(hstruct rcu_gp_oldstate *rgosp2h](j)}(hjAh]hstruct}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj2)}(h h]h }(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubh)}(hhh]j)}(hrcu_gp_oldstateh]hrcu_gp_oldstate}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjreftypejY reftargetjtmodnameN classnameNj] j` )}jc ]j!c.same_state_synchronize_rcu_fullasbuh1hhjPubj2)}(h h]h }(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjPubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hrgosp2h]hrgosp2}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhK3ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK3ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK3hjhhubj)}(hhh]h)}(h#Are two old-state values identical?h]h#Are two old-state values identical?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:431: ./include/linux/rcutree.hhK3hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK3ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct rcu_gp_oldstate *rgosp1`` First old-state value. ``struct rcu_gp_oldstate *rgosp2`` Second old-state value. **Description** The two old-state values must have been obtained from either get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or get_completed_synchronize_rcu_full(). Returns **true** if the two values are identical and **false** otherwise. This allows structures whose lifetimes are tracked by old-state values to push these values to a list header, allowing those structures to be slightly smaller. Note that equality is judged on a bitwise basis, so that an **rcu_gp_oldstate** structure with an already-completed state in one field will compare not-equal to a structure with an already-completed state in the other field. After all, the **rcu_gp_oldstate** structure is opaque so how did such a situation come to pass in the first place?h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:431: ./include/linux/rcutree.hhK7hjubj )}(hhh](j)}(h:``struct rcu_gp_oldstate *rgosp1`` First old-state value. h](j)}(h"``struct rcu_gp_oldstate *rgosp1``h]j)}(hjh]hstruct rcu_gp_oldstate *rgosp1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:431: ./include/linux/rcutree.hhK4hjubj2)}(hhh]h)}(hFirst old-state value.h]hFirst old-state value.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hK4hj,ubah}(h]h ]h"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]uh1jhj+hK4hj ubj)}(h;``struct rcu_gp_oldstate *rgosp2`` Second old-state value. h](j)}(h"``struct rcu_gp_oldstate *rgosp2``h]j)}(hjOh]hstruct rcu_gp_oldstate *rgosp2}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:431: ./include/linux/rcutree.hhK5hjIubj2)}(hhh]h)}(hSecond old-state value.h]hSecond old-state value.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhK5hjeubah}(h]h ]h"]h$]h&]uh1j1hjIubeh}(h]h ]h"]h$]h&]uh1jhjdhK5hj ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:431: ./include/linux/rcutree.hhK7hjubh)}(hXThe two old-state values must have been obtained from either get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or get_completed_synchronize_rcu_full(). Returns **true** if the two values are identical and **false** otherwise. This allows structures whose lifetimes are tracked by old-state values to push these values to a list header, allowing those structures to be slightly smaller.h](hThe two old-state values must have been obtained from either get_state_synchronize_rcu_full(), start_poll_synchronize_rcu_full(), or get_completed_synchronize_rcu_full(). Returns }(hjhhhNhNubj)}(h**true**h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh% if the two values are identical and }(hjhhhNhNubj)}(h **false**h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh otherwise. This allows structures whose lifetimes are tracked by old-state values to push these values to a list header, allowing those structures to be slightly smaller.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kernel-api:431: ./include/linux/rcutree.hhK6hjubh)}(hXUNote that equality is judged on a bitwise basis, so that an **rcu_gp_oldstate** structure with an already-completed state in one field will compare not-equal to a structure with an already-completed state in the other field. After all, the **rcu_gp_oldstate** structure is opaque so how did such a situation come to pass in the first place?h](hj;jc#j`#j%j%j7.j4.j|j|jjj%j%jCjCjjjjjju nametypes}(j"jj@`jjjjcj9jjjvjjj2jBjjUjH jK/j2jljljjjjj j-jjjjj%j>jc#j%j7.j|jj%jCjjjuh}(jhjhj=`hj jjjjjj j j j jxj}jjjjjajfjjjTjYj j j=$jB$j&j&j(j(jX+j]+j-j-jt0jy0j3j3j5j5j8j8j9j9j=j=jR@jW@jCjCjIjIjLjLjNjNjePjjPj RjRj TjTjGWjLWjYZj^Zj]j]jjC`j``je`j5bj:bjudjzdjejejijij&lj+lj{ojojqjqjGtjLtjvjvjxjxjzjzj|j|j~j~jjjjj jjjjjj#j(jpjujjj{jjjjwj|jjj_jdjjjVj[jQjVjj¥jZj_jjjjjjjrjwjjjjjjjȹj͹jjjAjFjjj-j2jjjj$jjjjjjj*j/jIjNjjjmjrjjjjjjjjjjjjjjj!j&j9j>j/j4jFjKj;j@j0j5j%j*j7j<jIjNj[j`jljqj}jjjjjjjjjjjj{jjcjjtjyjo jt j j jjjjjjj j j"j"j'%j,%j'j'j;*j@*j.j.j'7j7jd9jZ9j.7j9j:j:j>j#>jAjAjEjEjHjHjLjLjNQjSQjSjSjQVjVVjYjYjYZj^Zjm\jr\j_j_jjj!cj>cjCcjejejghjlhjvjjjjjjjkjkjmjmjnjnj/pj4pjqjqj;sj@sjtjtjjvjvjvjzjzj~j~jjj„jDŽjdjijj!jjjjj<jAjjjוjܕj?jDj2jj?j˘jjjjjjjjj>jCjȠj͠jbjgjjjwj|jjjjjjj}jjzjjhjmjjjjjͷjҷjjjzjjSjXj,j1jj jjjjjXj]j4j9jgjljjjjj jjjjjEjbjgjjjjjjjjjjjjjjjjjjjrjwjjjMjRjRjj jjjjj j\jajfjkjjjjjjjjjjjE jXjujzjpjujujzjjj j jH/jK jh jm j+ j0 jjjljqjjjjjjjjjjj= jB j "j%"j$j$j%j%j&j&jW(j\(j)j)j++j0+jt-jy-j2jN/jk/jp/j1j 1jlj2jlj2j3j3j94j>4j5j5j79j<9j;j;j9>j>>jAjAjEjEj+Ij0IjUKjZKjeMjjMjOjOjQjQjTjTjVjVjYj!YjX[j][j]j]j,aj1aj0cj5cjhjhjwij|ijjljj-ljJljOljgmjlmjnjnjojojqj"qjKrjPrj/sj4sjtjtjtjtjvjvj wjwjwjwjxjxjyjyj {j{j{j{j|j|j}j}j~j~jjjkjpj/j4jjjjjjjBjGjjjj$jԌjٌjjjjjɑjΑj~jjfjkjNjSjYj^jjjȜj͜jjjjjTjYjjjjj1j6jjjUjZj7j<jejjj jjjjj#jsjxjjjjj jjgjljjj|jjj jjjjjjjjjmjrjjjjjjjYj^jjj*jjjjj0jjjjjjj%j j;jj;j@j jj`#jAj^jcjjj~jjjjjjljqjj jHjMjj jEjJjjj~jj jjjj j jQ jV j{ j jjjjj8j=jjjjjjjjj%jf#j#j#j4.j%j%j%j<'jA'j(j(j=+jB+jN-jS-j_/jd/j0j0j2j2j4j4j5j5j/7j47j8j8jO:jT:j;j;jo=jt=jAjAjCjCjAFjFFjHjHjmLjrLjNjNj}PjPjDTjITjXjXj\j\j_j_jxaj}ajbjbj|ejejgjgjijijljljznjnjLpjQpj rjrj]tjbtjvjvj#yj(yjzjzjp|ju|j~j~jjjLjQjjjjjjj9j>jjŏjĒjɒjjjjjjj jjyj~j{jjjjSjXjjjjjCjHjmjrjgjljjjjjjjCjHjpjujjjjjjjjjkjpjjjjjjjjjjjjj&j+jjjBjGjJjOjajfjjjjjjjjjDjIjjjjjjjjjjj?jDj j jq jv j j jjjYj^jjjGjLjKjPjjjjj j j,"j1"j#j#j&j&j'j'j)j)jL+jQ+j9.j>.j~0j0j2j2j5j!5j6j6j9j9j<j<jD?jI?jAjAjICjNCjEjEj;Gj@GjtIjyIj-Kj2Kj>NjCNjNQjSQjSj SjTjTjyVj~VjQZjVZj]j]j `j`jajajcjcjfjfjgjgj9ij>ijjjjjljljnjnjpjpjsjsjwjwj[yj`yjzjzj}j }j>jCjj jjăjRjWjhjmjjjόjԌjejjjjj j%jUjZjjj,j1j}jj2j7jjjujzjXj]jnjsjѱjֱjjjj·jejjj jjjj9j>jajfjjjjj=jBjjj'j,jxj}jjj~jjOjTjjjjjBjGjjjjjjjjj5j:jmjrjj jjjjjFjKjTjYj}jj%j*jjjjj j jg jl j j jjjjjj jjj@jEjjjijnjjjjj5j:jjj, j1 jT!jY!j%j%je(jj(j,j,j|j:.jW.j\.j1j1j3j3j5j5j67j;7j:j:j>j?jAjAjBjBjDj Dj`EjeEjFjFj>IjCIjJjJjILjNLjOjOjgQjlQjRjRjUjUjWjWjZj Zj]j ]j^j_j`j`j5bj:bjejejfjfj[hj`hjjjjjkjkjnjnjqjqjVrj[rjtjtjwj!wjxjxj+zj0zjj|j|j|jb~jg~jjj%jj jjςjԂjjjjjMjRj$j)jjjjjŒjʒjFjKjjjojtjjjjj.j3j؟jݟjjj.j3jIjNjۧjjjĩjjj?jDjخjݮj2j7jjjXj]jٴj޴jjƶjjŹj]jbjj"jjjjj}jjjj8j=jIjNjjj%j*jjjjj^jcjjj|jjjjjjjjLjQjYj^jjj[j`jjj jjjjjjjjjjjjj"jjjs jx j j jjjjj~jjMjRj[j`jqjvjjjjjjjjjw!j|!j#j#jCj&j&j$&j}(j(jg+jl+j/j/js1jx1j4j4j57j:7j^9jc9j;j;jQ>jV>j @j@joAjtAjjCj^DjcDj6Fj;FjGjGjAIjFIjkKjpKjoMjtMjBPjGPjQjQjSjSj3Uj8UjWjWjYjYj\j\j4^j9^j`j`j0bj5bjXcj]cjdjdjfjfjgjgj>ijCijkjkjnjnjgqjlqjsjtjvjvjyjyj`|je|j~j~jjjj jjjjjȌj͌jjjnjsj˕jЕjjjjjjjLjQjtjyjjj{jjyj~jwj|jjj,j1jFjKjojtjjjjjjjjjֻjۻjjjjjjjjjjjjjj"jjjj jIjNjjjjjVj[jjj0j5jjjjjZj_jjjjj jjMjRjjjjjjjj jjjj!j5j:jjjjjjj>jCjujzjjjjj:j?jjj0j5jjj0j5jjjjjjjjjIjNjjjFjKjWj\jjjjjjjjjjjjjgjljq jv j j jj"jjjjj]jbjjjjjhjmjjjjjjjjjJjjj j. j3 j!j!j"j"jn$js$j%j%jp'ju'j(j(j)j)j,j ,j-j-j`/je/j0j0j1j1jP3jU3jK5jP5jF7jK7j#9j(9j:j:jR<jW<jA>jF>j}@j@jBjBjDjDjFjFjHjHj JjJjAKjFKjLjLjCNjHNjOjOjDQjIQjRjRjUjUjWj#Wj+Yj0YjZjZje\jj\j^j^j_j_j{ajajcjcjdjdjfjfjhjhjBjjGjjkjkjljljnjnjpjqjrjrjtjtjvj$vjxjxjzjzj~j~jqjvj2j7jхjօj\jaj j%jՊjڊjjj)j.jjjBjGjߒjj}jj˖jЖjjjjƛjjjjj;j@jjjjj0j5jjjɩjΩjjjjjjjjj{jjqjvjjj7j<j_jdjjjj j޼jjjjjjkjpjjjjj*j/jjjsjxjjjjj>jCjfjkjjjjjjj[j`jjjjjjjjjjjHjMjpjujjjjjjj jjqjvj%j*jjjju footnote_refs}j](j7jZ9es citation_refs} autofootnotes]j9aautofootnote_refs](j7jZ9esymbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jUKsRparse_messages]transform_messages] transformerN include_log] decorationNhhub.