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/SMPmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/zh_TW/core-api/SMPmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/it_IT/core-api/SMPmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/ja_JP/core-api/SMPmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/ko_KR/core-api/SMPmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/pt_BR/core-api/SMPmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/sp_SP/core-api/SMPmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h!SPDX-License-Identifier: GPL-2.0+h]h!SPDX-License-Identifier: GPL-2.0+}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh:/var/lib/git/docbuild/linux/Documentation/core-api/SMP.rsthKubhsection)}(hhh](htitle)}(hSMP primitivesh]hSMP primitives}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleon_each_cpu_mask (C function)c.on_each_cpu_maskhNtauh1hhhhhhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhNubhdesc)}(hhh](hdesc_signature)}(h_void on_each_cpu_mask (const struct cpumask *mask, smp_call_func_t func, void *info, bool wait)h]hdesc_signature_line)}(h^void on_each_cpu_mask(const struct cpumask *mask, smp_call_func_t func, void *info, bool wait)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhhhhhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhKKubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhhhhhjhKKubh desc_name)}(hon_each_cpu_maskh]h desc_sig_name)}(hon_each_cpu_maskh]hon_each_cpu_mask}(hj+hhhNhNubah}(h]h ]nah"]h$]h&]uh1j)hj%ubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1j#hhhhhjhKKubhdesc_parameterlist)}(hI(const struct cpumask *mask, smp_call_func_t func, void *info, bool wait)h](hdesc_parameter)}(hconst struct cpumask *maskh](hdesc_sig_keyword)}(hconsth]hconst}(hjPhhhNhNubah}(h]h ]kah"]h$]h&]uh1jNhjJubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubjO)}(hstructh]hstruct}(hjmhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjJubj)}(h h]h }(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubh)}(hhh]j*)}(hcpumaskh]hcpumask}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jj-sbc.on_each_cpu_maskasbuh1hhjJubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjJubj*)}(hmaskh]hmask}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjJubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjDubjI)}(hsmp_call_func_t funch](h)}(hhh]j*)}(hsmp_call_func_th]hsmp_call_func_t}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.on_each_cpu_maskasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hfunch]hfunc}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjDubjI)}(h void *infoh](j)}(hvoidh]hvoid}(hj5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj1ubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(hjh]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj*)}(hinfoh]hinfo}(hj^hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj1ubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjDubjI)}(h bool waith](j)}(hboolh]hbool}(hjwhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj*)}(hwaith]hwait}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjsubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjDubeh}(h]h ]h"]h$]h&]hhuh1jBhhhhhjhKKubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1hsphinx_line_type declaratorhhhhhjhKKubah}(h]hah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1hhjhKKhhhhubh desc_content)}(hhh]h paragraph)}(hYRun a function on processors specified by cpumask, which may include the local processor.h]hYRun a function on processors specified by cpumask, which may include the local processor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhKKhjhhubah}(h]h ]h"]h$]h&]uh1jhhhhhjhKKubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1hhhhhhhhNubh container)}(hX**Parameters** ``const struct cpumask *mask`` The set of cpus to run on (only runs on online subset). ``smp_call_func_t func`` The function to run. This must be fast and non-blocking. ``void *info`` An arbitrary pointer to pass to the function. ``bool wait`` If true, wait (atomically) until function has completed on other CPUs. **Description** If **wait** is true, then returns once **func** has returned. You must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler. The exception is that it may be used during early boot while early_boot_irqs_disabled is set.h](j)}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhKOhjubhdefinition_list)}(hhh](hdefinition_list_item)}(hW``const struct cpumask *mask`` The set of cpus to run on (only runs on online subset). h](hterm)}(h``const struct cpumask *mask``h]hliteral)}(hjh]hconst struct cpumask *mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhKMhjubh definition)}(hhh]j)}(h7The set of cpus to run on (only runs on online subset).h]h7The set of cpus to run on (only runs on online subset).}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1hKMhj4ubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhj1hKMhj ubj)}(hR``smp_call_func_t func`` The function to run. This must be fast and non-blocking. h](j)}(h``smp_call_func_t func``h]j)}(hjWh]hsmp_call_func_t func}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhKNhjQubj3)}(hhh]j)}(h8The function to run. This must be fast and non-blocking.h]h8The function to run. This must be fast and non-blocking.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlhKNhjmubah}(h]h ]h"]h$]h&]uh1j2hjQubeh}(h]h ]h"]h$]h&]uh1jhjlhKNhj ubj)}(h=``void *info`` An arbitrary pointer to pass to the function. h](j)}(h``void *info``h]j)}(hjh]h void *info}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhKOhjubj3)}(hhh]j)}(h-An arbitrary pointer to pass to the function.h]h-An arbitrary pointer to pass to the function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKOhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhKOhj ubj)}(hU``bool wait`` If true, wait (atomically) until function has completed on other CPUs. h](j)}(h ``bool wait``h]j)}(hjh]h bool wait}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhKQhjubj3)}(hhh]j)}(hFIf true, wait (atomically) until function has completed on other CPUs.h]hFIf true, wait (atomically) until function has completed on other CPUs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhKPhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhKQhj ubeh}(h]h ]h"]h$]h&]uh1j hjubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhKShjubj)}(h=If **wait** is true, then returns once **func** has returned.h](hIf }(hjhhhNhNubj)}(h**wait**h]hwait}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is true, then returns once }(hjhhhNhNubj)}(h**func**h]hfunc}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh has returned.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhKRhjubj)}(hYou must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler. The exception is that it may be used during early boot while early_boot_irqs_disabled is set.h]hYou must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler. The exception is that it may be used during early boot while early_boot_irqs_disabled is set.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhKThjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhhhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hsmp_processor_id (C macro)c.smp_processor_idhNtauh1hhhhhhhhNubh)}(hhh](h)}(hsmp_processor_idh]h)}(hsmp_processor_idh]j$)}(hsmp_processor_idh]j*)}(hjwh]hsmp_processor_id}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj}ubah}(h]h ](j=j>eh"]h$]h&]hhuh1j#hjyhhhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhMubah}(h]h ]h"]h$]h&]hhjuh1hjjhjuhhhjhMubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjrhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjrhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjjjuh1hhhhhhhhNubj)}(h``smp_processor_id ()``h]j)}(hjh]hsmp_processor_id ()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhMhhhhubh block_quote)}(hXo get the current (stable) CPU id **Description** This is the normal accessor to the CPU id and should be used whenever possible. The CPU id is stable when: - IRQs are disabled; - preemption is disabled; - the task is CPU affine. When CONFIG_DEBUG_PREEMPT=y, we verify these assumptions and WARN when smp_processor_id() is used when the CPU id is not stable. h](j)}(h get the current (stable) CPU id h]j)}(hget the current (stable) CPU idh]hget the current (stable) CPU id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhMhjubj)}(hOThis is the normal accessor to the CPU id and should be used whenever possible.h]hOThis is the normal accessor to the CPU id and should be used whenever possible.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhMhjubj)}(hThe CPU id is stable when:h]hThe CPU id is stable when:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhMhjubj)}(hI- IRQs are disabled; - preemption is disabled; - the task is CPU affine. h]h bullet_list)}(hhh](h list_item)}(hIRQs are disabled;h]j)}(hj+h]hIRQs are disabled;}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhMhj)ubah}(h]h ]h"]h$]h&]uh1j'hj$ubj()}(hpreemption is disabled;h]j)}(hjCh]hpreemption is disabled;}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhMhjAubah}(h]h ]h"]h$]h&]uh1j'hj$ubj()}(hthe task is CPU affine. h]j)}(hthe task is CPU affine.h]hthe task is CPU affine.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhMhjYubah}(h]h ]h"]h$]h&]uh1j'hj$ubeh}(h]h ]h"]h$]h&]bullet-uh1j"hj:hMhjubah}(h]h ]h"]h$]h&]uh1jhj:hMhjubj)}(hWhen CONFIG_DEBUG_PREEMPT=y, we verify these assumptions and WARN when smp_processor_id() is used when the CPU id is not stable.h]hWhen CONFIG_DEBUG_PREEMPT=y, we verify these assumptions and WARN when smp_processor_id() is used when the CPU id is not stable.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/SMP:7: ./include/linux/smp.hhM hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%smp_call_function_single (C function)c.smp_call_function_singlehNtauh1hhhhhhNhNubh)}(hhh](h)}(hSint smp_call_function_single (int cpu, smp_call_func_t func, void *info, bool wait)h]h)}(hRint smp_call_function_single(int cpu, smp_call_func_t func, void *info, bool wait)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjhhhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj$)}(hsmp_call_function_singleh]j*)}(hsmp_call_function_singleh]hsmp_call_function_single}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ](j=j>eh"]h$]h&]hhuh1j#hjhhhjhMubjC)}(h6(int cpu, smp_call_func_t func, void *info, bool wait)h](jI)}(hint cpuh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hcpuh]hcpu}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubjI)}(hsmp_call_func_t funch](h)}(hhh]j*)}(hsmp_call_func_th]hsmp_call_func_t}(hj#hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj%modnameN classnameNjj)}j]j)}jjsbc.smp_call_function_singleasbuh1hhjubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hfunch]hfunc}(hjQhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubjI)}(h void *infoh](j)}(hvoidh]hvoid}(hjjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjfubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj*)}(hinfoh]hinfo}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjfubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubjI)}(h bool waith](j)}(hjyh]hbool}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hwaith]hwait}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubeh}(h]h ]h"]h$]h&]hhuh1jBhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(h Run a function on a specific CPUh]h Run a function on a specific CPU}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1hhhhhhNhNubj)}(hX`**Parameters** ``int cpu`` Specific target CPU for this function. ``smp_call_func_t func`` The function to run. This must be fast and non-blocking. ``void *info`` An arbitrary pointer to pass to the function. ``bool wait`` If true, wait until function has completed on other CPUs. **Return** ``0`` on success, else a negative status code.h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj ubj )}(hhh](j)}(h3``int cpu`` Specific target CPU for this function. h](j)}(h ``int cpu``h]j)}(hj2h]hint cpu}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj,ubj3)}(hhh]j)}(h&Specific target CPU for this function.h]h&Specific target CPU for this function.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGhMhjHubah}(h]h ]h"]h$]h&]uh1j2hj,ubeh}(h]h ]h"]h$]h&]uh1jhjGhMhj)ubj)}(hR``smp_call_func_t func`` The function to run. This must be fast and non-blocking. h](j)}(h``smp_call_func_t func``h]j)}(hjkh]hsmp_call_func_t func}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjeubj3)}(hhh]j)}(h8The function to run. This must be fast and non-blocking.h]h8The function to run. This must be fast and non-blocking.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j2hjeubeh}(h]h ]h"]h$]h&]uh1jhjhMhj)ubj)}(h=``void *info`` An arbitrary pointer to pass to the function. h](j)}(h``void *info``h]j)}(hjh]h void *info}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj3)}(hhh]j)}(h-An arbitrary pointer to pass to the function.h]h-An arbitrary pointer to pass to the function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj)ubj)}(hH``bool wait`` If true, wait until function has completed on other CPUs. h](j)}(h ``bool wait``h]j)}(hjh]h bool wait}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj3)}(hhh]j)}(h9If true, wait until function has completed on other CPUs.h]h9If true, wait until function has completed on other CPUs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj)ubeh}(h]h ]h"]h$]h&]uh1j hj ubj)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj ubj)}(h.``0`` on success, else a negative status code.h](j)}(h``0``h]h0}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh) on success, else a negative status code.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h+smp_call_function_single_async (C function) c.smp_call_function_single_asynchNtauh1hhhhhhNhNubh)}(hhh](h)}(hEint smp_call_function_single_async (int cpu, call_single_data_t *csd)h]h)}(hDint smp_call_function_single_async(int cpu, call_single_data_t *csd)h](j)}(hinth]hint}(hjkhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjghhhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjghhhjyhMubj$)}(hsmp_call_function_single_asynch]j*)}(hsmp_call_function_single_asynch]hsmp_call_function_single_async}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ](j=j>eh"]h$]h&]hhuh1j#hjghhhjyhMubjC)}(h"(int cpu, call_single_data_t *csd)h](jI)}(hint cpuh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hcpuh]hcpu}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubjI)}(hcall_single_data_t *csdh](h)}(hhh]j*)}(hcall_single_data_th]hcall_single_data_t}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsb c.smp_call_function_single_asyncasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hcsdh]hcsd}(hj hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubeh}(h]h ]h"]h$]h&]hhuh1jBhjghhhjyhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjchhhjyhMubah}(h]j^ah ](jjeh"]h$]h&]jj)jhuh1hhjyhMhj`hhubj)}(hhh]j)}(h/Run an asynchronous function on a specific CPU.h]h/Run an asynchronous function on a specific CPU.}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjB hhubah}(h]h ]h"]h$]h&]uh1jhj`hhhjyhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj] jj] jjjuh1hhhhhhNhNubj)}(hXc**Parameters** ``int cpu`` The CPU to run on. ``call_single_data_t *csd`` Pre-allocated and setup data structure **Description** Like smp_call_function_single(), but the call is asynchonous and can thus be done from contexts with disabled interrupts. The caller passes his own pre-allocated data structure (ie: embedded in an object) and is responsible for synchronizing it such that the IPIs performed on the **csd** are strictly serialized. If the function is called with one csd which has not yet been processed by previous call to smp_call_function_single_async(), the function will return immediately with -EBUSY showing that the csd object is still in progress. **NOTE** Be careful, there is unfortunately no current debugging facility to validate the correctness of this serialization. **Return** ``0`` on success or negative errno value on errorh](j)}(h**Parameters**h]j)}(hjg h]h Parameters}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhja ubj )}(hhh](j)}(h``int cpu`` The CPU to run on. h](j)}(h ``int cpu``h]j)}(hj h]hint cpu}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj ubj3)}(hhh]j)}(hThe CPU to run on.h]hThe CPU to run on.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hMhj ubah}(h]h ]h"]h$]h&]uh1j2hj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj} ubj)}(hC``call_single_data_t *csd`` Pre-allocated and setup data structure h](j)}(h``call_single_data_t *csd``h]j)}(hj h]hcall_single_data_t *csd}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj ubj3)}(hhh]j)}(h&Pre-allocated and setup data structureh]h&Pre-allocated and setup data structure}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hMhj ubah}(h]h ]h"]h$]h&]uh1j2hj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj} ubeh}(h]h ]h"]h$]h&]uh1j hja ubj)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhja ubj)}(hyLike smp_call_function_single(), but the call is asynchonous and can thus be done from contexts with disabled interrupts.h]hyLike smp_call_function_single(), but the call is asynchonous and can thus be done from contexts with disabled interrupts.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhja ubj)}(hThe caller passes his own pre-allocated data structure (ie: embedded in an object) and is responsible for synchronizing it such that the IPIs performed on the **csd** are strictly serialized.h](hThe caller passes his own pre-allocated data structure (ie: embedded in an object) and is responsible for synchronizing it such that the IPIs performed on the }(hj hhhNhNubj)}(h**csd**h]hcsd}(hj' hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh are strictly serialized.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM hja ubj)}(hIf the function is called with one csd which has not yet been processed by previous call to smp_call_function_single_async(), the function will return immediately with -EBUSY showing that the csd object is still in progress.h]hIf the function is called with one csd which has not yet been processed by previous call to smp_call_function_single_async(), the function will return immediately with -EBUSY showing that the csd object is still in progress.}(hj@ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhja ubj)}(h**NOTE**h]j)}(hjQ h]hNOTE}(hjS hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjO ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhja ubj)}(hsBe careful, there is unfortunately no current debugging facility to validate the correctness of this serialization.h]hsBe careful, there is unfortunately no current debugging facility to validate the correctness of this serialization.}(hjg hhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhja ubj)}(h **Return**h]j)}(hjx h]hReturn}(hjz hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhja ubj)}(h1``0`` on success or negative errno value on errorh](j)}(h``0``h]h0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh, on success or negative errno value on error}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhja ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"smp_call_function_any (C function)c.smp_call_function_anyhNtauh1hhhhhhNhNubh)}(hhh](h)}(hbint smp_call_function_any (const struct cpumask *mask, smp_call_func_t func, void *info, int wait)h]h)}(haint smp_call_function_any(const struct cpumask *mask, smp_call_func_t func, void *info, int wait)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj hhhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM1ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hM1ubj$)}(hsmp_call_function_anyh]j*)}(hsmp_call_function_anyh]hsmp_call_function_any}(hj hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj ubah}(h]h ](j=j>eh"]h$]h&]hhuh1j#hj hhhj hM1ubjC)}(hH(const struct cpumask *mask, smp_call_func_t func, void *info, int wait)h](jI)}(hconst struct cpumask *maskh](jO)}(hjRh]hconst}(hj hhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjO)}(hjoh]hstruct}(hj# hhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhj ubj)}(h h]h }(hj0 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j*)}(hcpumaskh]hcpumask}(hjA hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj> ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjC modnameN classnameNjj)}j]j)}jj sbc.smp_call_function_anyasbuh1hhj ubj)}(h h]h }(hja hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hjo hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj*)}(hmaskh]hmask}(hj| hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhj ubjI)}(hsmp_call_func_t funch](h)}(hhh]j*)}(hsmp_call_func_th]hsmp_call_func_t}(hj hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j] c.smp_call_function_anyasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj*)}(hfunch]hfunc}(hj hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhj ubjI)}(h void *infoh](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj*)}(hinfoh]hinfo}(hj hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhj ubjI)}(hint waith](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj ubj)}(h h]h }(hj- hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj*)}(hwaith]hwait}(hj; hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhj ubeh}(h]h ]h"]h$]h&]hhuh1jBhj hhhj hM1ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj hhhj hM1ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1hhj hM1hj hhubj)}(hhh]j)}(h'Run a function on any of the given cpush]h'Run a function on any of the given cpus}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM1hjb hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM1ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj} jj} jjjuh1hhhhhhNhNubj)}(hX**Parameters** ``const struct cpumask *mask`` The mask of cpus it can run on. ``smp_call_func_t func`` The function to run. This must be fast and non-blocking. ``void *info`` An arbitrary pointer to pass to the function. ``int wait`` If true, wait until function has completed. **Description** Selection preference: 1) current cpu if in **mask** 2) nearest cpu in **mask**, based on NUMA topology **Return** ``0`` on success, else a negative status code (if no cpus were online).h](j)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM5hj ubj )}(hhh](j)}(h?``const struct cpumask *mask`` The mask of cpus it can run on. h](j)}(h``const struct cpumask *mask``h]j)}(hj h]hconst struct cpumask *mask}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM2hj ubj3)}(hhh]j)}(hThe mask of cpus it can run on.h]hThe mask of cpus it can run on.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hM2hj ubah}(h]h ]h"]h$]h&]uh1j2hj ubeh}(h]h ]h"]h$]h&]uh1jhj hM2hj ubj)}(hR``smp_call_func_t func`` The function to run. This must be fast and non-blocking. h](j)}(h``smp_call_func_t func``h]j)}(hj h]hsmp_call_func_t func}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM3hj ubj3)}(hhh]j)}(h8The function to run. This must be fast and non-blocking.h]h8The function to run. This must be fast and non-blocking.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hM3hj ubah}(h]h ]h"]h$]h&]uh1j2hj ubeh}(h]h ]h"]h$]h&]uh1jhj hM3hj ubj)}(h=``void *info`` An arbitrary pointer to pass to the function. h](j)}(h``void *info``h]j)}(hj h]h void *info}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM4hj ubj3)}(hhh]j)}(h-An arbitrary pointer to pass to the function.h]h-An arbitrary pointer to pass to the function.}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj- hM4hj. ubah}(h]h ]h"]h$]h&]uh1j2hj ubeh}(h]h ]h"]h$]h&]uh1jhj- hM4hj ubj)}(h9``int wait`` If true, wait until function has completed. h](j)}(h ``int wait``h]j)}(hjQ h]hint wait}(hjS hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjO ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM5hjK ubj3)}(hhh]j)}(h+If true, wait until function has completed.h]h+If true, wait until function has completed.}(hjj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf hM5hjg ubah}(h]h ]h"]h$]h&]uh1j2hjK ubeh}(h]h ]h"]h$]h&]uh1jhjf hM5hj ubeh}(h]h ]h"]h$]h&]uh1j hj ubj)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM7hj ubj )}(hhh]j)}(hgSelection preference: 1) current cpu if in **mask** 2) nearest cpu in **mask**, based on NUMA topology h](j)}(hSelection preference:h]hSelection preference:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM8hj ubj3)}(hhh]henumerated_list)}(hhh](j()}(hcurrent cpu if in **mask**h]j)}(hj h](hcurrent cpu if in }(hj hhhNhNubj)}(h**mask**h]hmask}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM7hj ubah}(h]h ]h"]h$]h&]uh1j'hj ubj()}(h0nearest cpu in **mask**, based on NUMA topology h]j)}(h/nearest cpu in **mask**, based on NUMA topologyh](hnearest cpu in }(hj hhhNhNubj)}(h**mask**h]hmask}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh, based on NUMA topology}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj hM8hj ubah}(h]h ]h"]h$]h&]uh1j'hj ubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix)uh1j hj ubah}(h]h ]h"]h$]h&]uh1j2hj ubeh}(h]h ]h"]h$]h&]uh1jhj hM8hj ubah}(h]h ]h"]h$]h&]uh1j hj ubj)}(h **Return**h]j)}(hj/h]hReturn}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM:hj ubj)}(hG``0`` on success, else a negative status code (if no cpus were online).h](j)}(h``0``h]h0}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubhB on success, else a negative status code (if no cpus were online).}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM;hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#smp_call_function_many (C function)c.smp_call_function_manyhNtauh1hhhhhhNhNubh)}(hhh](h)}(hevoid smp_call_function_many (const struct cpumask *mask, smp_call_func_t func, void *info, bool wait)h]h)}(hdvoid smp_call_function_many(const struct cpumask *mask, smp_call_func_t func, void *info, bool wait)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj~hhhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~hhhjhMubj$)}(hsmp_call_function_manyh]j*)}(hsmp_call_function_manyh]hsmp_call_function_many}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ](j=j>eh"]h$]h&]hhuh1j#hj~hhhjhMubjC)}(hI(const struct cpumask *mask, smp_call_func_t func, void *info, bool wait)h](jI)}(hconst struct cpumask *maskh](jO)}(hjRh]hconst}(hjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjO)}(hjoh]hstruct}(hjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j*)}(hcpumaskh]hcpumask}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.smp_call_function_manyasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hmaskh]hmask}(hj3hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubjI)}(hsmp_call_func_t funch](h)}(hhh]j*)}(hsmp_call_func_th]hsmp_call_func_t}(hjOhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjLubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjQmodnameN classnameNjj)}j]jc.smp_call_function_manyasbuh1hhjHubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj*)}(hfunch]hfunc}(hj{hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjHubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubjI)}(h void *infoh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hinfoh]hinfo}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubjI)}(h bool waith](j)}(hjyh]hbool}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hwaith]hwait}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubeh}(h]h ]h"]h$]h&]hhuh1jBhj~hhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjzhhhjhMubah}(h]juah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjwhhubj)}(hhh]j)}(h Run a function on a set of CPUs.h]h Run a function on a set of CPUs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjwhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj3jj3jjjuh1hhhhhhNhNubj)}(hXw**Parameters** ``const struct cpumask *mask`` The set of cpus to run on (only runs on online subset). ``smp_call_func_t func`` The function to run. This must be fast and non-blocking. ``void *info`` An arbitrary pointer to pass to the function. ``bool wait`` If true, wait (atomically) until function has completed on other CPUs. **Description** You must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler. **func** is not called on the local CPU even if **mask** contains it. Consider using on_each_cpu_cond_mask() instead if this is not desirable.h](j)}(h**Parameters**h]j)}(hj=h]h Parameters}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj7ubj )}(hhh](j)}(hW``const struct cpumask *mask`` The set of cpus to run on (only runs on online subset). h](j)}(h``const struct cpumask *mask``h]j)}(hj\h]hconst struct cpumask *mask}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjVubj3)}(hhh]j)}(h7The set of cpus to run on (only runs on online subset).h]h7The set of cpus to run on (only runs on online subset).}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqhMhjrubah}(h]h ]h"]h$]h&]uh1j2hjVubeh}(h]h ]h"]h$]h&]uh1jhjqhMhjSubj)}(hR``smp_call_func_t func`` The function to run. This must be fast and non-blocking. h](j)}(h``smp_call_func_t func``h]j)}(hjh]hsmp_call_func_t func}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj3)}(hhh]j)}(h8The function to run. This must be fast and non-blocking.h]h8The function to run. This must be fast and non-blocking.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjSubj)}(h=``void *info`` An arbitrary pointer to pass to the function. h](j)}(h``void *info``h]j)}(hjh]h void *info}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj3)}(hhh]j)}(h-An arbitrary pointer to pass to the function.h]h-An arbitrary pointer to pass to the function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjSubj)}(hU``bool wait`` If true, wait (atomically) until function has completed on other CPUs. h](j)}(h ``bool wait``h]j)}(hjh]h bool wait}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj3)}(hhh]j)}(hFIf true, wait (atomically) until function has completed on other CPUs.h]hFIf true, wait (atomically) until function has completed on other CPUs.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjSubeh}(h]h ]h"]h$]h&]uh1j hj7ubj)}(h**Description**h]j)}(hjCh]h Description}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj7ubj)}(h|You must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler.h]h|You must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj7ubj)}(h**func** is not called on the local CPU even if **mask** contains it. Consider using on_each_cpu_cond_mask() instead if this is not desirable.h](j)}(h**func**h]hfunc}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh( is not called on the local CPU even if }(hjhhhhNhNubj)}(h**mask**h]hmask}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubhW contains it. Consider using on_each_cpu_cond_mask() instead if this is not desirable.}(hjhhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hsmp_call_function (C function)c.smp_call_functionhNtauh1hhhhhhNhNubh)}(hhh](h)}(hCvoid smp_call_function (smp_call_func_t func, void *info, int wait)h]h)}(hBvoid smp_call_function(smp_call_func_t func, void *info, int wait)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjhhhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj$)}(hsmp_call_functionh]j*)}(hsmp_call_functionh]hsmp_call_function}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ](j=j>eh"]h$]h&]hhuh1j#hjhhhjhMubjC)}(h,(smp_call_func_t func, void *info, int wait)h](jI)}(hsmp_call_func_t funch](h)}(hhh]j*)}(hsmp_call_func_th]hsmp_call_func_t}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.smp_call_functionasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hfunch]hfunc}(hj%hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubjI)}(h void *infoh](j)}(hvoidh]hvoid}(hj>hhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj:ubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hjh]h*}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj*)}(hinfoh]hinfo}(hjghhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj:ubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubjI)}(hint waith](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj|ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj*)}(hwaith]hwait}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj|ubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjubeh}(h]h ]h"]h$]h&]hhuh1jBhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(h!Run a function on all other CPUs.h]h!Run a function on all other CPUs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1hhhhhhNhNubj)}(hX **Parameters** ``smp_call_func_t func`` The function to run. This must be fast and non-blocking. ``void *info`` An arbitrary pointer to pass to the function. ``int wait`` If true, wait (atomically) until function has completed on other CPUs. **Description** If **wait** is true, then returns once **func** has returned; otherwise it returns just before the target cpu calls **func**. You must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler.h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM hjubj )}(hhh](j)}(hR``smp_call_func_t func`` The function to run. This must be fast and non-blocking. h](j)}(h``smp_call_func_t func``h]j)}(hjh]hsmp_call_func_t func}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj3)}(hhh]j)}(h8The function to run. This must be fast and non-blocking.h]h8The function to run. This must be fast and non-blocking.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h=``void *info`` An arbitrary pointer to pass to the function. h](j)}(h``void *info``h]j)}(hj@h]h void *info}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj:ubj3)}(hhh]j)}(h-An arbitrary pointer to pass to the function.h]h-An arbitrary pointer to pass to the function.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUhMhjVubah}(h]h ]h"]h$]h&]uh1j2hj:ubeh}(h]h ]h"]h$]h&]uh1jhjUhMhjubj)}(hT``int wait`` If true, wait (atomically) until function has completed on other CPUs. h](j)}(h ``int wait``h]j)}(hjyh]hint wait}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM hjsubj3)}(hhh]j)}(hFIf true, wait (atomically) until function has completed on other CPUs.h]hFIf true, wait (atomically) until function has completed on other CPUs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubah}(h]h ]h"]h$]h&]uh1j2hjsubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1j hjubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM hjubj)}(h}If **wait** is true, then returns once **func** has returned; otherwise it returns just before the target cpu calls **func**.h](hIf }(hjhhhNhNubj)}(h**wait**h]hwait}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is true, then returns once }(hjhhhNhNubj)}(h**func**h]hfunc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhE has returned; otherwise it returns just before the target cpu calls }(hjhhhNhNubj)}(h**func**h]hfunc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM hjubj)}(h|You must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler.h]h|You must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"on_each_cpu_cond_mask (C function)c.on_each_cpu_cond_maskhNtauh1hhhhhhNhNubh)}(hhh](h)}(hvoid on_each_cpu_cond_mask (smp_cond_func_t cond_func, smp_call_func_t func, void *info, bool wait, const struct cpumask *mask)h]h)}(h~void on_each_cpu_cond_mask(smp_cond_func_t cond_func, smp_call_func_t func, void *info, bool wait, const struct cpumask *mask)h](j)}(hvoidh]hvoid}(hj?hhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj;hhhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMqubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhjMhMqubj$)}(hon_each_cpu_cond_maskh]j*)}(hon_each_cpu_cond_maskh]hon_each_cpu_cond_mask}(hj`hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj\ubah}(h]h ](j=j>eh"]h$]h&]hhuh1j#hj;hhhjMhMqubjC)}(hd(smp_cond_func_t cond_func, smp_call_func_t func, void *info, bool wait, const struct cpumask *mask)h](jI)}(hsmp_cond_func_t cond_funch](h)}(hhh]j*)}(hsmp_cond_func_th]hsmp_cond_func_t}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj|ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjbsbc.on_each_cpu_cond_maskasbuh1hhjxubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj*)}(h cond_funch]h cond_func}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjxubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjtubjI)}(hsmp_call_func_t funch](h)}(hhh]j*)}(hsmp_call_func_th]hsmp_call_func_t}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.on_each_cpu_cond_maskasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hfunch]hfunc}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjtubjI)}(h void *infoh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj*)}(hinfoh]hinfo}(hj7hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjtubjI)}(h bool waith](j)}(hjyh]hbool}(hjPhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjLubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj*)}(hwaith]hwait}(hjkhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjLubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjtubjI)}(hconst struct cpumask *maskh](jO)}(hjRh]hconst}(hjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjO)}(hjoh]hstruct}(hjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j*)}(hcpumaskh]hcpumask}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ]h"]h$]h&] refdomainjreftype5nj reftargetjmodnameN classnameNjj)}j]jc.on_each_cpu_cond_maskasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hmaskh]hmask}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjtubeh}(h]h ]h"]h$]h&]hhuh1jBhj;hhhjMhMqubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj7hhhjMhMqubah}(h]j2ah ](jjeh"]h$]h&]jj)jhuh1hhjMhMqhj4hhubj)}(hhh]j)}(hCall a function on each processor for which the supplied function cond_func returns true, optionally waiting for all the required CPUs to finish. This may include the local processor.h]hCall a function on each processor for which the supplied function cond_func returns true, optionally waiting for all the required CPUs to finish. This may include the local processor.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMqhjhhubah}(h]h ]h"]h$]h&]uh1jhj4hhhjMhMqubeh}(h]h ](jfunctioneh"]h$]h&]jjjj8jj8jjjuh1hhhhhhNhNubj)}(hX8**Parameters** ``smp_cond_func_t cond_func`` A callback function that is passed a cpu id and the info parameter. The function is called with preemption disabled. The function should return a boolean value indicating whether to IPI the specified CPU. ``smp_call_func_t func`` The function to run on all applicable CPUs. This must be fast and non-blocking. ``void *info`` An arbitrary pointer to pass to both functions. ``bool wait`` If true, wait until function has completed on other CPUs. ``const struct cpumask *mask`` The set of cpus to run on (only runs on online subset). **Description** Target CPU selection and work queueing are done with preemption disabled. This protects against CPUs going offline, but not against CPUs coming online concurrently; newly online CPUs are not guaranteed to be seen or sent an IPI. If **wait** is true, the final wait for remote completion happens after that preemption-disabled section. You must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler.h](j)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMuhj<ubj )}(hhh](j)}(h``smp_cond_func_t cond_func`` A callback function that is passed a cpu id and the info parameter. The function is called with preemption disabled. The function should return a boolean value indicating whether to IPI the specified CPU. h](j)}(h``smp_cond_func_t cond_func``h]j)}(hjah]hsmp_cond_func_t cond_func}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMyhj[ubj3)}(hhh]j)}(hA callback function that is passed a cpu id and the info parameter. The function is called with preemption disabled. The function should return a boolean value indicating whether to IPI the specified CPU.h]hA callback function that is passed a cpu id and the info parameter. The function is called with preemption disabled. The function should return a boolean value indicating whether to IPI the specified CPU.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMuhjwubah}(h]h ]h"]h$]h&]uh1j2hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMyhjXubj)}(hi``smp_call_func_t func`` The function to run on all applicable CPUs. This must be fast and non-blocking. h](j)}(h``smp_call_func_t func``h]j)}(hjh]hsmp_call_func_t func}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM{hjubj3)}(hhh]j)}(hOThe function to run on all applicable CPUs. This must be fast and non-blocking.h]hOThe function to run on all applicable CPUs. This must be fast and non-blocking.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMzhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhM{hjXubj)}(h?``void *info`` An arbitrary pointer to pass to both functions. h](j)}(h``void *info``h]j)}(hjh]h void *info}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM|hjubj3)}(hhh]j)}(h/An arbitrary pointer to pass to both functions.h]h/An arbitrary pointer to pass to both functions.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhM|hjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhM|hjXubj)}(hH``bool wait`` If true, wait until function has completed on other CPUs. h](j)}(h ``bool wait``h]j)}(hjh]h bool wait}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM}hjubj3)}(hhh]j)}(h9If true, wait until function has completed on other CPUs.h]h9If true, wait until function has completed on other CPUs.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#hM}hj$ubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhj#hM}hjXubj)}(hW``const struct cpumask *mask`` The set of cpus to run on (only runs on online subset). h](j)}(h``const struct cpumask *mask``h]j)}(hjGh]hconst struct cpumask *mask}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chM~hjAubj3)}(hhh]j)}(h7The set of cpus to run on (only runs on online subset).h]h7The set of cpus to run on (only runs on online subset).}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\hM~hj]ubah}(h]h ]h"]h$]h&]uh1j2hjAubeh}(h]h ]h"]h$]h&]uh1jhj\hM~hjXubeh}(h]h ]h"]h$]h&]uh1j hj<ubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj<ubj)}(hXNTarget CPU selection and work queueing are done with preemption disabled. This protects against CPUs going offline, but not against CPUs coming online concurrently; newly online CPUs are not guaranteed to be seen or sent an IPI. If **wait** is true, the final wait for remote completion happens after that preemption-disabled section.h](hTarget CPU selection and work queueing are done with preemption disabled. This protects against CPUs going offline, but not against CPUs coming online concurrently; newly online CPUs are not guaranteed to be seen or sent an IPI. If }(hjhhhNhNubj)}(h**wait**h]hwait}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh^ is true, the final wait for remote completion happens after that preemption-disabled section.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj<ubj)}(h|You must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler.h]h|You must not call this function with disabled interrupts or from a hardware interrupt handler or from a bottom half handler.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkick_all_cpus_sync (C function)c.kick_all_cpus_synchNtauh1hhhhhhNhNubh)}(hhh](h)}(hvoid kick_all_cpus_sync (void)h]h)}(hvoid kick_all_cpus_sync(void)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjhhhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj$)}(hkick_all_cpus_synch]j*)}(hkick_all_cpus_synch]hkick_all_cpus_sync}(hj hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubah}(h]h ](j=j>eh"]h$]h&]hhuh1j#hjhhhjhMubjC)}(h(void)h]jI)}(hvoidh]j)}(hvoidh]hvoid}(hj%hhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]noemphhhuh1jHhjubah}(h]h ]h"]h$]h&]hhuh1jBhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(hForce all cpus out of idleh]hForce all cpus out of idle}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjLhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjgjjgjjjuh1hhhhhhNhNubj)}(hX**Parameters** ``void`` no arguments **Description** Used to synchronize the update of pm_idle function pointer. It's called after the pointer is updated and returns after the dummy callback function has been executed on all cpus. The execution of the function can only happen on the remote cpus after they have left the idle function which had been called via pm_idle function pointer. So it's guaranteed that nothing uses the previous pointer anymore.h](j)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjkubj )}(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&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chKhjubj3)}(hhh]j)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjkubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chKhjkubj)}(hXUsed to synchronize the update of pm_idle function pointer. It's called after the pointer is updated and returns after the dummy callback function has been executed on all cpus. The execution of the function can only happen on the remote cpus after they have left the idle function which had been called via pm_idle function pointer. So it's guaranteed that nothing uses the previous pointer anymore.h]hXUsed to synchronize the update of pm_idle function pointer. It’s called after the pointer is updated and returns after the dummy callback function has been executed on all cpus. The execution of the function can only happen on the remote cpus after they have left the idle function which had been called via pm_idle function pointer. So it’s guaranteed that nothing uses the previous pointer anymore.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"wake_up_all_idle_cpus (C function)c.wake_up_all_idle_cpushNtauh1hhhhhhNhNubh)}(hhh](h)}(h!void wake_up_all_idle_cpus (void)h]h)}(h void wake_up_all_idle_cpus(void)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj hhhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMubj$)}(hwake_up_all_idle_cpush]j*)}(hwake_up_all_idle_cpush]hwake_up_all_idle_cpus}(hj1hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj-ubah}(h]h ](j=j>eh"]h$]h&]hhuh1j#hj hhhjhMubjC)}(h(void)h]jI)}(hvoidh]j)}(hvoidh]hvoid}(hjMhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]noemphhhuh1jHhjEubah}(h]h ]h"]h$]h&]hhuh1jBhj hhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(hbreak all cpus out of idle wake_up_all_idle_cpus try to break all cpus which is in idle state even including idle polling cpus, for non-idle cpus, we will do nothing for them.h]hbreak all cpus out of idle wake_up_all_idle_cpus try to break all cpus which is in idle state even including idle polling cpus, for non-idle cpus, we will do nothing for them.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjthhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1hhhhhhNhNubj)}(h'**Parameters** ``void`` no argumentsh](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj )}(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&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj3)}(hhh]j)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chKhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hsmp_call_on_cpu (C function)c.smp_call_on_cpuhNtauh1hhhhhhNhNubh)}(hhh](h)}(hQint smp_call_on_cpu (unsigned int cpu, int (*func)(void *), void *par, bool phys)h]h)}(hOint smp_call_on_cpu(unsigned int cpu, int (*func)(void*), void *par, bool phys)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjhhhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMubj$)}(hsmp_call_on_cpuh]j*)}(hsmp_call_on_cpuh]hsmp_call_on_cpu}(hj3hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj/ubah}(h]h ](j=j>eh"]h$]h&]hhuh1j#hjhhhj hMubjC)}(h<(unsigned int cpu, int (*func)(void*), void *par, bool phys)h](jI)}(hunsigned int cpuh](j)}(hunsignedh]hunsigned}(hjOhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjKubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hinth]hint}(hjkhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjKubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj*)}(hcpuh]hcpu}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjKubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjGubjI)}(hint (*func)(void*)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h(h]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj*)}(hfunch]hfunc}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjubj)}(hjh]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjGubjI)}(h void *parh](j)}(hvoidh]hvoid}(hj2hhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhj.ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj*)}(hparh]hpar}(hj[hhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hj.ubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjGubjI)}(h bool physh](j)}(hjyh]hbool}(hjthhhNhNubah}(h]h ]j ah"]h$]h&]uh1jhjpubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj*)}(hphysh]hphys}(hjhhhNhNubah}(h]h ]j6ah"]h$]h&]uh1j)hjpubeh}(h]h ]h"]h$]h&]noemphhhuh1jHhjGubeh}(h]h ]h"]h$]h&]hhuh1jBhjhhhj hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj hhhj hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhj hMhjhhubj)}(hhh]j)}(h` for more info. **Return** ``-ENXIO`` if the **cpu** is invalid; otherwise the return value from **func**.h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj )}(hhh](j)}(h(``unsigned int cpu`` The CPU to run on. h](j)}(h``unsigned int cpu``h]j)}(hjh]hunsigned int cpu}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj3)}(hhh]j)}(hThe CPU to run on.h]hThe CPU to run on.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h,``int (*func)(void *)`` The function to run h](j)}(h``int (*func)(void *)``h]j)}(hj3h]hint (*func)(void *)}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhj-ubj3)}(hhh]j)}(hThe function to runh]hThe function to run}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHhMhjIubah}(h]h ]h"]h$]h&]uh1j2hj-ubeh}(h]h ]h"]h$]h&]uh1jhjHhMhjubj)}(h;``void *par`` An arbitrary pointer parameter for **func**. h](j)}(h ``void *par``h]j)}(hjlh]h void *par}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjfubj3)}(hhh]j)}(h,An arbitrary pointer parameter for **func**.h](h#An arbitrary pointer parameter for }(hjhhhNhNubj)}(h**func**h]hfunc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j2hjfubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``bool phys`` If **true**, force to run on physical **cpu**. See :c:type:`struct smp_call_on_cpu_struct ` for more info. h](j)}(h ``bool phys``h]j)}(hjh]h bool phys}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj3)}(hhh]j)}(hIf **true**, force to run on physical **cpu**. See :c:type:`struct smp_call_on_cpu_struct ` for more info.h](hIf }(hjhhhNhNubj)}(h**true**h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, force to run on physical }(hjhhhNhNubj)}(h**cpu**h]hcpu}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. See }(hjhhhNhNubh)}(h@:c:type:`struct smp_call_on_cpu_struct `h]j)}(hjh]hstruct smp_call_on_cpu_struct}(hjhhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdoc core-api/SMP refdomainjreftypetype refexplicitrefwarnjj)}j]sb reftargetsmp_call_on_cpu_structuh1hhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubh for more info.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj!hMhjubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubj)}(h **Return**h]j)}(hj@h]hReturn}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubj)}(hO``-ENXIO`` if the **cpu** is invalid; otherwise the return value from **func**.h](j)}(h ``-ENXIO``h]h-ENXIO}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh if the }(hjVhhhNhNubj)}(h**cpu**h]hcpu}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh- is invalid; otherwise the return value from }(hjVhhhNhNubj)}(h**func**h]hfunc}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh.}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/SMP:10: ./kernel/smp.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubeh}(h]smp-primitivesah ]h"]smp primitivesah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}jjs nametypes}jsh}(jhhhjpjujjj^jcj j jujzjjj2j7jjjjjj u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.