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/locking/seqlockmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/zh_TW/locking/seqlockmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/it_IT/locking/seqlockmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ja_JP/locking/seqlockmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ko_KR/locking/seqlockmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/pt_BR/locking/seqlockmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/sp_SP/locking/seqlockmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh=/var/lib/git/docbuild/linux/Documentation/locking/seqlock.rsthKubhsection)}(hhh](htitle)}(h&Sequence counters and sequential locksh]h&Sequence counters and sequential locks}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Introductionh]h Introduction}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hX4Sequence counters are a reader-writer consistency mechanism with lockless readers (read-only retry loops), and no writer starvation. They are used for data that's rarely written to (e.g. system time), where the reader wants a consistent set of information and is willing to retry if that information changes.h]hX6Sequence counters are a reader-writer consistency mechanism with lockless readers (read-only retry loops), and no writer starvation. They are used for data that’s rarely written to (e.g. system time), where the reader wants a consistent set of information and is willing to retry if that information changes.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hX}A data set is consistent when the sequence count at the beginning of the read side critical section is even and the same sequence count value is read again at the end of the critical section. The data in the set must be copied out inside the read side critical section. If the sequence count has changed between the start and the end of the critical section, the reader must retry.h]hX}A data set is consistent when the sequence count at the beginning of the read side critical section is even and the same sequence count value is read again at the end of the critical section. The data in the set must be copied out inside the read side critical section. If the sequence count has changed between the start and the end of the critical section, the reader must retry.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXHWriters increment the sequence count at the start and the end of their critical section. After starting the critical section the sequence count is odd and indicates to the readers that an update is in progress. At the end of the write side critical section the sequence count becomes even again which lets readers make progress.h]hXHWriters increment the sequence count at the start and the end of their critical section. After starting the critical section the sequence count is odd and indicates to the readers that an update is in progress. At the end of the write side critical section the sequence count becomes even again which lets readers make progress.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXSA sequence counter write side critical section must never be preempted or interrupted by read side sections. Otherwise the reader will spin for the entire scheduler tick due to the odd sequence count value and the interrupted writer. If that reader belongs to a real-time scheduling class, it can spin forever and the kernel will livelock.h]hXSA sequence counter write side critical section must never be preempted or interrupted by read side sections. Otherwise the reader will spin for the entire scheduler tick due to the odd sequence count value and the interrupted writer. If that reader belongs to a real-time scheduling class, it can spin forever and the kernel will livelock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hThis mechanism cannot be used if the protected data contains pointers, as the writer can invalidate a pointer that the reader is following.h]hThis mechanism cannot be used if the protected data contains pointers, as the writer can invalidate a pointer that the reader is following.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hhhhubhtarget)}(h.. _seqcount_t:h]h}(h]h ]h"]h$]h&]refid seqcount-tuh1j6hK'hhhhhhubeh}(h] introductionah ]h"] introductionah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h"Sequence counters (``seqcount_t``)h](hSequence counters (}(hjOhhhNhNubhliteral)}(h``seqcount_t``h]h seqcount_t}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjOubh)}(hjOhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjLhhhhhK*ubh)}(hThis is the raw counting mechanism, which does not protect against multiple writers. Write side critical sections must thus be serialized by an external lock.h]hThis is the raw counting mechanism, which does not protect against multiple writers. Write side critical sections must thus be serialized by an external lock.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjLhhubh)}(hXBIf the write serialization primitive is not implicitly disabling preemption, preemption must be explicitly disabled before entering the write side section. If the read section can be invoked from hardirq or softirq contexts, interrupts or bottom halves must also be respectively disabled before entering the write section.h]hXBIf the write serialization primitive is not implicitly disabling preemption, preemption must be explicitly disabled before entering the write side section. If the read section can be invoked from hardirq or softirq contexts, interrupts or bottom halves must also be respectively disabled before entering the write section.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjLhhubh)}(hIf it's desired to automatically handle the sequence counter requirements of writer serialization and non-preemptibility, use :ref:`seqlock_t` instead.h](hIf it’s desired to automatically handle the sequence counter requirements of writer serialization and non-preemptibility, use }(hjhhhNhNubh)}(h:ref:`seqlock_t`h]hinline)}(hjh]h seqlock_t}(hjhhhNhNubah}(h]h ](xrefstdstd-refeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdoclocking/seqlock refdomainjreftyperef refexplicitrefwarn reftarget seqlock_tuh1hhhhK6hjubh instead.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK6hjLhhubh)}(hInitialization::h]hInitialization:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjLhhubh literal_block)}(h/* dynamic */ seqcount_t foo_seqcount; seqcount_init(&foo_seqcount); /* static */ static seqcount_t foo_seqcount = SEQCNT_ZERO(foo_seqcount); /* C99 struct init */ struct { .seq = SEQCNT_ZERO(foo.seq), } foo;h]h/* dynamic */ seqcount_t foo_seqcount; seqcount_init(&foo_seqcount); /* static */ static seqcount_t foo_seqcount = SEQCNT_ZERO(foo_seqcount); /* C99 struct init */ struct { .seq = SEQCNT_ZERO(foo.seq), } foo;}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjpubhdefinition_list)}(hhh]hdefinition_list_item)}(h(``s`` Pointer to the seqcount_t instanceh](hterm)}(h``s``h]jX)}(hjh]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhK@hjubh definition)}(hhh]h)}(h"Pointer to the seqcount_t instanceh]h"Pointer to the seqcount_t instance}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhK;hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK@hjubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jSEQCNT_ZERO (C macro) c.SEQCNT_ZEROhNtauh1jhjhhhNhNubj)}(hhh](j)}(h SEQCNT_ZEROh]j)}(h SEQCNT_ZEROh]j)}(h SEQCNT_ZEROh]j)}(hjh]h SEQCNT_ZERO}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhKUubah}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhKUubah}(h]jah ](jjeh"]h$]h&]j!j")j#huh1jhjhKUhjhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjhhhjhKUubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j)j9j)j:j;j<uh1jhhhjhNhNubh)}(h``SEQCNT_ZERO (name)``h]jX)}(hj/h]hSEQCNT_ZERO (name)}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj-ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhKWhjhhubj)}(h"static initializer for seqcount_t h]h)}(h!static initializer for seqcount_th]h!static initializer for seqcount_t}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhKUhjEubah}(h]h ]h"]h$]h&]uh1jhjWhKUhjhhubjo)}(h:**Parameters** ``name`` Name of the seqcount_t instanceh](h)}(h**Parameters**h]jy)}(hjdh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjbubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhKYhj^ubj)}(hhh]j)}(h(``name`` Name of the seqcount_t instanceh](j)}(h``name``h]jX)}(hjh]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhK[hj}ubj)}(hhh]h)}(hName of the seqcount_t instanceh]hName of the seqcount_t instance}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhKVhjubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhjhK[hjzubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j__read_seqcount_begin (C macro)c.__read_seqcount_beginhNtauh1jhjhhhNhNubj)}(hhh](j)}(h__read_seqcount_beginh]j)}(h__read_seqcount_beginh]j)}(h__read_seqcount_beginh]j)}(hjh]h__read_seqcount_begin}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM ubah}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]j!j")j#huh1jhjhM hjhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjhhhjhM ubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j j9j j:j;j<uh1jhhhjhNhNubh)}(h``__read_seqcount_begin (s)``h]jX)}(hjh]h__read_seqcount_begin (s)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM hjhhubj)}(h begin a seqcount_t read section h]h)}(hbegin a seqcount_t read sectionh]hbegin a seqcount_t read section}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM hj)ubah}(h]h ]h"]h$]h&]uh1jhj;hM hjhhubjo)}(h**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants **Return** count to be passed to read_seqcount_retry()h](h)}(h**Parameters**h]jy)}(hjHh]h Parameters}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjFubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjBubj)}(hhh]j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hjgh]hs}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjeubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM hjaubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hM hj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhj|hM hj^ubah}(h]h ]h"]h$]h&]uh1jhjBubh)}(h **Return**h]jy)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjBubh)}(h+count to be passed to read_seqcount_retry()h]h+count to be passed to read_seqcount_retry()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!raw_read_seqcount_begin (C macro)c.raw_read_seqcount_beginhNtauh1jhjhhhNhNubj)}(hhh](j)}(hraw_read_seqcount_beginh]j)}(hraw_read_seqcount_beginh]j)}(hraw_read_seqcount_beginh]j)}(hjh]hraw_read_seqcount_begin}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubah}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]j!j")j#huh1jhjhMhjhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjhhhjhMubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j j9j j:j;j<uh1jhhhjhNhNubh)}(h``raw_read_seqcount_begin (s)``h]jX)}(hj h]hraw_read_seqcount_begin (s)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjhhubj)}(h,begin a seqcount_t read section w/o lockdep h]h)}(h+begin a seqcount_t read section w/o lockdeph]h+begin a seqcount_t read section w/o lockdep}(hj7 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj3 ubah}(h]h ]h"]h$]h&]uh1jhjE hMhjhhubjo)}(h**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants **Return** count to be passed to read_seqcount_retry()h](h)}(h**Parameters**h]jy)}(hjR h]h Parameters}(hjT hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjP ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM hjL ubj)}(hhh]j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hjq h]hs}(hjs hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjo ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjk ubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjk ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjh ubah}(h]h ]h"]h$]h&]uh1jhjL ubh)}(h **Return**h]jy)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjL ubh)}(h+count to be passed to read_seqcount_retry()h]h+count to be passed to read_seqcount_retry()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjL ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jread_seqcount_begin (C macro)c.read_seqcount_beginhNtauh1jhjhhhNhNubj)}(hhh](j)}(hread_seqcount_beginh]j)}(hread_seqcount_beginh]j)}(hread_seqcount_beginh]j)}(hj h]hread_seqcount_begin}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM$ubah}(h]h ]h"]h$]h&]hhjuh1jjjhj hhhj hM$ubah}(h]j ah ](jjeh"]h$]h&]j!j")j#huh1jhj hM$hj hhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hj hhhj hM$ubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j! j9j! j:j;j<uh1jhhhjhNhNubh)}(h``read_seqcount_begin (s)``h]jX)}(hj' h]hread_seqcount_begin (s)}(hj) hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj% ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM&hjhhubj)}(h)begin a seqcount_t read critical section h]h)}(h(begin a seqcount_t read critical sectionh]h(begin a seqcount_t read critical section}(hjA hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM$hj= ubah}(h]h ]h"]h$]h&]uh1jhjO hM$hjhhubjo)}(h**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants **Return** count to be passed to read_seqcount_retry()h](h)}(h**Parameters**h]jy)}(hj\ h]h Parameters}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjZ ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM(hjV ubj)}(hhh]j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hj{ h]hs}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjy ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM%hju ubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM%hj ubah}(h]h ]h"]h$]h&]uh1jhju ubeh}(h]h ]h"]h$]h&]uh1jhj hM%hjr ubah}(h]h ]h"]h$]h&]uh1jhjV ubh)}(h **Return**h]jy)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM'hjV ubh)}(h+count to be passed to read_seqcount_retry()h]h+count to be passed to read_seqcount_retry()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM'hjV ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jraw_read_seqcount (C macro)c.raw_read_seqcounthNtauh1jhjhhhNhNubj)}(hhh](j)}(hraw_read_seqcounth]j)}(hraw_read_seqcounth]j)}(hraw_read_seqcounth]j)}(hj h]hraw_read_seqcount}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM0ubah}(h]h ]h"]h$]h&]hhjuh1jjjhj hhhj hM0ubah}(h]j ah ](jjeh"]h$]h&]j!j")j#huh1jhj hM0hj hhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hj hhhj hM0ubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j+ j9j+ j:j;j<uh1jhhhjhNhNubh)}(h``raw_read_seqcount (s)``h]jX)}(hj1 h]hraw_read_seqcount (s)}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj/ ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM2hjhhubj)}(h&read the raw seqcount_t counter value h]h)}(h%read the raw seqcount_t counter valueh]h%read the raw seqcount_t counter value}(hjK hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM0hjG ubah}(h]h ]h"]h$]h&]uh1jhjY hM0hjhhubjo)}(hXs**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants **Description** raw_read_seqcount opens a read critical section of the given seqcount_t, without any lockdep checking, and without checking or masking the sequence counter LSB. Calling code is responsible for handling that. **Return** count to be passed to read_seqcount_retry()h](h)}(h**Parameters**h]jy)}(hjf h]h Parameters}(hjh hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjd ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM4hj` ubj)}(hhh]j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hj h]hs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM1hj ubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM1hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hM1hj| ubah}(h]h ]h"]h$]h&]uh1jhj` ubh)}(h**Description**h]jy)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM3hj` ubh)}(hraw_read_seqcount opens a read critical section of the given seqcount_t, without any lockdep checking, and without checking or masking the sequence counter LSB. Calling code is responsible for handling that.h]hraw_read_seqcount opens a read critical section of the given seqcount_t, without any lockdep checking, and without checking or masking the sequence counter LSB. Calling code is responsible for handling that.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM2hj` ubh)}(h **Return**h]jy)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM7hj` ubh)}(h+count to be passed to read_seqcount_retry()h]h+count to be passed to read_seqcount_retry()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM8hj` ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j raw_seqcount_try_begin (C macro)c.raw_seqcount_try_beginhNtauh1jhjhhhNhNubj)}(hhh](j)}(hraw_seqcount_try_beginh]j)}(hraw_seqcount_try_beginh]j)}(hraw_seqcount_try_beginh]j)}(hj& h]hraw_seqcount_try_begin}(hj0 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj, ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj( hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMCubah}(h]h ]h"]h$]h&]hhjuh1jjjhj$ hhhjC hMCubah}(h]j ah ](jjeh"]h$]h&]j!j")j#huh1jhjC hMChj! hhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hj! hhhjC hMCubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j\ j9j\ j:j;j<uh1jhhhjhNhNubh)}(h%``raw_seqcount_try_begin (s, start)``h]jX)}(hjb h]h!raw_seqcount_try_begin (s, start)}(hjd hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj` ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMEhjhhubj)}(hSbegin a seqcount_t read critical section w/o lockdep and w/o counter stabilization h]h)}(hRbegin a seqcount_t read critical section w/o lockdep and w/o counter stabilizationh]hRbegin a seqcount_t read critical section w/o lockdep and w/o counter stabilization}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMChjx ubah}(h]h ]h"]h$]h&]uh1jhj hMChjhhubjo)}(hX.**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants ``start`` count to be passed to read_seqcount_retry() **Description** Similar to raw_seqcount_begin(), except it enables eliding the critical section entirely if odd, instead of doing the speculation knowing it will fail. Useful when counter stabilization is more or less equivalent to taking the lock and there is a slowpath that does that. If true, start will be set to the (even) sequence count read. **Return** true when a read critical section is started.h](h)}(h**Parameters**h]jy)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMGhj ubj)}(hhh](j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hj h]hs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMEhj ubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMEhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMEhj ubj)}(h6``start`` count to be passed to read_seqcount_retry() h](j)}(h ``start``h]jX)}(hj h]hstart}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMFhj ubj)}(hhh]h)}(h+count to be passed to read_seqcount_retry()h]h+count to be passed to read_seqcount_retry()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMFhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMFhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubh)}(h**Description**h]jy)}(hj* h]h Description}(hj, hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj( ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMHhj ubh)}(hSimilar to raw_seqcount_begin(), except it enables eliding the critical section entirely if odd, instead of doing the speculation knowing it will fail.h]hSimilar to raw_seqcount_begin(), except it enables eliding the critical section entirely if odd, instead of doing the speculation knowing it will fail.}(hj@ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMGhj ubh)}(hwUseful when counter stabilization is more or less equivalent to taking the lock and there is a slowpath that does that.h]hwUseful when counter stabilization is more or less equivalent to taking the lock and there is a slowpath that does that.}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMKhj ubh)}(h=If true, start will be set to the (even) sequence count read.h]h=If true, start will be set to the (even) sequence count read.}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMNhj ubh)}(h **Return**h]jy)}(hjo h]hReturn}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjm ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMPhj ubh)}(h-true when a read critical section is started.h]h-true when a read critical section is started.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMQhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jraw_seqcount_begin (C macro)c.raw_seqcount_beginhNtauh1jhjhhhNhNubj)}(hhh](j)}(hraw_seqcount_beginh]j)}(hraw_seqcount_beginh]j)}(hraw_seqcount_beginh]j)}(hj h]hraw_seqcount_begin}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMZubah}(h]h ]h"]h$]h&]hhjuh1jjjhj hhhj hMZubah}(h]j ah ](jjeh"]h$]h&]j!j")j#huh1jhj hMZhj hhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hj hhhj hMZubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j j9j j:j;j<uh1jhhhjhNhNubh)}(h``raw_seqcount_begin (s)``h]jX)}(hj h]hraw_seqcount_begin (s)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM\hjhhubj)}(hSbegin a seqcount_t read critical section w/o lockdep and w/o counter stabilization h]h)}(hRbegin a seqcount_t read critical section w/o lockdep and w/o counter stabilizationh]hRbegin a seqcount_t read critical section w/o lockdep and w/o counter stabilization}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMZhjubah}(h]h ]h"]h$]h&]uh1jhjhMZhjhhubjo)}(hX**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants **Description** raw_seqcount_begin opens a read critical section of the given seqcount_t. Unlike read_seqcount_begin(), this function will not wait for the count to stabilize. If a writer is active when it begins, it will fail the read_seqcount_retry() at the end of the read critical section instead of stabilizing at the beginning of it. Use this only in special kernel hot paths where the read section is small and has a high probability of success through other external means. It will save a single branching instruction. **Return** count to be passed to read_seqcount_retry()h](h)}(h**Parameters**h]jy)}(hjh]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM^hjubj)}(hhh]j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hj>h]hs}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj<ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM\hj8ubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShM\hjTubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhjShM\hj5ubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]jy)}(hjyh]h Description}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjwubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM^hjubh)}(hXCraw_seqcount_begin opens a read critical section of the given seqcount_t. Unlike read_seqcount_begin(), this function will not wait for the count to stabilize. If a writer is active when it begins, it will fail the read_seqcount_retry() at the end of the read critical section instead of stabilizing at the beginning of it.h]hXCraw_seqcount_begin opens a read critical section of the given seqcount_t. Unlike read_seqcount_begin(), this function will not wait for the count to stabilize. If a writer is active when it begins, it will fail the read_seqcount_retry() at the end of the read critical section instead of stabilizing at the beginning of it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM]hjubh)}(hUse this only in special kernel hot paths where the read section is small and has a high probability of success through other external means. It will save a single branching instruction.h]hUse this only in special kernel hot paths where the read section is small and has a high probability of success through other external means. It will save a single branching instruction.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMchjubh)}(h **Return**h]jy)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMghjubh)}(h+count to be passed to read_seqcount_retry()h]h+count to be passed to read_seqcount_retry()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j__read_seqcount_retry (C macro)c.__read_seqcount_retryhNtauh1jhjhhhNhNubj)}(hhh](j)}(h__read_seqcount_retryh]j)}(h__read_seqcount_retryh]j)}(h__read_seqcount_retryh]j)}(hjh]h__read_seqcount_retry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMtubah}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhj hMtubah}(h]jah ](jjeh"]h$]h&]j!j")j#huh1jhj hMthjhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjhhhj hMtubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j$j9j$j:j;j<uh1jhhhjhNhNubh)}(h$``__read_seqcount_retry (s, start)``h]jX)}(hj*h]h __read_seqcount_retry (s, start)}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj(ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMvhjhhubj)}(h*end a seqcount_t read section w/o barrier h]h)}(h)end a seqcount_t read section w/o barrierh]h)end a seqcount_t read section w/o barrier}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMthj@ubah}(h]h ]h"]h$]h&]uh1jhjRhMthjhhubjo)}(hX$**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants ``start`` count, from read_seqcount_begin() **Description** __read_seqcount_retry is like read_seqcount_retry, but has no smp_rmb() barrier. Callers should ensure that smp_rmb() or equivalent ordering is provided before actually loading any of the variables that are to be protected in this critical section. Use carefully, only in critical code, and comment how the barrier is provided. **Return** true if a read section retry is required, else falseh](h)}(h**Parameters**h]jy)}(hj_h]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj]ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMxhjYubj)}(hhh](j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hj~h]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj|ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMuhjxubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMuhjubah}(h]h ]h"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]uh1jhjhMuhjuubj)}(h,``start`` count, from read_seqcount_begin() h](j)}(h ``start``h]jX)}(hjh]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMvhjubj)}(hhh]h)}(h!count, from read_seqcount_begin()h]h!count, from read_seqcount_begin()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMvhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMvhjuubeh}(h]h ]h"]h$]h&]uh1jhjYubh)}(h**Description**h]jy)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMxhjYubh)}(h__read_seqcount_retry is like read_seqcount_retry, but has no smp_rmb() barrier. Callers should ensure that smp_rmb() or equivalent ordering is provided before actually loading any of the variables that are to be protected in this critical section.h]h__read_seqcount_retry is like read_seqcount_retry, but has no smp_rmb() barrier. Callers should ensure that smp_rmb() or equivalent ordering is provided before actually loading any of the variables that are to be protected in this critical section.}(hjhhhNhNubah}(h]h ]h"]h$]h&]u h1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMwhjYubh)}(hNUse carefully, only in critical code, and comment how the barrier is provided.h]hNUse carefully, only in critical code, and comment how the barrier is provided.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM|hjYubh)}(h **Return**h]jy)}(hj(h]hReturn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj&ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjYubh)}(h4true if a read section retry is required, else falseh]h4true if a read section retry is required, else false}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjYubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jread_seqcount_retry (C macro)c.read_seqcount_retryhNtauh1jhjhhhNhNubj)}(hhh](j)}(hread_seqcount_retryh]j)}(hread_seqcount_retryh]j)}(hread_seqcount_retryh]j)}(hjgh]hread_seqcount_retry}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ](j j eh"]h$]h&]hhuh1jhjihhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubah}(h]h ]h"]h$]h&]hhjuh1jjjhjehhhjhMubah}(h]j`ah ](jjeh"]h$]h&]j!j")j#huh1jhjhMhjbhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjbhhhjhMubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8jj9jj:j;j<uh1jhhhjhNhNubh)}(h"``read_seqcount_retry (s, start)``h]jX)}(hjh]hread_seqcount_retry (s, start)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjhhubj)}(h'end a seqcount_t read critical section h]h)}(h&end a seqcount_t read critical sectionh]h&end a seqcount_t read critical section}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubjo)}(hXw**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants ``start`` count, from read_seqcount_begin() **Description** read_seqcount_retry closes the read critical section of given seqcount_t. If the critical section was invalid, it must be ignored (and typically retried). **Return** true if a read section retry is required, else falseh](h)}(h**Parameters**h]jy)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hhh](j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hjh]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubj)}(h,``start`` count, from read_seqcount_begin() h](j)}(h ``start``h]jX)}(hj0h]hstart}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj.ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj*ubj)}(hhh]h)}(h!count, from read_seqcount_begin()h]h!count, from read_seqcount_begin()}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhMhjFubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhjEhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]jy)}(hjkh]h Description}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjiubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubh)}(hread_seqcount_retry closes the read critical section of given seqcount_t. If the critical section was invalid, it must be ignored (and typically retried).h]hread_seqcount_retry closes the read critical section of given seqcount_t. If the critical section was invalid, it must be ignored (and typically retried).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubh)}(h **Return**h]jy)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubh)}(h4true if a read section retry is required, else falseh]h4true if a read section retry is required, else false}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"raw_write_seqcount_begin (C macro)c.raw_write_seqcount_beginhNtauh1jhjhhhNhNubj)}(hhh](j)}(hraw_write_seqcount_beginh]j)}(hraw_write_seqcount_beginh]j)}(hraw_write_seqcount_beginh]j)}(hjh]hraw_write_seqcount_begin}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubah}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]j!j")j#huh1jhjhMhjhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjhhhjhMubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8jj9jj:j;j<uh1jhhhjhNhNubh)}(h ``raw_write_seqcount_begin (s)``h]jX)}(hj h]hraw_write_seqcount_begin (s)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjhhubj)}(h-start a seqcount_t write section w/o lockdep h]h)}(h,start a seqcount_t write section w/o lockdeph]h,start a seqcount_t write section w/o lockdep}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj#ubah}(h]h ]h"]h$]h&]uh1jhj5hMhjhhubjo)}(h**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants **Context** check write_seqcount_begin()h](h)}(h**Parameters**h]jy)}(hjBh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj@ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj<ubj)}(hhh]j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hjah]hs}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj_ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj[ubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhMhjwubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjXubah}(h]h ]h"]h$]h&]uh1jhj<ubh)}(h **Context**h]jy)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj<ubh)}(hcheck write_seqcount_begin()h]hcheck write_seqcount_begin()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j raw_write_seqcount_end (C macro)c.raw_write_seqcount_endhNtauh1jhjhhhNhNubj)}(hhh](j)}(hraw_write_seqcount_endh]j)}(hraw_write_seqcount_endh]j)}(hraw_write_seqcount_endh]j)}(hjh]hraw_write_seqcount_end}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubah}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]j!j")j#huh1jhjhMhjhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjhhhjhMubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8jj9jj:j;j<uh1jhhhjhNhNubh)}(h``raw_write_seqcount_end (s)``h]jX)}(hjh]hraw_write_seqcount_end (s)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjhhubj)}(h+end a seqcount_t write section w/o lockdep h]h)}(h*end a seqcount_t write section w/o lockdeph]h*end a seqcount_t write section w/o lockdep}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj-ubah}(h]h ]h"]h$]h&]uh1jhj?hMhjhhubjo)}(h**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants **Context** check write_seqcount_end()h](h)}(h**Parameters**h]jy)}(hjLh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjJubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjFubj)}(hhh]j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hjkh]hs}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjiubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjeubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhjhMhjbubah}(h]h ]h"]h$]h&]uh1jhjFubh)}(h **Context**h]jy)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjFubh)}(hcheck write_seqcount_end()h]hcheck write_seqcount_end()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%write_seqcount_begin_nested (C macro)c.write_seqcount_begin_nestedhNtauh1jhjhhhNhNubj)}(hhh](j)}(hwrite_seqcount_begin_nestedh]j)}(hwrite_seqcount_begin_nestedh]j)}(hwrite_seqcount_begin_nestedh]j)}(hjh]hwrite_seqcount_begin_nested}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubah}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]j!j")j#huh1jhjhMhjhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjhhhjhMubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8jj9jj:j;j<uh1jhhhjhNhNubh)}(h-``write_seqcount_begin_nested (s, subclass)``h]jX)}(hj!h]h)write_seqcount_begin_nested (s, subclass)}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjhhubj)}(hCstart a seqcount_t write section with custom lockdep nesting level h]h)}(hBstart a seqcount_t write section with custom lockdep nesting levelh]hBstart a seqcount_t write section with custom lockdep nesting level}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj7ubah}(h]h ]h"]h$]h&]uh1jhjIhMhjhhubjo)}(h**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants ``subclass`` lockdep nesting level **Description** See Documentation/locking/lockdep-design.rst **Context** check write_seqcount_begin()h](h)}(h**Parameters**h]jy)}(hjVh]h Parameters}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjTubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjPubj)}(hhh](j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hjuh]hs}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjsubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjoubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhjhMhjlubj)}(h#``subclass`` lockdep nesting level h](j)}(h ``subclass``h]jX)}(hjh]hsubclass}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hhh]h)}(hlockdep nesting levelh]hlockdep nesting level}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjlubeh}(h]h ]h"]h$]h&]uh1jhjPubh)}(h**Description**h]jy)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjPubh)}(h,See Documentation/locking/lockdep-design.rsth]h,See Documentation/locking/lockdep-design.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjPubh)}(h **Context**h]jy)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjPubh)}(hcheck write_seqcount_begin()h]hcheck write_seqcount_begin()}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jwrite_seqcount_begin (C macro)c.write_seqcount_beginhNtauh1jhjhhhNhNubj)}(hhh](j)}(hwrite_seqcount_beginh]j)}(hwrite_seqcount_beginh]j)}(hwrite_seqcount_beginh]j)}(hjOh]hwrite_seqcount_begin}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ](j j eh"]h$]h&]hhuh1jhjQhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubah}(h]h ]h"]h$]h&]hhjuh1jjjhjMhhhjlhMubah}(h]jHah ](jjeh"]h$]h&]j!j")j#huh1jhjlhMhjJhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjJhhhjlhMubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8jj9jj:j;j<uh1jhhhjhNhNubh)}(h``write_seqcount_begin (s)``h]jX)}(hjh]hwrite_seqcount_begin (s)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjhhubj)}(h/start a seqcount_t write side critical section h]h)}(h.start a seqcount_t write side critical sectionh]h.start a seqcount_t write side critical section}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubjo)}(hX**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants **Context** sequence counter write side sections must be serialized and non-preemptible. Preemption will be automatically disabled if and only if the seqcount write serialization lock is associated, and preemptible. If readers can be invoked from hardirq or softirq context, interrupts or bottom halves must be respectively disabled.h](h)}(h**Parameters**h]jy)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hhh]j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hjh]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h **Context**h]jy)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubh)}(hXBsequence counter write side sections must be serialized and non-preemptible. Preemption will be automatically disabled if and only if the seqcount write serialization lock is associated, and preemptible. If readers can be invoked from hardirq or softirq context, interrupts or bottom halves must be respectively disabled.h]hXBsequence counter write side sections must be serialized and non-preemptible. Preemption will be automatically disabled if and only if the seqcount write serialization lock is associated, and preemptible. If readers can be invoked from hardirq or softirq context, interrupts or bottom halves must be respectively disabled.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jwrite_seqcount_end (C macro)c.write_seqcount_endhNtauh1jhjhhhNhNubj)}(hhh](j)}(hwrite_seqcount_endh]j)}(hwrite_seqcount_endh]j)}(hwrite_seqcount_endh]j)}(hjYh]hwrite_seqcount_end}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj[hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubah}(h]h ]h"]h$]h&]hhjuh1jjjhjWhhhjvhMubah}(h]jRah ](jjeh"]h$]h&]j!j")j#huh1jhjvhMhjThhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjThhhjvhMubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8jj9jj:j;j<uh1jhhhjhNhNubh)}(h``write_seqcount_end (s)``h]jX)}(hjh]hwrite_seqcount_end (s)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjhhubj)}(h-end a seqcount_t write side critical section h]h)}(h,end a seqcount_t write side critical sectionh]h,end a seqcount_t write side critical section}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubjo)}(h**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants **Context** Preemption will be automatically re-enabled if and only if the seqcount write serialization lock is associated, and preemptible.h](h)}(h**Parameters**h]jy)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hhh]j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hjh]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h **Context**h]jy)}(hj$h]hContext}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj"ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubh)}(hPreemption will be automatically re-enabled if and only if the seqcount write serialization lock is associated, and preemptible.h]hPreemption will be automatically re-enabled if and only if the seqcount write serialization lock is associated, and preemptible.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$raw_write_seqcount_barrier (C macro)c.raw_write_seqcount_barrierhNtauh1jhjhhhNhNubj)}(hhh](j)}(hraw_write_seqcount_barrierh]j)}(hraw_write_seqcount_barrierh]j)}(hraw_write_seqcount_barrierh]j)}(hjch]hraw_write_seqcount_barrier}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ](j j eh"]h$]h&]hhuh1jhjehhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubah}(h]h ]h"]h$]h&]hhjuh1jjjhjahhhjhMubah}(h]j\ah ](jjeh"]h$]h&]j!j")j#huh1jhjhMhj^hhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hj^hhhjhMubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8jj9jj:j;j<uh1jhhhjhNhNubh)}(h"``raw_write_seqcount_barrier (s)``h]jX)}(hjh]hraw_write_seqcount_barrier (s)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjhhubj)}(hdo a seqcount_t write barrier h]h)}(hdo a seqcount_t write barrierh]hdo a seqcount_t write barrier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubjo)}(hX**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants **Description** This can be used to provide an ordering guarantee instead of the usual consistency guarantee. It is one wmb cheaper, because it can collapse the two back-to-back wmb()s. Note that writes surrounding the barrier should be declared atomic (e.g. via WRITE_ONCE): a) to ensure the writes become visible to other threads atomically, avoiding compiler optimizations; b) to document which writes are meant to propagate to the reader critical section. This is necessary because neither writes before nor after the barrier are enclosed in a seq-writer critical section that would ensure readers are aware of ongoing writes:: seqcount_t seq; bool X = true, Y = false; void read(void) { bool x, y; do { int s = read_seqcount_begin(&seq); x = X; y = Y; } while (read_seqcount_retry(&seq, s)); BUG_ON(!x && !y); } void write(void) { WRITE_ONCE(Y, true); raw_write_seqcount_barrier(seq); WRITE_ONCE(X, false); }h](h)}(h**Parameters**h]jy)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hhh]j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hjh]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]jy)}(hj.h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj,ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubh)}(hThis can be used to provide an ordering guarantee instead of the usual consistency guarantee. It is one wmb cheaper, because it can collapse the two back-to-back wmb()s.h]hThis can be used to provide an ordering guarantee instead of the usual consistency guarantee. It is one wmb cheaper, because it can collapse the two back-to-back wmb()s.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubh)}(hXNote that writes surrounding the barrier should be declared atomic (e.g. via WRITE_ONCE): a) to ensure the writes become visible to other threads atomically, avoiding compiler optimizations; b) to document which writes are meant to propagate to the reader critical section. This is necessary because neither writes before nor after the barrier are enclosed in a seq-writer critical section that would ensure readers are aware of ongoing writes::h]hXNote that writes surrounding the barrier should be declared atomic (e.g. via WRITE_ONCE): a) to ensure the writes become visible to other threads atomically, avoiding compiler optimizations; b) to document which writes are meant to propagate to the reader critical section. This is necessary because neither writes before nor after the barrier are enclosed in a seq-writer critical section that would ensure readers are aware of ongoing writes:}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hXyseqcount_t seq; bool X = true, Y = false; void read(void) { bool x, y; do { int s = read_seqcount_begin(&seq); x = X; y = Y; } while (read_seqcount_retry(&seq, s)); BUG_ON(!x && !y); } void write(void) { WRITE_ONCE(Y, true); raw_write_seqcount_barrier(seq); WRITE_ONCE(X, false); }h]hXyseqcount_t seq; bool X = true, Y = false; void read(void) { bool x, y; do { int s = read_seqcount_begin(&seq); x = X; y = Y; } while (read_seqcount_retry(&seq, s)); BUG_ON(!x && !y); } void write(void) { WRITE_ONCE(Y, true); raw_write_seqcount_barrier(seq); WRITE_ONCE(X, false); }}hjbsbah}(h]h ]h"]h$]h&]hhuh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#write_seqcount_invalidate (C macro)c.write_seqcount_invalidatehNtauh1jhjhhhNhNubj)}(hhh](j)}(hwrite_seqcount_invalidateh]j)}(hwrite_seqcount_invalidateh]j)}(hwrite_seqcount_invalidateh]j)}(hjh]hwrite_seqcount_invalidate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMFubah}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMFubah}(h]jah ](jjeh"]h$]h&]j!j")j#huh1jhjhMFhjhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjhhhjhMFubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8jj9jj:j;j<uh1jhhhjhNhNubh)}(h!``write_seqcount_invalidate (s)``h]jX)}(hjh]hwrite_seqcount_invalidate (s)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMHhjhhubj)}(h7invalidate in-progress seqcount_t read side operations h]h)}(h6invalidate in-progress seqcount_t read side operationsh]h6invalidate in-progress seqcount_t read side operations}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMFhjubah}(h]h ]h"]h$]h&]uh1jhjhMFhjhhubjo)}(h**Parameters** ``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants **Description** After write_seqcount_invalidate, no seqcount_t read side operations will complete successfully and see data older than this.h](h)}(h**Parameters**h]jy)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMJhjubj)}(hhh]j)}(hG``s`` Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants h](j)}(h``s``h]jX)}(hjh]hs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMHhjubj)}(hhh]h)}(h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variantsh]h@Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMHhj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0hMHhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]jy)}(hjVh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjTubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMJhjubh)}(h|After write_seqcount_invalidate, no seqcount_t read side operations will complete successfully and see data older than this.h]h|After write_seqcount_invalidate, no seqcount_t read side operations will complete successfully and see data older than this.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMIhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jSEQCNT_LATCH_ZERO (C macro)c.SEQCNT_LATCH_ZEROhNtauh1jhjhhhNhNubj)}(hhh](j)}(hSEQCNT_LATCH_ZEROh]j)}(hSEQCNT_LATCH_ZEROh]j)}(hSEQCNT_LATCH_ZEROh]j)}(hjh]hSEQCNT_LATCH_ZERO}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMgubah}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMgubah}(h]jah ](jjeh"]h$]h&]j!j")j#huh1jhjhMghjhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjhhhjhMgubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8jj9jj:j;j<uh1jhhhjhNhNubh)}(h ``SEQCNT_LATCH_ZERO (seq_name)``h]jX)}(hjh]hSEQCNT_LATCH_ZERO (seq_name)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMihjhhubj)}(h(static initializer for seqcount_latch_t h]h)}(h'static initializer for seqcount_latch_th]h'static initializer for seqcount_latch_t}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMghjubah}(h]h ]h"]h$]h&]uh1jhjhMghjhhubjo)}(hD**Parameters** ``seq_name`` Name of the seqcount_latch_t instanceh](h)}(h**Parameters**h]jy)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMkhjubj)}(hhh]j)}(h2``seq_name`` Name of the seqcount_latch_t instanceh](j)}(h ``seq_name``h]jX)}(hj%h]hseq_name}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj#ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMmhjubj)}(hhh]h)}(h%Name of the seqcount_latch_t instanceh]h%Name of the seqcount_latch_t instance}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhhj;ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj:hMmhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jseqcount_latch_init (C macro)c.seqcount_latch_inithNtauh1jhjhhhNhNubj)}(hhh](j)}(hseqcount_latch_inith]j)}(hseqcount_latch_inith]j)}(hseqcount_latch_inith]j)}(hjyh]hseqcount_latch_init}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhj{hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMoubah}(h]h ]h"]h$]h&]hhjuh1jjjhjwhhhjhMoubah}(h]jrah ](jjeh"]h$]h&]j!j")j#huh1jhjhMohjthhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjthhhjhMoubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8jj9jj:j;j<uh1jhhhjhNhNubh)}(h``seqcount_latch_init (s)``h]jX)}(hjh]hseqcount_latch_init (s)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMqhjhhubj)}(h)runtime initializer for seqcount_latch_t h]h)}(h(runtime initializer for seqcount_latch_th]h(runtime initializer for seqcount_latch_t}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMohjubah}(h]h ]h"]h$]h&]uh1jhjhMohjhhubjo)}(h@**Parameters** ``s`` Pointer to the seqcount_latch_t instanceh](h)}(h**Parameters**h]jy)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMshjubj)}(hhh]j)}(h.``s`` Pointer to the seqcount_latch_t instanceh](j)}(h``s``h]jX)}(hj h]hs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMuhjubj)}(hhh]h)}(h(Pointer to the seqcount_latch_t instanceh]h(Pointer to the seqcount_latch_t instance}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMphjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMuhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$raw_read_seqcount_latch (C function)c.raw_read_seqcount_latchhNtauh1jhjhhhNhNubj)}(hhh](j)}(hhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hMhj;ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj:hMhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]jy)}(hj`h]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj^ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubh)}(hNSee write_seqcount_latch() for details and a full reader/writer usage example.h]hNSee write_seqcount_latch() for details and a full reader/writer usage example.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubh)}(h **Return**h]jy)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubh)}(hsequence counter raw value. Use the lowest bit as an index for picking which data copy to read. The full counter must then be checked with read_seqcount_latch_retry().h]hsequence counter raw value. Use the lowest bit as an index for picking which data copy to read. The full counter must then be checked with read_seqcount_latch_retry().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*raw_read_seqcount_latch_retry (C function)c.raw_read_seqcount_latch_retryhNtauh1jhjhhhNhNubj)}(hhh](j)}(hMint raw_read_seqcount_latch_retry (const seqcount_latch_t *s, unsigned start)h]j)}(hLint raw_read_seqcount_latch_retry(const seqcount_latch_t *s, unsigned start)h](jd)}(hinth]hint}(hjhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjhhhjhMubj)}(hraw_read_seqcount_latch_retryh]j)}(hraw_read_seqcount_latch_retryh]hraw_read_seqcount_latch_retry}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhjhMubj)}(h+(const seqcount_latch_t *s, unsigned start)h](j)}(hconst seqcount_latch_t *sh](j)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjv)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubh)}(hhh]j)}(hseqcount_latch_th]hseqcount_latch_t}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj)modnameN classnameNjj)}j]j)}jjsbc.raw_read_seqcount_latch_retryasbuh1hhjubjv)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubj)}(hjh]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hs}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hunsigned starth](jd)}(hunsignedh]hunsigned}(hjzhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjvubjv)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjvubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]j!j")j#huh1jhjhMhjhhubj%)}(hhh]h)}(h#end a seqcount_latch_t read sectionh]h#end a seqcount_latch_t read section}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j$hjhhhjhMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8jj9jj:j;j<uh1jhhhjhNhNubjo)}(h**Parameters** ``const seqcount_latch_t *s`` Pointer to seqcount_latch_t ``unsigned start`` count, from raw_read_seqcount_latch() **Return** true if a read section retry is required, else falseh](h)}(h**Parameters**h]jy)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hhh](j)}(h:``const seqcount_latch_t *s`` Pointer to seqcount_latch_t h](j)}(h``const seqcount_latch_t *s``h]jX)}(hj h]hconst seqcount_latch_t *s}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubj)}(hhh]h)}(hPointer to seqcount_latch_th]hPointer to seqcount_latch_t}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubj)}(h9``unsigned start`` count, from raw_read_seqcount_latch() h](j)}(h``unsigned start``h]jX)}(hj: h]hunsigned start}(hj< hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj8 ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj4 ubj)}(hhh]h)}(h%count, from raw_read_seqcount_latch()h]h%count, from raw_read_seqcount_latch()}(hjS hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjO hMhjP ubah}(h]h ]h"]h$]h&]uh1jhj4 ubeh}(h]h ]h"]h$]h&]uh1jhjO hMhjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h **Return**h]jy)}(hju h]hReturn}(hjw hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjs ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubh)}(h4true if a read section retry is required, else falseh]h4true if a read section retry is required, else false}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&read_seqcount_latch_retry (C function)c.read_seqcount_latch_retryhNtauh1jhjhhhNhNubj)}(hhh](j)}(hIint read_seqcount_latch_retry (const seqcount_latch_t *s, unsigned start)h]j)}(hHint read_seqcount_latch_retry(const seqcount_latch_t *s, unsigned start)h](jd)}(hinth]hint}(hj hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj hhhj hMubj)}(hread_seqcount_latch_retryh]j)}(hread_seqcount_latch_retryh]hread_seqcount_latch_retry}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj hhhj hMubj)}(h+(const seqcount_latch_t *s, unsigned start)h](j)}(hconst seqcount_latch_t *sh](j)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjv)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubh)}(hhh]j)}(hseqcount_latch_th]hseqcount_latch_t}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj!modnameN classnameNjj)}j]j)}jj sbc.read_seqcount_latch_retryasbuh1hhj ubjv)}(h h]h }(hj5!hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubj)}(hjh]h*}(hjC!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]hs}(hjP!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubj)}(hunsigned starth](jd)}(hunsignedh]hunsigned}(hjh!hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjd!ubjv)}(h h]h }(hjv!hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjd!ubj)}(hstarth]hstart}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd!ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubeh}(h]h ]h"]h$]h&]hhuh1jhj hhhj hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj hhhj hMubah}(h]j ah ](jjeh"]h$]h&]j!j")j#huh1jhj hMhj hhubj%)}(hhh]h)}(h#end a seqcount_latch_t read sectionh]h#end a seqcount_latch_t read section}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj!hhubah}(h]h ]h"]h$]h&]uh1j$hj hhhj hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j!j9j!j:j;j<uh1jhhhjhNhNubjo)}(h**Parameters** ``const seqcount_latch_t *s`` Pointer to seqcount_latch_t ``unsigned start`` count, from read_seqcount_latch() **Return** true if a read section retry is required, else falseh](h)}(h**Parameters**h]jy)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj!ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj!ubj)}(hhh](j)}(h:``const seqcount_latch_t *s`` Pointer to seqcount_latch_t h](j)}(h``const seqcount_latch_t *s``h]jX)}(hj!h]hconst seqcount_latch_t *s}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj!ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj!ubj)}(hhh]h)}(hPointer to seqcount_latch_th]hPointer to seqcount_latch_t}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMhj"ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj"hMhj!ubj)}(h5``unsigned start`` count, from read_seqcount_latch() h](j)}(h``unsigned start``h]jX)}(hj("h]hunsigned start}(hj*"hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj&"ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj""ubj)}(hhh]h)}(h!count, from read_seqcount_latch()h]h!count, from read_seqcount_latch()}(hjA"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj="hMhj>"ubah}(h]h ]h"]h$]h&]uh1jhj""ubeh}(h]h ]h"]h$]h&]uh1jhj="hMhj!ubeh}(h]h ]h"]h$]h&]uh1jhj!ubh)}(h **Return**h]jy)}(hjc"h]hReturn}(hje"hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhja"ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj!ubh)}(h4true if a read section retry is required, else falseh]h4true if a read section retry is required, else false}(hjy"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%raw_write_seqcount_latch (C function)c.raw_write_seqcount_latchhNtauh1jhjhhhNhNubj)}(hhh](j)}(h3void raw_write_seqcount_latch (seqcount_latch_t *s)h]j)}(h2void raw_write_seqcount_latch(seqcount_latch_t *s)h](jd)}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj"hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj"hhhj"hMubj)}(hraw_write_seqcount_latchh]j)}(hraw_write_seqcount_latchh]hraw_write_seqcount_latch}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj"hhhj"hMubj)}(h(seqcount_latch_t *s)h]j)}(hseqcount_latch_t *sh](h)}(hhh]j)}(hseqcount_latch_t1h]hseqcount_latch_t}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj"modnameN classnameNjj)}j]j)}jj"sbc.raw_write_seqcount_latchasbuh1hhj"ubjv)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj"ubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hjh]hs}(hj##hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj"ubah}(h]h ]h"]h$]h&]hhuh1jhj"hhhj"hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj"hhhj"hMubah}(h]j"ah ](jjeh"]h$]h&]j!j")j#huh1jhj"hMhj"hhubj%)}(hhh]h)}(h'redirect latch readers to even/odd copyh]h'redirect latch readers to even/odd copy}(hjL#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjI#hhubah}(h]h ]h"]h$]h&]uh1j$hj"hhhj"hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8jd#j9jd#j:j;j<uh1jhhhjhNhNubjo)}(hE**Parameters** ``seqcount_latch_t *s`` Pointer to seqcount_latch_th](h)}(h**Parameters**h]jy)}(hjn#h]h Parameters}(hjp#hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjl#ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjh#ubj)}(hhh]j)}(h3``seqcount_latch_t *s`` Pointer to seqcount_latch_th](j)}(h``seqcount_latch_t *s``h]jX)}(hj#h]hseqcount_latch_t *s}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj#ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj#ubj)}(hhh]h)}(hPointer to seqcount_latch_th]hPointer to seqcount_latch_t}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj#hMhj#ubah}(h]h ]h"]h$]h&]uh1jhjh#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'write_seqcount_latch_begin (C function)c.write_seqcount_latch_beginhNtauh1jhjhhhNhNubj)}(hhh](j)}(h5void write_seqcount_latch_begin (seqcount_latch_t *s)h]j)}(h4void write_seqcount_latch_begin(seqcount_latch_t *s)h](jd)}(hvoidh]hvoid}(hj#hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj#hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj#hhhj#hMubj)}(hwrite_seqcount_latch_beginh]j)}(hwrite_seqcount_latch_beginh]hwrite_seqcount_latch_begin}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj#hhhj#hMubj)}(h(seqcount_latch_t *s)h]j)}(hseqcount_latch_t *sh](h)}(hhh]j)}(hseqcount_latch_th]hseqcount_latch_t}(hj'$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$$ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj)$modnameN classnameNjj)}j]j)}jj $sbc.write_seqcount_latch_beginasbuh1hhj $ubjv)}(h h]h }(hjG$hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj $ubj)}(hjh]h*}(hjU$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj $ubj)}(hjh]hs}(hjb$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj $ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj$ubah}(h]h ]h"]h$]h&]hhuh1jhj#hhhj#hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj#hhhj#hMubah}(h]j#ah ](jjeh"]h$]h&]j!j")j#huh1jhj#hMhj#hhubj%)}(hhh]h)}(h"redirect latch readers to odd copyh]h"redirect latch readers to odd copy}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$hhubah}(h]h ]h"]h$]h&]uh1j$hj#hhhj#hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j$j9j$j:j;j<uh1jhhhjhNhNubjo)}(hX **Parameters** ``seqcount_latch_t *s`` Pointer to seqcount_latch_t **Description** The latch technique is a multiversion concurrency control method that allows queries during non-atomic modifications. If you can guarantee queries never interrupt the modification -- e.g. the concurrency is strictly between CPUs -- you most likely do not need this. Where the traditional RCU/lockless data structures rely on atomic modifications to ensure queries observe either the old or the new state the latch allows the same for non-atomic updates. The trade-off is doubling the cost of storage; we have to maintain two copies of the entire data structure. Very simply put: we first modify one copy and then the other. This ensures there is always one copy in a stable state, ready to give us an answer. The basic form is a data structure like:: struct latch_struct { seqcount_latch_t seq; struct data_struct data[2]; }; Where a modification, which is assumed to be externally serialized, does the following:: void latch_modify(struct latch_struct *latch, ...) { write_seqcount_latch_begin(&latch->seq); modify(latch->data[0], ...); write_seqcount_latch(&latch->seq); modify(latch->data[1], ...); write_seqcount_latch_end(&latch->seq); } The query will have a form like:: struct entry *latch_query(struct latch_struct *latch, ...) { struct entry *entry; unsigned seq, idx; do { seq = read_seqcount_latch(&latch->seq); idx = seq & 0x01; entry = data_query(latch->data[idx], ...); // This includes needed smp_rmb() } while (read_seqcount_latch_retry(&latch->seq, seq)); return entry; } So during the modification, queries are first redirected to data[1]. Then we modify data[0]. When that is complete, we redirect queries back to data[0] and we can modify data[1]. **NOTE** The non-requirement for atomic modifications does _NOT_ include the publishing of new entries in the case where data is a dynamic data structure. An iteration might start in data[0] and get suspended long enough to miss an entire modification sequence, once it resumes it might observe the new entry. NOTE2: When data is a dynamic data structure; one should use regular RCU patterns to manage the lifetimes of the objects within.h](h)}(h**Parameters**h]jy)}(hj$h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj$ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubj)}(hhh]j)}(h4``seqcount_latch_t *s`` Pointer to seqcount_latch_t h](j)}(h``seqcount_latch_t *s``h]jX)}(hj$h]hseqcount_latch_t *s}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj$ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubj)}(hhh]h)}(hPointer to seqcount_latch_th]hPointer to seqcount_latch_t}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hMhj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubh)}(h**Description**h]jy)}(hj%h]h Description}(hj %hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj%ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubh)}(hX The latch technique is a multiversion concurrency control method that allows queries during non-atomic modifications. If you can guarantee queries never interrupt the modification -- e.g. the concurrency is strictly between CPUs -- you most likely do not need this.h]hX The latch technique is a multiversion concurrency control method that allows queries during non-atomic modifications. If you can guarantee queries never interrupt the modification -- e.g. the concurrency is strictly between CPUs -- you most likely do not need this.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubh)}(hX'Where the traditional RCU/lockless data structures rely on atomic modifications to ensure queries observe either the old or the new state the latch allows the same for non-atomic updates. The trade-off is doubling the cost of storage; we have to maintain two copies of the entire data structure.h]hX'Where the traditional RCU/lockless data structures rely on atomic modifications to ensure queries observe either the old or the new state the latch allows the same for non-atomic updates. The trade-off is doubling the cost of storage; we have to maintain two copies of the entire data structure.}(hj,%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubh)}(hVery simply put: we first modify one copy and then the other. This ensures there is always one copy in a stable state, ready to give us an answer.h]hVery simply put: we first modify one copy and then the other. This ensures there is always one copy in a stable state, ready to give us an answer.}(hj;%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubh)}(h)The basic form is a data structure like::h]h(The basic form is a data structure like:}(hjJ%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubj)}(hfstruct latch_struct { seqcount_latch_t seq; struct data_struct data[2]; };h]hfstruct latch_struct { seqcount_latch_t seq; struct data_struct data[2]; };}hjY%sbah}(h]h ]h"]h$]h&]hhuh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubh)}(hXWhere a modification, which is assumed to be externally serialized, does the following::h]hWWhere a modification, which is assumed to be externally serialized, does the following:}(hjh%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubj)}(hX void latch_modify(struct latch_struct *latch, ...) { write_seqcount_latch_begin(&latch->seq); modify(latch->data[0], ...); write_seqcount_latch(&latch->seq); modify(latch->data[1], ...); write_seqcount_latch_end(&latch->seq); }h]hX void latch_modify(struct latch_struct *latch, ...) { write_seqcount_latch_begin(&latch->seq); modify(latch->data[0], ...); write_seqcount_latch(&latch->seq); modify(latch->data[1], ...); write_seqcount_latch_end(&latch->seq); }}hjw%sbah}(h]h ]h"]h$]h&]hhuh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubh)}(h!The query will have a form like::h]h The query will have a form like:}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubj)}(hXstruct entry *latch_query(struct latch_struct *latch, ...) { struct entry *entry; unsigned seq, idx; do { seq = read_seqcount_latch(&latch->seq); idx = seq & 0x01; entry = data_query(latch->data[idx], ...); // This includes needed smp_rmb() } while (read_seqcount_latch_retry(&latch->seq, seq)); return entry; }h]hXstruct entry *latch_query(struct latch_struct *latch, ...) { struct entry *entry; unsigned seq, idx; do { seq = read_seqcount_latch(&latch->seq); idx = seq & 0x01; entry = data_query(latch->data[idx], ...); // This includes needed smp_rmb() } while (read_seqcount_latch_retry(&latch->seq, seq)); return entry; }}hj%sbah}(h]h ]h"]h$]h&]hhuh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubh)}(hSo during the modification, queries are first redirected to data[1]. Then we modify data[0]. When that is complete, we redirect queries back to data[0] and we can modify data[1].h]hSo during the modification, queries are first redirected to data[1]. Then we modify data[0]. When that is complete, we redirect queries back to data[0] and we can modify data[1].}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubh)}(h**NOTE**h]jy)}(hj%h]hNOTE}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj%ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubj)}(hX.The non-requirement for atomic modifications does _NOT_ include the publishing of new entries in the case where data is a dynamic data structure. An iteration might start in data[0] and get suspended long enough to miss an entire modification sequence, once it resumes it might observe the new entry. h](h)}(hThe non-requirement for atomic modifications does _NOT_ include the publishing of new entries in the case where data is a dynamic data structure.h]hThe non-requirement for atomic modifications does _NOT_ include the publishing of new entries in the case where data is a dynamic data structure.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj%ubh)}(hAn iteration might start in data[0] and get suspended long enough to miss an entire modification sequence, once it resumes it might observe the new entry.h]hAn iteration might start in data[0] and get suspended long enough to miss an entire modification sequence, once it resumes it might observe the new entry.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hMhj$ubh)}(hNOTE2:h]hNOTE2:}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$ubj)}(hyWhen data is a dynamic data structure; one should use regular RCU patterns to manage the lifetimes of the objects within.h]h)}(hyWhen data is a dynamic data structure; one should use regular RCU patterns to manage the lifetimes of the objects within.h]hyWhen data is a dynamic data structure; one should use regular RCU patterns to manage the lifetimes of the objects within.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj&ubah}(h]h ]h"]h$]h&]uh1jhj&hMhj$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!write_seqcount_latch (C function)c.write_seqcount_latchhNtauh1jhjhhhNhNubj)}(hhh](j)}(h/void write_seqcount_latch (seqcount_latch_t *s)h]j)}(h.void write_seqcount_latch(seqcount_latch_t *s)h](jd)}(hvoidh]hvoid}(hj;&hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj7&hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hjJ&hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj7&hhhjI&hMubj)}(hwrite_seqcount_latchh]j)}(hwrite_seqcount_latchh]hwrite_seqcount_latch}(hj\&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX&ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj7&hhhjI&hMubj)}(h(seqcount_latch_t *s)h]j)}(hseqcount_latch_t *sh](h)}(hhh]j)}(hseqcount_latch_th]hseqcount_latch_t}(hj{&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx&ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj}&modnameN classnameNjj)}j]j)}jj^&sbc.write_seqcount_latchasbuh1hhjt&ubjv)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjt&ubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt&ubj)}(hjh]hs}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt&ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjp&ubah}(h]h ]h"]h$]h&]hhuh1jhj7&hhhjI&hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj3&hhhjI&hMubah}(h]j.&ah ](jjeh"]h$]h&]j!j")j#huh1jhjI&hMhj0&hhubj%)}(hhh]h)}(h#redirect latch readers to even copyh]h#redirect latch readers to even copy}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj&hhubah}(h]h ]h"]h$]h&]uh1j$hj0&hhhjI&hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j&j9j&j:j;j<uh1jhhhjhNhNubjo)}(hE**Parameters** ``seqcount_latch_t *s`` Pointer to seqcount_latch_th](h)}(h**Parameters**h]jy)}(hj'h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj&ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj&ubj)}(hhh]j)}(h3``seqcount_latch_t *s`` Pointer to seqcount_latch_th](j)}(h``seqcount_latch_t *s``h]jX)}(hj 'h]hseqcount_latch_t *s}(hj"'hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj'ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj'ubj)}(hhh]h)}(hPointer to seqcount_latch_th]hPointer to seqcount_latch_t}(hj9'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj6'ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj5'hMhj'ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%write_seqcount_latch_end (C function)c.write_seqcount_latch_endhNtauh1jhjhhhNhNubj)}(hhh](j)}(h3void write_seqcount_latch_end (seqcount_latch_t *s)h]j)}(h2void write_seqcount_latch_end(seqcount_latch_t *s)h](jd)}(hvoidh]hvoid}(hjz'hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjv'hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjv'hhhj'hMubj)}(hwrite_seqcount_latch_endh]j)}(hwrite_seqcount_latch_endh]hwrite_seqcount_latch_end}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ](j j eh"]h$]h&]hhuh1jhjv'hhhj'hMubj)}(h(seqcount_latch_t *s)h]j)}(hseqcount_latch_t *sh](h)}(hhh]j)}(hseqcount_latch_th]hseqcount_latch_t}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj'modnameN classnameNjj)}j]j)}jj'sbc.write_seqcount_latch_endasbuh1hhj'ubjv)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj'ubj)}(hjh]h*}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hjh]hs}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj'ubah}(h]h ]h"]h$]h&]hhuh1jhjv'hhhj'hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjr'hhhj'hMubah}(h]jm'ah ](jjeh"]h$]h&]j!j")j#huh1jhj'hMhjo'hhubj%)}(hhh]h)}(h$end a seqcount_latch_t write sectionh]h$end a seqcount_latch_t write section}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj(hhubah}(h]h ]h"]h$]h&]uh1j$hjo'hhhj'hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j6(j9j6(j:j;j<uh1jhhhjhNhNubjo)}(h**Parameters** ``seqcount_latch_t *s`` Pointer to seqcount_latch_t **Description** Marks the end of a seqcount_latch_t writer section, after all copies of the latch-protected data have been updated.h](h)}(h**Parameters**h]jy)}(hj@(h]h Parameters}(hjB(hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj>(ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj:(ubj)}(hhh]j)}(h4``seqcount_latch_t *s`` Pointer to seqcount_latch_t h](j)}(h``seqcount_latch_t *s``h]jX)}(hj_(h]hseqcount_latch_t *s}(hja(hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj](ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjY(ubj)}(hhh]h)}(hPointer to seqcount_latch_th]hPointer to seqcount_latch_t}(hjx(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjt(hMhju(ubah}(h]h ]h"]h$]h&]uh1jhjY(ubeh}(h]h ]h"]h$]h&]uh1jhjt(hMhjV(ubah}(h]h ]h"]h$]h&]uh1jhj:(ubh)}(h**Description**h]jy)}(hj(h]h Description}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj(ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj:(ubh)}(hsMarks the end of a seqcount_latch_t writer section, after all copies of the latch-protected data have been updated.h]hsMarks the end of a seqcount_latch_t writer section, after all copies of the latch-protected data have been updated.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj:(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jseqlock_init (C macro)c.seqlock_inithNtauh1jhjhhhNhNubj)}(hhh](j)}(h seqlock_inith]j)}(h seqlock_inith]j)}(h seqlock_inith]j)}(hj(h]h seqlock_init}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj(hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM-ubah}(h]h ]h"]h$]h&]hhjuh1jjjhj(hhhj(hM-ubah}(h]j(ah ](jjeh"]h$]h&]j!j")j#huh1jhj(hM-hj(hhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hj(hhhj(hM-ubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j)j9j)j:j;j<uh1jhhhjhNhNubh)}(h``seqlock_init (sl)``h]jX)}(hj)h]hseqlock_init (sl)}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj)ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM/hjhhubj)}(h"dynamic initializer for seqlock_t h]h)}(h!dynamic initializer for seqlock_th]h!dynamic initializer for seqlock_t}(hj/)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM-hj+)ubah}(h]h ]h"]h$]h&]uh1jhj=)hM-hjhhubjo)}(h:**Parameters** ``sl`` Pointer to the seqlock_t instanceh](h)}(h**Parameters**h]jy)}(hjJ)h]h Parameters}(hjL)hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjH)ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM1hjD)ubj)}(hhh]j)}(h(``sl`` Pointer to the seqlock_t instanceh](j)}(h``sl``h]jX)}(hji)h]hsl}(hjk)hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjg)ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM3hjc)ubj)}(hhh]h)}(h!Pointer to the seqlock_t instanceh]h!Pointer to the seqlock_t instance}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM.hj)ubah}(h]h ]h"]h$]h&]uh1jhjc)ubeh}(h]h ]h"]h$]h&]uh1jhj~)hM3hj`)ubah}(h]h ]h"]h$]h&]uh1jhjD)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jDEFINE_SEQLOCK (C macro)c.DEFINE_SEQLOCKhNtauh1jhjhhhNhNubj)}(hhh](j)}(hDEFINE_SEQLOCKh]j)}(hDEFINE_SEQLOCKh]j)}(hDEFINE_SEQLOCKh]j)}(hj)h]hDEFINE_SEQLOCK}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj)hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM7ubah}(h]h ]h"]h$]h&]hhjuh1jjjhj)hhhj)hM7ubah}(h]j)ah ](jjeh"]h$]h&]j!j")j#huh1jhj)hM7hj)hhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hj)hhhj)hM7ubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j)j9j)j:j;j<uh1jhhhjhNhNubh)}(h``DEFINE_SEQLOCK (sl)``h]jX)}(hj)h]hDEFINE_SEQLOCK (sl)}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj)ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM9hjhhubj)}(h(Define a statically allocated seqlock_t h]h)}(h'Define a statically allocated seqlock_th]h'Define a statically allocated seqlock_t}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM7hj*ubah}(h]h ]h"]h$]h&]uh1jhj!*hM7hjhhubjo)}(h7**Parameters** ``sl`` Name of the seqlock_t instanceh](h)}(h**Parameters**h]jy)}(hj.*h]h Parameters}(hj0*hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj,*ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM;hj(*ubj)}(hhh]j)}(h%``sl`` Name of the seqlock_t instanceh](j)}(h``sl``h]jX)}(hjM*h]hsl}(hjO*hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjK*ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM=hjG*ubj)}(hhh]h)}(hName of the seqlock_t instanceh]hName of the seqlock_t instance}(hjf*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM8hjc*ubah}(h]h ]h"]h$]h&]uh1jhjG*ubeh}(h]h ]h"]h$]h&]uh1jhjb*hM=hjD*ubah}(h]h ]h"]h$]h&]uh1jhj(*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jread_seqbegin (C function)c.read_seqbeginhNtauh1jhjhhhNhNubj)}(hhh](j)}(h,unsigned read_seqbegin (const seqlock_t *sl)h]j)}(h+unsigned read_seqbegin(const seqlock_t *sl)h](jd)}(hunsignedh]hunsigned}(hj*hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj*hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM>ubjv)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj*hhhj*hM>ubj)}(h read_seqbeginh]j)}(h read_seqbeginh]h read_seqbegin}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj*hhhj*hM>ubj)}(h(const seqlock_t *sl)h]j)}(hconst seqlock_t *slh](j)}(hjh]hconst}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubjv)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj*ubh)}(hhh]j)}(h seqlock_th]h seqlock_t}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj+modnameN classnameNjj)}j]j)}jj*sbc.read_seqbeginasbuh1hhj*ubjv)}(h h]h }(hj"+hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj*ubj)}(hjh]h*}(hj0+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hslh]hsl}(hj=+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj*ubah}(h]h ]h"]h$]h&]hhuh1jhj*hhhj*hM>ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj*hhhj*hM>ubah}(h]j*ah ](jjeh"]h$]h&]j!j")j#huh1jhj*hM>hj*hhubj%)}(hhh]h)}(h,start a seqlock_t read side critical sectionh]h,start a seqlock_t read side critical section}(hjg+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM>hjd+hhubah}(h]h ]h"]h$]h&]uh1j$hj*hhhj*hM>ubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j+j9j+j:j;j<uh1jhhhjhNhNubjo)}(hr**Parameters** ``const seqlock_t *sl`` Pointer to seqlock_t **Return** count, to be passed to read_seqretry()h](h)}(h**Parameters**h]jy)}(hj+h]h Parameters}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj+ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMBhj+ubj)}(hhh]j)}(h-``const seqlock_t *sl`` Pointer to seqlock_t h](j)}(h``const seqlock_t *sl``h]jX)}(hj+h]hconst seqlock_t *sl}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj+ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM?hj+ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hM?hj+ubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhj+hM?hj+ubah}(h]h ]h"]h$]h&]uh1jhj+ubh)}(h **Return**h]jy)}(hj+h]hReturn}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj+ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMAhj+ubh)}(h&count, to be passed to read_seqretry()h]h&count, to be passed to read_seqretry()}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMAhj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jread_seqretry (C function)c.read_seqretryhNtauh1jhjhhhNhNubj)}(hhh](j)}(h.hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj:.hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMaubjv)}(h h]h }(hjM.hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj:.hhhjL.hMaubj)}(h write_seqlockh]j)}(h write_seqlockh]h write_seqlock}(hj_.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[.ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj:.hhhjL.hMaubj)}(h(seqlock_t *sl)h]j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hj~.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{.ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj.modnameN classnameNjj)}j]j)}jja.sbc.write_seqlockasbuh1hhjw.ubjv)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjw.ubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw.ubj)}(hslh]hsl}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw.ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjs.ubah}(h]h ]h"]h$]h&]hhuh1jhj:.hhhjL.hMaubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj6.hhhjL.hMaubah}(h]j1.ah ](jjeh"]h$]h&]j!j")j#huh1jhjL.hMahj3.hhubj%)}(hhh]h)}(h-start a seqlock_t write side critical sectionh]h-start a seqlock_t write side critical section}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMahj.hhubah}(h]h ]h"]h$]h&]uh1j$hj3.hhhjL.hMaubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j.j9j.j:j;j<uh1jhhhjhNhNubjo)}(hX**Parameters** ``seqlock_t *sl`` Pointer to seqlock_t **Description** write_seqlock opens a write side critical section for the given seqlock_t. It also implicitly acquires the spinlock_t embedded inside that sequential lock. All seqlock_t write side sections are thus automatically serialized and non-preemptible. **Context** if the seqlock_t read section, or other write side critical sections, can be invoked from hardirq or softirq contexts, use the _irqsave or _bh variants of this function instead.h](h)}(h**Parameters**h]jy)}(hj/h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj/ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMehj.ubj)}(hhh]j)}(h'``seqlock_t *sl`` Pointer to seqlock_t h](j)}(h``seqlock_t *sl``h]jX)}(hj$/h]h seqlock_t *sl}(hj&/hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj"/ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMbhj/ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj=/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9/hMbhj:/ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj9/hMbhj/ubah}(h]h ]h"]h$]h&]uh1jhj.ubh)}(h**Description**h]jy)}(hj_/h]h Description}(hja/hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj]/ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMdhj.ubh)}(hwrite_seqlock opens a write side critical section for the given seqlock_t. It also implicitly acquires the spinlock_t embedded inside that sequential lock. All seqlock_t write side sections are thus automatically serialized and non-preemptible.h]hwrite_seqlock opens a write side critical section for the given seqlock_t. It also implicitly acquires the spinlock_t embedded inside that sequential lock. All seqlock_t write side sections are thus automatically serialized and non-preemptible.}(hju/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMchj.ubh)}(h **Context**h]jy)}(hj/h]hContext}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj/ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhhj.ubh)}(hif the seqlock_t read section, or other write side critical sections, can be invoked from hardirq or softirq contexts, use the _irqsave or _bh variants of this function instead.h]hif the seqlock_t read section, or other write side critical sections, can be invoked from hardirq or softirq contexts, use the _irqsave or _bh variants of this function instead.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMihj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jwrite_sequnlock (C function)c.write_sequnlockhNtauh1jhjhhhNhNubj)}(hhh](j)}(h$void write_sequnlock (seqlock_t *sl)h]j)}(h#void write_sequnlock(seqlock_t *sl)h](jd)}(hvoidh]hvoid}(hj/hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj/hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMuubjv)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj/hhhj/hMuubj)}(hwrite_sequnlockh]j)}(hwrite_sequnlockh]hwrite_sequnlock}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj/hhhj/hMuubj)}(h(seqlock_t *sl)h]j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hj 0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj 0modnameN classnameNjj)}j]j)}jj/sbc.write_sequnlockasbuh1hhj0ubjv)}(h h]h }(hj+0hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj0ubj)}(hjh]h*}(hj90hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hslh]hsl}(hjF0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj0ubah}(h]h ]h"]h$]h&]hhuh1jhj/hhhj/hMuubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj/hhhj/hMuubah}(h]j/ah ](jjeh"]h$]h&]j!j")j#huh1jhj/hMuhj/hhubj%)}(hhh]h)}(h+end a seqlock_t write side critical sectionh]h+end a seqlock_t write side critical section}(hjp0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMuhjm0hhubah}(h]h ]h"]h$]h&]uh1j$hj/hhhj/hMuubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j0j9j0j:j;j<uh1jhhhjhNhNubjo)}(h**Parameters** ``seqlock_t *sl`` Pointer to seqlock_t **Description** write_sequnlock closes the (serialized and non-preemptible) write side critical section of given seqlock_t.h](h)}(h**Parameters**h]jy)}(hj0h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj0ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMyhj0ubj)}(hhh]j)}(h'``seqlock_t *sl`` Pointer to seqlock_t h](j)}(h``seqlock_t *sl``h]jX)}(hj0h]h seqlock_t *sl}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj0ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMvhj0ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMvhj0ubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhj0hMvhj0ubah}(h]h ]h"]h$]h&]uh1jhj0ubh)}(h**Description**h]jy)}(hj0h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj0ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMxhj0ubh)}(hkwrite_sequnlock closes the (serialized and non-preemptible) write side critical section of given seqlock_t.h]hkwrite_sequnlock closes the (serialized and non-preemptible) write side critical section of given seqlock_t.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMwhj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jwrite_seqlock_bh (C function)c.write_seqlock_bhhNtauh1jhjhhhNhNubj)}(hhh](j)}(h%void write_seqlock_bh (seqlock_t *sl)h]j)}(h$void write_seqlock_bh(seqlock_t *sl)h](jd)}(hvoidh]hvoid}(hj11hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj-1hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj@1hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj-1hhhj?1hMubj)}(hwrite_seqlock_bhh]j)}(hwrite_seqlock_bhh]hwrite_seqlock_bh}(hjR1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN1ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj-1hhhj?1hMubj)}(h(seqlock_t *sl)h]j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hjq1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn1ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetjs1modnameN classnameNjj)}j]j)}jjT1sbc.write_seqlock_bhasbuh1hhjj1ubjv)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjj1ubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj1ubj)}(hslh]hsl}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj1ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjf1ubah}(h]h ]h"]h$]h&]hhuh1jhj-1hhhj?1hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj)1hhhj?1hMubah}(h]j$1ah ](jjeh"]h$]h&]j!j")j#huh1jhj?1hMhj&1hhubj%)}(hhh]h)}(h1start a softirqs-disabled seqlock_t write sectionh]h1start a softirqs-disabled seqlock_t write section}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj1hhubah}(h]h ]h"]h$]h&]uh1j$hj&1hhhj?1hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j1j9j1j:j;j<uh1jhhhjhNhNubjo)}(h**Parameters** ``seqlock_t *sl`` Pointer to seqlock_t **Description** _bh variant of write_seqlock(). Use only if the read side section, or other write side sections, can be invoked from softirq contexts.h](h)}(h**Parameters**h]jy)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj1ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj1ubj)}(hhh]j)}(h'``seqlock_t *sl`` Pointer to seqlock_t h](j)}(h``seqlock_t *sl``h]jX)}(hj2h]h seqlock_t *sl}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj2ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj2ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj02hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,2hMhj-2ubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj,2hMhj2ubah}(h]h ]h"]h$]h&]uh1jhj1ubh)}(h**Description**h]jy)}(hjR2h]h Description}(hjT2hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjP2ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj1ubh)}(h_bh variant of write_seqlock(). Use only if the read side section, or other write side sections, can be invoked from softirq contexts.h]h_bh variant of write_seqlock(). Use only if the read side section, or other write side sections, can be invoked from softirq contexts.}(hjh2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jwrite_sequnlock_bh (C function)c.write_sequnlock_bhhNtauh1jhjhhhNhNubj)}(hhh](j)}(h'void write_sequnlock_bh (seqlock_t *sl)h]j)}(h&void write_sequnlock_bh(seqlock_t *sl)h](jd)}(hvoidh]hvoid}(hj2hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj2hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj2hhhj2hMubj)}(hwrite_sequnlock_bhh]j)}(hwrite_sequnlock_bhh]hwrite_sequnlock_bh}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj2hhhj2hMubj)}(h(seqlock_t *sl)h]j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj2modnameN classnameNjj)}j]j)}jj2sbc.write_sequnlock_bhasbuh1hhj2ubjv)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj2ubj)}(hjh]h*}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hslh]hsl}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj2ubah}(h]h ]h"]h$]h&]hhuh1jhj2hhhj2hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj2hhhj2hMubah}(h]j2ah ](jjeh"]h$]h&]j!j")j#huh1jhj2hMhj2hhubj%)}(hhh]h)}(h/end a softirqs-disabled seqlock_t write sectionh]h/end a softirqs-disabled seqlock_t write section}(hj<3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj93hhubah}(h]h ]h"]h$]h&]uh1j$hj2hhhj2hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8jT3j9jT3j:j;j<uh1jhhhjhNhNubjo)}(h**Parameters** ``seqlock_t *sl`` Pointer to seqlock_t **Description** write_sequnlock_bh closes the serialized, non-preemptible, and softirqs-disabled, seqlock_t write side critical section opened with write_seqlock_bh().h](h)}(h**Parameters**h]jy)}(hj^3h]h Parameters}(hj`3hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj\3ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjX3ubj)}(hhh]j)}(h'``seqlock_t *sl`` Pointer to seqlock_t h](j)}(h``seqlock_t *sl``h]jX)}(hj}3h]h seqlock_t *sl}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj{3ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjw3ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhjw3ubeh}(h]h ]h"]h$]h&]uh1jhj3hMhjt3ubah}(h]h ]h"]h$]h&]uh1jhjX3ubh)}(h**Description**h]jy)}(hj3h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj3ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjX3ubh)}(hwrite_sequnlock_bh closes the serialized, non-preemptible, and softirqs-disabled, seqlock_t write side critical section opened with write_seqlock_bh().h]hwrite_sequnlock_bh closes the serialized, non-preemptible, and softirqs-disabled, seqlock_t write side critical section opened with write_seqlock_bh().}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjX3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jwrite_seqlock_irq (C function)c.write_seqlock_irqhNtauh1jhjhhhNhNubj)}(hhh](j)}(h&void write_seqlock_irq (seqlock_t *sl)h]j)}(h%void write_seqlock_irq(seqlock_t *sl)h](jd)}(hvoidh]hvoid}(hj3hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj3hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj 4hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj3hhhj 4hMubj)}(hwrite_seqlock_irqh]j)}(hwrite_seqlock_irqh]hwrite_seqlock_irq}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj3hhhj 4hMubj)}(h(seqlock_t *sl)h]j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hj=4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:4ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj?4modnameN classnameNjj)}j]j)}jj 4sbc.write_seqlock_irqasbuh1hhj64ubjv)}(h h]h }(hj]4hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj64ubj)}(hjh]h*}(hjk4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj64ubj)}(hslh]hsl}(hjx4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj64ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj24ubah}(h]h ]h"]h$]h&]hhuh1jhj3hhhj 4hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj3hhhj 4hMubah}(h]j3ah ](jjeh"]h$]h&]j!j")j#huh1jhj 4hMhj3hhubj%)}(hhh]h)}(h1start a non-interruptible seqlock_t write sectionh]h1start a non-interruptible seqlock_t write section}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj4hhubah}(h]h ]h"]h$]h&]uh1j$hj3hhhj 4hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j4j9j4j:j;j<uh1jhhhjhNhNubjo)}(h**Parameters** ``seqlock_t *sl`` Pointer to seqlock_t **Description** _irq variant of write_seqlock(). Use only if the read side section, or other write sections, can be invoked from hardirq contexts.h](h)}(h**Parameters**h]jy)}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj4ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj4ubj)}(hhh]j)}(h'``seqlock_t *sl`` Pointer to seqlock_t h](j)}(h``seqlock_t *sl``h]jX)}(hj4h]h seqlock_t *sl}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj4ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj4ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hMhj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hMhj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubh)}(h**Description**h]jy)}(hj5h]h Description}(hj 5hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj5ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj4ubh)}(h_irq variant of write_seqlock(). Use only if the read side section, or other write sections, can be invoked from hardirq contexts.h]h_irq variant of write_seqlock(). Use only if the read side section, or other write sections, can be invoked from hardirq contexts.}(hj45hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j write_sequnlock_irq (C function)c.write_sequnlock_irqhNtauh1jhjhhhNhNubj)}(hhh](j)}(h(void write_sequnlock_irq (seqlock_t *sl)h]j)}(h'void write_sequnlock_irq(seqlock_t *sl)h](jd)}(hvoidh]hvoid}(hjc5hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj_5hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hjr5hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj_5hhhjq5hMubj)}(hwrite_sequnlock_irqh]j)}(hwrite_sequnlock_irqh]hwrite_sequnlock_irq}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj_5hhhjq5hMubj)}(h(seqlock_t *sl)h]j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj5modnameN classnameNjj)}j]j)}jj5sbc.write_sequnlock_irqasbuh1hhj5ubjv)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj5ubj)}(hjh]h*}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hslh]hsl}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj5ubah}(h]h ]h"]h$]h&]hhuh1jhj_5hhhjq5hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj[5hhhjq5hMubah}(h]jV5ah ](jjeh"]h$]h&]j!j")j#huh1jhjq5hMhjX5hhubj%)}(hhh]h)}(h/end a non-interruptible seqlock_t write sectionQh]h/end a non-interruptible seqlock_t write section}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj6hhubah}(h]h ]h"]h$]h&]uh1j$hjX5hhhjq5hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j 6j9j 6j:j;j<uh1jhhhjhNhNubjo)}(h**Parameters** ``seqlock_t *sl`` Pointer to seqlock_t **Description** write_sequnlock_irq closes the serialized and non-interruptible seqlock_t write side section opened with write_seqlock_irq().h](h)}(h**Parameters**h]jy)}(hj*6h]h Parameters}(hj,6hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj(6ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$6ubj)}(hhh]j)}(h'``seqlock_t *sl`` Pointer to seqlock_t h](j)}(h``seqlock_t *sl``h]jX)}(hjI6h]h seqlock_t *sl}(hjK6hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjG6ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjC6ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hjb6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^6hMhj_6ubah}(h]h ]h"]h$]h&]uh1jhjC6ubeh}(h]h ]h"]h$]h&]uh1jhj^6hMhj@6ubah}(h]h ]h"]h$]h&]uh1jhj$6ubh)}(h**Description**h]jy)}(hj6h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj6ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$6ubh)}(h}write_sequnlock_irq closes the serialized and non-interruptible seqlock_t write side section opened with write_seqlock_irq().h]h}write_sequnlock_irq closes the serialized and non-interruptible seqlock_t write side section opened with write_seqlock_irq().}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jwrite_seqlock_irqsave (C macro)c.write_seqlock_irqsavehNtauh1jhjhhhNhNubj)}(hhh](j)}(hwrite_seqlock_irqsaveh]j)}(hwrite_seqlock_irqsaveh]j)}(hwrite_seqlock_irqsaveh]j)}(hj6h]hwrite_seqlock_irqsave}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj6hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubah}(h]h ]h"]h$]h&]hhjuh1jjjhj6hhhj6hMubah}(h]j6ah ](jjeh"]h$]h&]j!j")j#huh1jhj6hMhj6hhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hj6hhhj6hMubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j6j9j6j:j;j<uh1jhhhjhNhNubh)}(h'``write_seqlock_irqsave (lock, flags)``h]jX)}(hj6h]h#write_seqlock_irqsave (lock, flags)}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj6ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjhhubj)}(h2start a non-interruptible seqlock_t write section h]h)}(h1start a non-interruptible seqlock_t write sectionh]h1start a non-interruptible seqlock_t write section}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj7ubah}(h]h ]h"]h$]h&]uh1jhj'7hMhjhhubjo)}(hXJ**Parameters** ``lock`` Pointer to seqlock_t ``flags`` Stack-allocated storage for saving caller's local interrupt state, to be passed to write_sequnlock_irqrestore(). **Description** _irqsave variant of write_seqlock(). Use it only if the read side section, or other write sections, can be invoked from hardirq context.h](h)}(h**Parameters**h]jy)}(hj47h]h Parameters}(hj67hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj27ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj.7ubj)}(hhh](j)}(h``lock`` Pointer to seqlock_t h](j)}(h``lock``h]jX)}(hjS7h]hlock}(hjU7hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjQ7ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjM7ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hjl7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjh7hMhji7ubah}(h]h ]h"]h$]h&]uh1jhjM7ubeh}(h]h ]h"]h$]h&]uh1jhjh7hMhjJ7ubj)}(h{``flags`` Stack-allocated storage for saving caller's local interrupt state, to be passed to write_sequnlock_irqrestore(). h](j)}(h ``flags``h]jX)}(hj7h]hflags}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj7ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj7ubj)}(hhh]h)}(hpStack-allocated storage for saving caller's local interrupt state, to be passed to write_sequnlock_irqrestore().h]hrStack-allocated storage for saving caller’s local interrupt state, to be passed to write_sequnlock_irqrestore().}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj7hMhjJ7ubeh}(h]h ]h"]h$]h&]uh1jhj.7ubh)}(h**Description**h]jy)}(hj7h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj7ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj.7ubh)}(h_irqsave variant of write_seqlock(). Use it only if the read side section, or other write sections, can be invoked from hardirq context.h]h_irqsave variant of write_seqlock(). Use it only if the read side section, or other write sections, can be invoked from hardirq context.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj.7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'write_sequnlock_irqrestore (C function)c.write_sequnlock_irqrestorehNtauh1jhjhhhNhNubj)}(hhh](j)}(hDvoid write_sequnlock_irqrestore (seqlock_t *sl, unsigned long flags)h]j)}(hCvoid write_sequnlock_irqrestore(seqlock_t *sl, unsigned long flags)h](jd)}(hvoidh]hvoid}(hj 8hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj 8hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj 8hhhj8hMubj)}(hwrite_sequnlock_irqrestoreh]j)}(hwrite_sequnlock_irqrestoreh]hwrite_sequnlock_irqrestore}(hj.8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*8ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj 8hhhj8hMubj)}(h$(seqlock_t *sl, unsigned long flags)h](j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hjM8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ8ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetjO8modnameN classnameNjj)}j]j)}jj08sbc.write_sequnlock_irqrestoreasbuh1hhjF8ubjv)}(h h]h }(hjm8hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjF8ubj)}(hjh]h*}(hj{8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF8ubj)}(hslh]hsl}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF8ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjB8ubj)}(hunsigned long flagsh](jd)}(hunsignedh]hunsigned}(hj8hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj8ubjv)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj8ubjd)}(hlongh]hlong}(hj8hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj8ubjv)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj8ubj)}(hflagsh]hflags}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjB8ubeh}(h]h ]h"]h$]h&]hhuh1jhj 8hhhj8hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj8hhhj8hMubah}(h]j8ah ](jjeh"]h$]h&]j!j")j#huh1jhj8hMhj8hhubj%)}(hhh]h)}(h-end non-interruptible seqlock_t write sectionh]h-end non-interruptible seqlock_t write section}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj9hhubah}(h]h ]h"]h$]h&]uh1j$hj8hhhj8hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j9j9j9j:j;j<uh1jhhhjhNhNubjo)}(hX1**Parameters** ``seqlock_t *sl`` Pointer to seqlock_t ``unsigned long flags`` Caller's saved interrupt state, from write_seqlock_irqsave() **Description** write_sequnlock_irqrestore closes the serialized and non-interruptible seqlock_t write section previously opened with write_seqlock_irqsave().h](h)}(h**Parameters**h]jy)}(hj%9h]h Parameters}(hj'9hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj#9ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj9ubj)}(hhh](j)}(h'``seqlock_t *sl`` Pointer to seqlock_t h](j)}(h``seqlock_t *sl``h]jX)}(hjD9h]h seqlock_t *sl}(hjF9hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjB9ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj>9ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj]9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjY9hMhjZ9ubah}(h]h ]h"]h$]h&]uh1jhj>9ubeh}(h]h ]h"]h$]h&]uh1jhjY9hMhj;9ubj)}(hU``unsigned long flags`` Caller's saved interrupt state, from write_seqlock_irqsave() h](j)}(h``unsigned long flags``h]jX)}(hj}9h]hunsigned long flags}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj{9ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjw9ubj)}(hhh]h)}(hCaller’s saved interrupt state, from write_seqlock_irqsave()}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hMhj9ubah}(h]h ]h"]h$]h&]uh1jhjw9ubeh}(h]h ]h"]h$]h&]uh1jhj9hMhj;9ubeh}(h]h ]h"]h$]h&]uh1jhj9ubh)}(h**Description**h]jy)}(hj9h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj9ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj9ubh)}(hwrite_sequnlock_irqrestore closes the serialized and non-interruptible seqlock_t write section previously opened with write_seqlock_irqsave().h]hwrite_sequnlock_irqrestore closes the serialized and non-interruptible seqlock_t write section previously opened with write_seqlock_irqsave().}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jread_seqlock_excl (C function)c.read_seqlock_exclhNtauh1jhjhhhNhNubj)}(hhh](j)}(h&void read_seqlock_excl (seqlock_t *sl)h]j)}(h%void read_seqlock_excl(seqlock_t *sl)h](jd)}(hvoidh]hvoid}(hj9hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj9hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj :hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj9hhhj :hMubj)}(hread_seqlock_exclh]j)}(hread_seqlock_exclh]hread_seqlock_excl}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj9hhhj :hMubj)}(h(seqlock_t *sl)h]j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hj=:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj::ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj?:modnameN classnameNjj)}j]j)}jj :sbc.read_seqlock_exclasbuh1hhj6:ubjv)}(h h]h }(hj]:hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj6:ubj)}(hjh]h*}(hjk:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6:ubj)}(hslh]hsl}(hjx:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6:ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj2:ubah}(h]h ]h"]h$]h&]hhuh1jhj9hhhj :hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj9hhhj :hMubah}(h]j9ah ](jjeh"]h$]h&]j!j")j#huh1jhj :hMhj9hhubj%)}(hhh]h)}(h(begin a seqlock_t locking reader sectionh]h(begin a seqlock_t locking reader section}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj:hhubah}(h]h ]h"]h$]h&]uh1j$hj9hhhj :hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j:j9j:j:j;j<uh1jhhhjhNhNubjo)}(hXT**Parameters** ``seqlock_t *sl`` Pointer to seqlock_t **Description** read_seqlock_excl opens a seqlock_t locking reader critical section. A locking reader exclusively locks out *both* other writers *and* other locking readers, but it does not update the embedded sequence number. Locking readers act like a normal spin_lock()/spin_unlock(). The opened read section must be closed with read_sequnlock_excl(). **Context** if the seqlock_t write section, *or other read sections*, can be invoked from hardirq or softirq contexts, use the _irqsave or _bh variant of this function instead.h](h)}(h**Parameters**h]jy)}(hj:h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj:ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj:ubj)}(hhh]j)}(h'``seqlock_t *sl`` Pointer to seqlock_t h](j)}(h``seqlock_t *sl``h]jX)}(hj:h]h seqlock_t *sl}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj:ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj:ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hMhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhj:hMhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubh)}(h**Description**h]jy)}(hj;h]h Description}(hj ;hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj;ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj:ubh)}(hread_seqlock_excl opens a seqlock_t locking reader critical section. A locking reader exclusively locks out *both* other writers *and* other locking readers, but it does not update the embedded sequence number.h](hmread_seqlock_excl opens a seqlock_t locking reader critical section. A locking reader exclusively locks out }(hj4;hhhNhNubhemphasis)}(h*both*h]hboth}(hj>;hhhNhNubah}(h]h ]h"]h$]h&]uh1j<;hj4;ubh other writers }(hj4;hhhNhNubj=;)}(h*and*h]hand}(hjP;hhhNhNubah}(h]h ]h"]h$]h&]uh1j<;hj4;ubhL other locking readers, but it does not update the embedded sequence number.}(hj4;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj:ubh)}(hh]h seqlock_t *sl}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj>ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj>ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hMhj=ubah}(h]h ]h"]h$]h&]uh1jhj=ubh)}(h**Description**h]jy)}(hjA>h]h Description}(hjC>hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj?>ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj=ubh)}(h_bh variant of read_seqlock_excl(). Use this variant only if the seqlock_t write side section, *or other read sections*, can be invoked from softirq contexts.h](h__bh variant of read_seqlock_excl(). Use this variant only if the seqlock_t write side section, }(hjW>hhhNhNubj=;)}(h*or other read sections*h]hor other read sections}(hj_>hhhNhNubah}(h]h ]h"]h$]h&]uh1j<;hjW>ubh', can be invoked from softirq contexts.}(hjW>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#read_sequnlock_excl_bh (C function)c.read_sequnlock_excl_bhhNtauh1jhjhhhNhNubj)}(hhh](j)}(h+void read_sequnlock_excl_bh (seqlock_t *sl)h]j)}(h*void read_sequnlock_excl_bh(seqlock_t *sl)h](jd)}(hvoidh]hvoid}(hj>hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj>hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj>hhhj>hMubj)}(hread_sequnlock_excl_bhh]j)}(hread_sequnlock_excl_bhh]hread_sequnlock_excl_bh}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj>hhhj>hMubj)}(h(seqlock_t *sl)h]j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj>modnameN classnameNjj)}j]j)}jj>sbc.read_sequnlock_excl_bhasbuh1hhj>ubjv)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj>ubj)}(hjh]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hslh]hsl}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj>ubah}(h]h ]h"]h$]h&]hhuh1jhj>hhhj>hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj>hhhj>hMubah}(h]j>ah ](jjeh"]h$]h&]j!j")j#huh1jhj>hMhj>hhubj%)}(hhh]h)}(h8stop a seqlock_t softirq-disabled locking reader sectionh]h8stop a seqlock_t softirq-disabled locking reader section}(hj=?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj:?hhubah}(h]h ]h"]h$]h&]uh1j$hj>hhhj>hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8jU?j9jU?j:j;j<uh1jhhhjhNhNubjo)}(h8**Parameters** ``seqlock_t *sl`` Pointer to seqlock_th](h)}(h**Parameters**h]jy)}(hj_?h]h Parameters}(hja?hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj]?ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjY?ubj)}(hhh]j)}(h&``seqlock_t *sl`` Pointer to seqlock_th](j)}(h``seqlock_t *sl``h]jX)}(hj~?h]h seqlock_t *sl}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj|?ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjx?ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj?ubah}(h]h ]h"]h$]h&]uh1jhjx?ubeh}(h]h ]h"]h$]h&]uh1jhj?hMhju?ubah}(h]h ]h"]h$]h&]uh1jhjY?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"read_seqlock_excl_irq (C function)c.read_seqlock_excl_irqhNtauh1jhjhhhNhNubj)}(hhh](j)}(h*void read_seqlock_excl_irq (seqlock_t *sl)h]j)}(h)void read_seqlock_excl_irq(seqlock_t *sl)h](jd)}(hvoidh]hvoid}(hj?hhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj?hhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj?hhhj?hMubj)}(hread_seqlock_excl_irqh]j)}(hread_seqlock_excl_irqh]hread_seqlock_excl_irq}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj?hhhj?hMubj)}(h(seqlock_t *sl)h]j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj@modnameN classnameNjj)}j]j)}jj?sbc.read_seqlock_excl_irqasbuh1hhj@ubjv)}(h h]h }(hj8@hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj@ubj)}(hjh]h*}(hjF@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hslh]hsl}(hjS@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj @ubah}(h]h ]h"]h$]h&]hhuh1jhj?hhhj?hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj?hhhj?hMubah}(h]j?ah ](jjeh"]h$]h&]j!j")j#huh1jhj?hMhj?hhubj%)}(hhh]h)}(h:start a non-interruptible seqlock_t locking reader sectionh]h:start a non-interruptible seqlock_t locking reader section}(hj}@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjz@hhubah}(h]h ]h"]h$]h&]uh1j$hj?hhhj?hMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j@j9j@j:j;j<uh1jhhhjhNhNubjo)}(h**Parameters** ``seqlock_t *sl`` Pointer to seqlock_t **Description** _irq variant of read_seqlock_excl(). Use this only if the seqlock_t write side section, *or other read sections*, can be invoked from a hardirq context.h](h)}(h**Parameters**h]jy)}(hj@h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj@ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM"hj@ubj)}(hhh]j)}(h'``seqlock_t *sl`` Pointer to seqlock_t h](j)}(h``seqlock_t *sl``h]jX)}(hj@h]h seqlock_t *sl}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj@ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM hj@ubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hM hj@ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hM hj@ubah}(h]h ]h"]h$]h&]uh1jhj@ubh)}(h**Description**h]jy)}(hj@h]h Description}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj@ubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM"hj@ubh)}(h_irq variant of read_seqlock_excl(). Use this only if the seqlock_t write side section, *or other read sections*, can be invoked from a hardirq context.h](hX_irq variant of read_seqlock_excl(). Use this only if the seqlock_t write side section, }(hjAhhhNhNubj=;)}(h*or other read sections*h]hor other read sections}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j<;hjAubh(, can be invoked from a hardirq context.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM!hj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$read_sequnlock_excl_irq (C function)c.read_sequnlock_excl_irqhNtauh1jhjhhhNhNubj)}(hhh](j)}(h,void read_sequnlock_excl_irq (seqlock_t *sl)h]j)}(h+void read_sequnlock_excl_irq(seqlock_t *sl)h](jd)}(hvoidh]hvoid}(hjPAhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjLAhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM-ubjv)}(h h]h }(hj_AhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjLAhhhj^AhM-ubj)}(hread_sequnlock_excl_irqh]j)}(hread_sequnlock_excl_irqh]hread_sequnlock_excl_irq}(hjqAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmAubah}(h]h ](j j eh"]h$]h&]hhuh1jhjLAhhhj^AhM-ubj)}(h(seqlock_t *sl)h]j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetjAmodnameN classnameNjj)}j]j)}jjsAsbc.read_sequnlock_excl_irqasbuh1hhjAubjv)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjAubj)}(hjh]h*}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(hslh]hsl}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjAubah}(h]h ]h"]h$]h&]hhuh1jhjLAhhhj^AhM-ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjHAhhhj^AhM-ubah}(h]jCAah ](jjeh"]h$]h&]j!j")j#huh1jhj^AhM-hjEAhhubj%)}(hhh]h)}(h;end an interrupts-disabled seqlock_t locking reader sectionh]h;end an interrupts-disabled seqlock_t locking reader section}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM-hjAhhubah}(h]h ]h"]h$]h&]uh1j$hjEAhhhj^AhM-ubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j Bj9j Bj:j;j<uh1jhhhjhNhNubjo)}(h8**Parameters** ``seqlock_t *sl`` Pointer to seqlock_th](h)}(h**Parameters**h]jy)}(hjBh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjBubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM1hjBubj)}(hhh]j)}(h&``seqlock_t *sl`` Pointer to seqlock_th](j)}(h``seqlock_t *sl``h]jX)}(hj6Bh]h seqlock_t *sl}(hj8BhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhj4Bubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM3hj0Bubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hjOBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM/hjLBubah}(h]h ]h"]h$]h&]uh1jhj0Bubeh}(h]h ]h"]h$]h&]uh1jhjKBhM3hj-Bubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#read_seqlock_excl_irqsave (C macro)c.read_seqlock_excl_irqsavehNtauh1jhjhhhNhNubj)}(hhh](j)}(hread_seqlock_excl_irqsaveh]j)}(hread_seqlock_excl_irqsaveh]j)}(hread_seqlock_excl_irqsaveh]j)}(hjBh]hread_seqlock_excl_irqsave}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ](j j eh"]h$]h&]hhuh1jhjBhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMAubah}(h]h ]h"]h$]h&]hhjuh1jjjhjBhhhjBhMAubah}(h]jBah ](jjeh"]h$]h&]j!j")j#huh1jhjBhMAhjBhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjBhhhjBhMAubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8jBj9jBj:j;j<uh1jhhhjhNhNubh)}(h+``read_seqlock_excl_irqsave (lock, flags)``h]jX)}(hjBh]h'read_seqlock_excl_irqsave (lock, flags)}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjBubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMChjhhubj)}(h;start a non-interruptible seqlock_t locking reader section h]h)}(h:start a non-interruptible seqlock_t locking reader sectionh]h:start a non-interruptible seqlock_t locking reader section}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMAhjBubah}(h]h ]h"]h$]h&]uh1jhjBhMAhjhhubjo)}(hXb**Parameters** ``lock`` Pointer to seqlock_t ``flags`` Stack-allocated storage for saving caller's local interrupt state, to be passed to read_sequnlock_excl_irqrestore(). **Description** _irqsave variant of read_seqlock_excl(). Use this only if the seqlock_t write side section, *or other read sections*, can be invoked from a hardirq context.h](h)}(h**Parameters**h]jy)}(hjBh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjBubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMEhjBubj)}(hhh](j)}(h``lock`` Pointer to seqlock_t h](j)}(h``lock``h]jX)}(hjCh]hlock}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjCubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMChjCubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj3ChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/ChMChj0Cubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhj/ChMChjCubj)}(h``flags`` Stack-allocated storage for saving caller's local interrupt state, to be passed to read_sequnlock_excl_irqrestore(). h](j)}(h ``flags``h]jX)}(hjSCh]hflags}(hjUChhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjQCubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMEhjMCubj)}(hhh]h)}(htStack-allocated storage for saving caller's local interrupt state, to be passed to read_sequnlock_excl_irqrestore().h]hvStack-allocated storage for saving caller’s local interrupt state, to be passed to read_sequnlock_excl_irqrestore().}(hjlChhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMDhjiCubah}(h]h ]h"]h$]h&]uh1jhjMCubeh}(h]h ]h"]h$]h&]uh1jhjhChMEhjCubeh}(h]h ]h"]h$]h&]uh1jhjBubh)}(h**Description**h]jy)}(hjCh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjCubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMGhjBubh)}(h_irqsave variant of read_seqlock_excl(). Use this only if the seqlock_t write side section, *or other read sections*, can be invoked from a hardirq context.h](h\_irqsave variant of read_seqlock_excl(). Use this only if the seqlock_t write side section, }(hjChhhNhNubj=;)}(h*or other read sections*h]hor other read sections}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j<;hjCubh(, can be invoked from a hardirq context.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMFhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j+read_sequnlock_excl_irqrestore (C function) c.read_sequnlock_excl_irqrestorehNtauh1jhjhhhNhNubj)}(hhh](j)}(hHvoid read_sequnlock_excl_irqrestore (seqlock_t *sl, unsigned long flags)h]j)}(hGvoid read_sequnlock_excl_irqrestore(seqlock_t *sl, unsigned long flags)h](jd)}(hvoidh]hvoid}(hjChhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjChhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMOubjv)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjChhhjChMOubj)}(hread_sequnlock_excl_irqrestoreh]j)}(hread_sequnlock_excl_irqrestoreh]hread_sequnlock_excl_irqrestore}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ](j j eh"]h$]h&]hhuh1jhjChhhjChMOubj)}(h$(seqlock_t *sl, unsigned long flags)h](j)}(h seqlock_t *slh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hj&DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#Dubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetj(DmodnameN classnameNjj)}j]j)}jj Dsb c.read_sequnlock_excl_irqrestoreasbuh1hhjDubjv)}(h h]h }(hjFDhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjDubj)}(hjh]h*}(hjTDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(hslh]hsl}(hjaDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjDubj)}(hunsigned long flagsh](jd)}(hunsignedh]hunsigned}(hjzDhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjvDubjv)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjvDubjd)}(hlongh]hlong}(hjDhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjvDubjv)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjvDubj)}(hflagsh]hflags}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvDubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjDubeh}(h]h ]h"]h$]h&]hhuh1jhjChhhjChMOubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjChhhjChMOubah}(h]jCah ](jjeh"]h$]h&]j!j")j#huh1jhjChMOhjChhubj%)}(hhh]h)}(h6end non-interruptible seqlock_t locking reader sectionh]h6end non-interruptible seqlock_t locking reader section}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMOhjDhhubah}(h]h ]h"]h$]h&]uh1j$hjChhhjChMOubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8jDj9jDj:j;j<uh1jhhhjhNhNubjo)}(h**Parameters** ``seqlock_t *sl`` Pointer to seqlock_t ``unsigned long flags`` Caller saved interrupt state, from read_seqlock_excl_irqsave()h](h)}(h**Parameters**h]jy)}(hjDh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjDubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMShjDubj)}(hhh](j)}(h'``seqlock_t *sl`` Pointer to seqlock_t h](j)}(h``seqlock_t *sl``h]jX)}(hjEh]h seqlock_t *sl}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjEubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMQhjEubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj6EhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2EhMQhj3Eubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jhj2EhMQhjEubj)}(hV``unsigned long flags`` Caller saved interrupt state, from read_seqlock_excl_irqsave()h](j)}(h``unsigned long flags``h]jX)}(hjVEh]hunsigned long flags}(hjXEhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjTEubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMShjPEubj)}(hhh]h)}(h>Caller saved interrupt state, from read_seqlock_excl_irqsave()h]h>Caller saved interrupt state, from read_seqlock_excl_irqsave()}(hjoEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMRhjlEubah}(h]h ]h"]h$]h&]uh1jhjPEubeh}(h]h ]h"]h$]h&]uh1jhjkEhMShjEubeh}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"read_seqbegin_or_lock (C function)c.read_seqbegin_or_lockhNtauh1jhjhhhNhNubj)}(hhh](j)}(h6void read_seqbegin_or_lock (seqlock_t *lock, int *seq)h]j)}(h5void read_seqbegin_or_lock(seqlock_t *lock, int *seq)h](jd)}(hvoidh]hvoid}(hjEhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjEhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM\ubjv)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjEhhhjEhM\ubj)}(hread_seqbegin_or_lockh]j)}(hread_seqbegin_or_lockh]hread_seqbegin_or_lock}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](j j eh"]h$]h&]hhuh1jhjEhhhjEhM\ubj)}(h(seqlock_t *lock, int *seq)h](j)}(hseqlock_t *lockh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetjEmodnameN classnameNjj)}j]j)}jjEsbc.read_seqbegin_or_lockasbuh1hhjEubjv)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjEubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hlockh]hlock}(hj+FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjEubj)}(hint *seqh](jd)}(hinth]hint}(hjDFhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj@Fubjv)}(h h]h }(hjRFhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj@Fubj)}(hjh]h*}(hj`FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@Fubj)}(hseqh]hseq}(hjmFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@Fubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjEubeh}(h]h ]h"]h$]h&]hhuh1jhjEhhhjEhM\ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjEhhhjEhM\ubah}(h]jEah ](jjeh"]h$]h&]j!j")j#huh1jhjEhM\hjEhhubj%)}(hhh]h)}(h,begin a seqlock_t lockless or locking readerh]h,begin a seqlock_t lockless or locking reader}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM\hjFhhubah}(h]h ]h"]h$]h&]uh1j$hjEhhhjEhM\ubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8jFj9jFj:j;j<uh1jhhhjhNhNubjo)}(hX**Parameters** ``seqlock_t *lock`` Pointer to seqlock_t ``int *seq`` Marker and return parameter. If the passed value is even, the reader will become a *lockless* seqlock_t reader as in read_seqbegin(). If the passed value is odd, the reader will become a *locking* reader as in read_seqlock_excl(). In the first call to this function, the caller *must* initialize and pass an even value to **seq**; this way, a lockless read can be optimistically tried first. **Description** read_seqbegin_or_lock is an API designed to optimistically try a normal lockless seqlock_t read section first. If an odd counter is found, the lockless read trial has failed, and the next read iteration transforms itself into a full seqlock_t locking reader. This is typically used to avoid seqlock_t lockless readers starvation (too much retry loops) in the case of a sharp spike in write side activity. Check Documentation/locking/seqlock.rst for template example code. **Context** if the seqlock_t write section, *or other read sections*, can be invoked from hardirq or softirq contexts, use the _irqsave or _bh variant of this function instead. **Return** the encountered sequence counter value, through the **seq** parameter, which is overloaded as a return parameter. This returned value must be checked with need_seqretry(). If the read section need to be retried, this returned value must also be passed as the **seq** parameter of the next read_seqbegin_or_lock() iteration.h](h)}(h**Parameters**h]jy)}(hjFh]h Parameters}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjFubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM`hjFubj)}(hhh](j)}(h)``seqlock_t *lock`` Pointer to seqlock_t h](j)}(h``seqlock_t *lock``h]jX)}(hjFh]hseqlock_t *lock}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjFubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM]hjFubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhM]hjFubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhjFhM]hjFubj)}(hX``int *seq`` Marker and return parameter. If the passed value is even, the reader will become a *lockless* seqlock_t reader as in read_seqbegin(). If the passed value is odd, the reader will become a *locking* reader as in read_seqlock_excl(). In the first call to this function, the caller *must* initialize and pass an even value to **seq**; this way, a lockless read can be optimistically tried first. h](j)}(h ``int *seq``h]jX)}(hjGh]hint *seq}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjGubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMchj Gubj)}(hhh]h)}(hXMarker and return parameter. If the passed value is even, the reader will become a *lockless* seqlock_t reader as in read_seqbegin(). If the passed value is odd, the reader will become a *locking* reader as in read_seqlock_excl(). In the first call to this function, the caller *must* initialize and pass an even value to **seq**; this way, a lockless read can be optimistically tried first.h](hSMarker and return parameter. If the passed value is even, the reader will become a }(hj*GhhhNhNubj=;)}(h *lockless*h]hlockless}(hj2GhhhNhNubah}(h]h ]h"]h$]h&]uh1j<;hj*Gubh^ seqlock_t reader as in read_seqbegin(). If the passed value is odd, the reader will become a }(hj*GhhhNhNubj=;)}(h *locking*h]hlocking}(hjDGhhhNhNubah}(h]h ]h"]h$]h&]uh1j<;hj*GubhS reader as in read_seqlock_excl(). In the first call to this function, the caller }(hj*GhhhNhNubj=;)}(h*must*h]hmust}(hjVGhhhNhNubah}(h]h ]h"]h$]h&]uh1j<;hj*Gubh& initialize and pass an even value to }(hj*GhhhNhNubjy)}(h**seq**h]hseq}(hjhGhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj*Gubh>; this way, a lockless read can be optimistically tried first.}(hj*GhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM^hj'Gubah}(h]h ]h"]h$]h&]uh1jhj Gubeh}(h]h ]h"]h$]h&]uh1jhj&GhMchjFubeh}(h]h ]h"]h$]h&]uh1jhjFubh)}(h**Description**h]jy)}(hjGh]h Description}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjGubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMehjFubh)}(hXread_seqbegin_or_lock is an API designed to optimistically try a normal lockless seqlock_t read section first. If an odd counter is found, the lockless read trial has failed, and the next read iteration transforms itself into a full seqlock_t locking reader.h]hXread_seqbegin_or_lock is an API designed to optimistically try a normal lockless seqlock_t read section first. If an odd counter is found, the lockless read trial has failed, and the next read iteration transforms itself into a full seqlock_t locking reader.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMdhjFubh)}(hThis is typically used to avoid seqlock_t lockless readers starvation (too much retry loops) in the case of a sharp spike in write side activity.h]hThis is typically used to avoid seqlock_t lockless readers starvation (too much retry loops) in the case of a sharp spike in write side activity.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMihjFubh)}(hBCheck Documentation/locking/seqlock.rst for template example code.h]hBCheck Documentation/locking/seqlock.rst for template example code.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMnhjFubh)}(h **Context**h]jy)}(hjGh]hContext}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjGubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMphjFubh)}(hif the seqlock_t write section, *or other read sections*, can be invoked from hardirq or softirq contexts, use the _irqsave or _bh variant of this function instead.h](h if the seqlock_t write section, }(hjGhhhNhNubj=;)}(h*or other read sections*h]hor other read sections}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1j<;hjGubhl, can be invoked from hardirq or softirq contexts, use the _irqsave or _bh variant of this function instead.}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMnhjFubh)}(h **Return**h]jy)}(hjHh]hReturn}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjHubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMrhjFubh)}(hXCthe encountered sequence counter value, through the **seq** parameter, which is overloaded as a return parameter. This returned value must be checked with need_seqretry(). If the read section need to be retried, this returned value must also be passed as the **seq** parameter of the next read_seqbegin_or_lock() iteration.h](h4the encountered sequence counter value, through the }(hj)HhhhNhNubjy)}(h**seq**h]hseq}(hj1HhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj)Hubh parameter, which is overloaded as a return parameter. This returned value must be checked with need_seqretry(). If the read section need to be retried, this returned value must also be passed as the }(hj)HhhhNhNubjy)}(h**seq**h]hseq}(hjCHhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj)Hubh9 parameter of the next read_seqbegin_or_lock() iteration.}(hj)HhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMthjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jneed_seqretry (C function)c.need_seqretryhNtauh1jhjhhhNhNubj)}(hhh](j)}(h,int need_seqretry (seqlock_t *lock, int seq)h]j)}(h+int need_seqretry(seqlock_t *lock, int seq)h](jd)}(hinth]hint}(hj|HhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjxHhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjxHhhhjHhMubj)}(h need_seqretryh]j)}(h need_seqretryh]h need_seqretry}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ](j j eh"]h$]h&]hhuh1jhjxHhhhjHhMubj)}(h(seqlock_t *lock, int seq)h](j)}(hseqlock_t *lockh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetjHmodnameN classnameNjj)}j]j)}jjHsbc.need_seqretryasbuh1hhjHubjv)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjHubj)}(hjh]h*}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hlockh]hlock}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjHubj)}(hint seqh](jd)}(hinth]hint}(hjIhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj Iubjv)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj Iubj)}(hseqh]hseq}(hj,IhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Iubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjHubeh}(h]h ]h"]h$]h&]hhuh1jhjxHhhhjHhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjtHhhhjHhMubah}(h]joHah ](jjeh"]h$]h&]j!j")j#huh1jhjHhMhjqHhhubj%)}(hhh]h)}(h5validate seqlock_t "locking or lockless" read sectionh]h9validate seqlock_t “locking or lockless” read section}(hjVIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjSIhhubah}(h]h ]h"]h$]h&]uh1j$hjqHhhhjHhMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8jnIj9jnIj:j;j<uh1jhhhjhNhNubjo)}(h**Parameters** ``seqlock_t *lock`` Pointer to seqlock_t ``int seq`` sequence count, from read_seqbegin_or_lock() **Return** true if a read section retry is required, false otherwiseh](h)}(h**Parameters**h]jy)}(hjxIh]h Parameters}(hjzIhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjvIubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjrIubj)}(hhh](j)}(h)``seqlock_t *lock`` Pointer to seqlock_t h](j)}(h``seqlock_t *lock``h]jX)}(hjIh]hseqlock_t *lock}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjIubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjIubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhMhjIubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjIhMhjIubj)}(h9``int seq`` sequence count, from read_seqbegin_or_lock() h](j)}(h ``int seq``h]jX)}(hjIh]hint seq}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjIubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.h~hMhjIubj)}(hhh]h)}(h,sequence count, from read_seqbegin_or_lock()h]h,sequence count, from read_seqbegin_or_lock()}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhMhjIubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjIhMhjIubeh}(h]h ]h"]h$]h&]uh1jhjrIubh)}(h **Return**h]jy)}(hj Jh]hReturn}(hj JhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj Jubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjrIubh)}(h9true if a read section retry is required, false otherwiseh]h9true if a read section retry is required, false otherwise}(hj!JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjrIubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdone_seqretry (C function)c.done_seqretryhNtauh1jhjhhhNhNubj)}(hhh](j)}(h-void done_seqretry (seqlock_t *lock, int seq)h]j)}(h,void done_seqretry(seqlock_t *lock, int seq)h](jd)}(hvoidh]hvoid}(hjPJhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjLJhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj_JhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjLJhhhj^JhMubj)}(h done_seqretryh]j)}(h done_seqretryh]h done_seqretry}(hjqJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmJubah}(h]h ](j j eh"]h$]h&]hhuh1jhjLJhhhj^JhMubj)}(h(seqlock_t *lock, int seq)h](j)}(hseqlock_t *lockh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetjJmodnameN classnameNjj)}j]j)}jjsJsbc.done_seqretryasbuh1hhjJubjv)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjJubj)}(hjh]h*}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj)}(hlockh]hlock}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjJubj)}(hint seqh](jd)}(hinth]hint}(hjJhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjJubjv)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjJubj)}(hseqh]hseq}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjJubeh}(h]h ]h"]h$]h&]hhuh1jhjLJhhhj^JhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjHJhhhj^JhMubah}(h]jCJah ](jjeh"]h$]h&]j!j")j#huh1jhj^JhMhjEJhhubj%)}(hhh]h)}(h2end seqlock_t "locking or lockless" reader sectionh]h6end seqlock_t “locking or lockless” reader section}(hj*KhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj'Khhubah}(h]h ]h"]h$]h&]uh1j$hjEJhhhj^JhMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8jBKj9jBKj:j;j<uh1jhhhjhNhNubjo)}(hX**Parameters** ``seqlock_t *lock`` Pointer to seqlock_t ``int seq`` count, from read_seqbegin_or_lock() **Description** done_seqretry finishes the seqlock_t read side critical section started with read_seqbegin_or_lock() and validated by need_seqretry().h](h)}(h**Parameters**h]jy)}(hjLKh]h Parameters}(hjNKhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjJKubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjFKubj)}(hhh](j)}(h)``seqlock_t *lock`` Pointer to seqlock_t h](j)}(h``seqlock_t *lock``h]jX)}(hjkKh]hseqlock_t *lock}(hjmKhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjiKubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjeKubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMhjKubah}(h]h ]h"]h$]h&]uh1jhjeKubeh}(h]h ]h"]h$]h&]uh1jhjKhMhjbKubj)}(h0``int seq`` count, from read_seqbegin_or_lock() h](j)}(h ``int seq``h]jX)}(hjKh]hint seq}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjKubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjKubj)}(hhh]h)}(h#count, from read_seqbegin_or_lock()h]h#count, from read_seqbegin_or_lock()}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMhjKubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhjKhMhjbKubeh}(h]h ]h"]h$]h&]uh1jhjFKubh)}(h**Description**h]jy)}(hjKh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjKubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjFKubh)}(hdone_seqretry finishes the seqlock_t read side critical section started with read_seqbegin_or_lock() and validated by need_seqretry().h]hdone_seqretry finishes the seqlock_t read side critical section started with read_seqbegin_or_lock() and validated by need_seqretry().}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjFKubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*read_seqbegin_or_lock_irqsave (C function)c.read_seqbegin_or_lock_irqsavehNtauh1jhjhhhNhNubj)}(hhh](j)}(hGunsigned long read_seqbegin_or_lock_irqsave (seqlock_t *lock, int *seq)h]j)}(hFunsigned long read_seqbegin_or_lock_irqsave(seqlock_t *lock, int *seq)h](jd)}(hunsignedh]hunsigned}(hj$LhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj LhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hj3LhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj Lhhhj2LhMubjd)}(hlongh]hlong}(hjALhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchj Lhhhj2LhMubjv)}(h h]h }(hjOLhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj Lhhhj2LhMubj)}(hread_seqbegin_or_lock_irqsaveh]j)}(hread_seqbegin_or_lock_irqsaveh]hread_seqbegin_or_lock_irqsave}(hjaLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]Lubah}(h]h ](j j eh"]h$]h&]hhuh1jhj Lhhhj2LhMubj)}(h(seqlock_t *lock, int *seq)h](j)}(hseqlock_t *lockh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}Lubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetjLmodnameN classnameNjj)}j]j)}jjcLsbc.read_seqbegin_or_lock_irqsaveasbuh1hhjyLubjv)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjyLubj)}(hjh]h*}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyLubj)}(hlockh]hlock}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyLubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjuLubj)}(hint *seqh](jd)}(hinth]hint}(hjLhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjLubjv)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjLubj)}(hjh]h*}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hseqh]hseq}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjuLubeh}(h]h ]h"]h$]h&]hhuh1jhj Lhhhj2LhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjLhhhj2LhMubah}(h]jLah ](jjeh"]h$]h&]j!j")j#huh1jhj2LhMhjLhhubj%)}(hhh]h)}(hHbegin a seqlock_t lockless reader, or a non-interruptible locking readerh]hHbegin a seqlock_t lockless reader, or a non-interruptible locking reader}(hj'MhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj$Mhhubah}(h]h ]h"]h$]h&]uh1j$hjLhhhj2LhMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8j?Mj9j?Mj:j;j<uh1jhhhjhNhNubjo)}(hX**Parameters** ``seqlock_t *lock`` Pointer to seqlock_t ``int *seq`` Marker and return parameter. Check read_seqbegin_or_lock(). **Description** This is the _irqsave variant of read_seqbegin_or_lock(). Use it only if the seqlock_t write section, *or other read sections*, can be invoked from hardirq context. 1. The saved local interrupts state in case of a locking reader, to be passed to done_seqretry_irqrestore(). 2. The encountered sequence counter value, returned through **seq** overloaded as a return parameter. Check read_seqbegin_or_lock(). **Note** Interrupts will be disabled only for "locking reader" mode.h](h)}(h**Parameters**h]jy)}(hjIMh]h Parameters}(hjKMhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjGMubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjCMubj)}(hhh](j)}(h)``seqlock_t *lock`` Pointer to seqlock_t h](j)}(h``seqlock_t *lock``h]jX)}(hjhMh]hseqlock_t *lock}(hjjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjfMubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjbMubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}MhMhj~Mubah}(h]h ]h"]h$]h&]uh1jhjbMubeh}(h]h ]h"]h$]h&]uh1jhj}MhMhj_Mubj)}(hI``int *seq`` Marker and return parameter. Check read_seqbegin_or_lock(). h](j)}(h ``int *seq``h]jX)}(hjMh]hint *seq}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjMubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjMubj)}(hhh]h)}(h;Marker and return parameter. Check read_seqbegin_or_lock().h]h;Marker and return parameter. Check read_seqbegin_or_lock().}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMhjMubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjMhMhj_Mubeh}(h]h ]h"]h$]h&]uh1jhjCMubh)}(h**Description**h]jy)}(hjMh]h Description}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjMubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjCMubh)}(hThis is the _irqsave variant of read_seqbegin_or_lock(). Use it only if the seqlock_t write section, *or other read sections*, can be invoked from hardirq context.h](heThis is the _irqsave variant of read_seqbegin_or_lock(). Use it only if the seqlock_t write section, }(hjMhhhNhNubj=;)}(h*or other read sections*h]hor other read sections}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j<;hjMubh&, can be invoked from hardirq context.}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjCMubj)}(h1. The saved local interrupts state in case of a locking reader, to be passed to done_seqretry_irqrestore(). 2. The encountered sequence counter value, returned through **seq** overloaded as a return parameter. Check read_seqbegin_or_lock(). h]j2)}(hhh](j)}(hjThe saved local interrupts state in case of a locking reader, to be passed to done_seqretry_irqrestore(). h]h)}(hiThe saved local interrupts state in case of a locking reader, to be passed to done_seqretry_irqrestore().h]hiThe saved local interrupts state in case of a locking reader, to be passed to done_seqretry_irqrestore().}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjNubah}(h]h ]h"]h$]h&]uh1jhjNubj)}(hThe encountered sequence counter value, returned through **seq** overloaded as a return parameter. Check read_seqbegin_or_lock(). h]h)}(hThe encountered sequence counter value, returned through **seq** overloaded as a return parameter. Check read_seqbegin_or_lock().h](h9The encountered sequence counter value, returned through }(hj7NhhhNhNubjy)}(h**seq**h]hseq}(hj?NhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj7NubhA overloaded as a return parameter. Check read_seqbegin_or_lock().}(hj7NhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhj3Nubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]jjjhjjuh1j1hjNubah}(h]h ]h"]h$]h&]uh1jhj,NhMhjCMubh)}(h**Note**h]jy)}(hjlNh]hNote}(hjnNhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjjNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjCMubh)}(h;Interrupts will be disabled only for "locking reader" mode.h]h?Interrupts will be disabled only for “locking reader” mode.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjCMubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%done_seqretry_irqrestore (C function)c.done_seqretry_irqrestorehNtauh1jhjhhhNhNubj)}(hhh](j)}(hMvoid done_seqretry_irqrestore (seqlock_t *lock, int seq, unsigned long flags)h]j)}(hLvoid done_seqretry_irqrestore(seqlock_t *lock, int seq, unsigned long flags)h](jd)}(hvoidh]hvoid}(hjNhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjNhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMubjv)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjNhhhjNhMubj)}(hdone_seqretry_irqrestoreh]j)}(hdone_seqretry_irqrestoreh]hdone_seqretry_irqrestore}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ](j j eh"]h$]h&]hhuh1jhjNhhhjNhMubj)}(h/(seqlock_t *lock, int seq, unsigned long flags)h](j)}(hseqlock_t *lockh](h)}(hhh]j)}(h seqlock_th]h seqlock_t}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainj2reftypej reftargetjNmodnameN classnameNjj)}j]j)}jjNsbc.done_seqretry_irqrestoreasbuh1hhjNubjv)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjNubj)}(hjh]h*}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj)}(hlockh]hlock}(hj,OhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjNubj)}(hint seqh](jd)}(hinth]hint}(hjEOhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjAOubjv)}(h h]h }(hjSOhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjAOubj)}(hseqh]hseq}(hjaOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAOubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjNubj)}(hunsigned long flagsh](jd)}(hunsignedh]hunsigned}(hjzOhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjvOubjv)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjvOubjd)}(hlongh]hlong}(hjOhhhNhNubah}(h]h ]jpah"]h$]h&]uh1jchjvOubjv)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjvOubj)}(hflagsh]hflags}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvOubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjNubeh}(h]h ]h"]h$]h&]hhuh1jhjNhhhjNhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjNhhhjNhMubah}(h]jNah ](jjeh"]h$]h&]j!j")j#huh1jhjNhMhjNhhubj%)}(hhh]h)}(hNend a seqlock_t lockless reader, or a non-interruptible locking reader sectionh]hNend a seqlock_t lockless reader, or a non-interruptible locking reader section}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjOhhubah}(h]h ]h"]h$]h&]uh1j$hjNhhhjNhMubeh}(h]h ](j2functioneh"]h$]h&]j7j2j8jOj9jOj:j;j<uh1jhhhjhNhNubjo)}(hX**Parameters** ``seqlock_t *lock`` Pointer to seqlock_t ``int seq`` Count, from read_seqbegin_or_lock_irqsave() ``unsigned long flags`` Caller's saved local interrupt state in case of a locking reader, also from read_seqbegin_or_lock_irqsave() **Description** This is the _irqrestore variant of done_seqretry(). The read section must've been opened with read_seqbegin_or_lock_irqsave(), and validated by need_seqretry().h](h)}(h**Parameters**h]jy)}(hjOh]h Parameters}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjOubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjOubj)}(hhh](j)}(h)``seqlock_t *lock`` Pointer to seqlock_t h](j)}(h``seqlock_t *lock``h]jX)}(hjPh]hseqlock_t *lock}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjPubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjPubj)}(hhh]h)}(hPointer to seqlock_th]hPointer to seqlock_t}(hj6PhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2PhMhj3Pubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhj2PhMhjPubj)}(h8``int seq`` Count, from read_seqbegin_or_lock_irqsave() h](j)}(h ``int seq``h]jX)}(hjVPh]hint seq}(hjXPhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjTPubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjPPubj)}(hhh]h)}(h+Count, from read_seqbegin_or_lock_irqsave()h]h+Count, from read_seqbegin_or_lock_irqsave()}(hjoPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkPhMhjlPubah}(h]h ]h"]h$]h&]uh1jhjPPubeh}(h]h ]h"]h$]h&]uh1jhjkPhMhjPubj)}(h``unsigned long flags`` Caller's saved local interrupt state in case of a locking reader, also from read_seqbegin_or_lock_irqsave() h](j)}(h``unsigned long flags``h]jX)}(hjPh]hunsigned long flags}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjPubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjPubj)}(hhh]h)}(hkCaller's saved local interrupt state in case of a locking reader, also from read_seqbegin_or_lock_irqsave()h]hmCaller’s saved local interrupt state in case of a locking reader, also from read_seqbegin_or_lock_irqsave()}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjPubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhjPhMhjPubeh}(h]h ]h"]h$]h&]uh1jhjOubh)}(h**Description**h]jy)}(hjPh]h Description}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjPubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjOubh)}(hThis is the _irqrestore variant of done_seqretry(). The read section must've been opened with read_seqbegin_or_lock_irqsave(), and validated by need_seqretry().h]hThis is the _irqrestore variant of done_seqretry(). The read section must’ve been opened with read_seqbegin_or_lock_irqsave(), and validated by need_seqretry().}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMhjOubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jscoped_seqlock_read (C macro)c.scoped_seqlock_readhNtauh1jhjhhhNhNubj)}(hhh](j)}(hscoped_seqlock_readh]j)}(hscoped_seqlock_readh]j)}(hscoped_seqlock_readh]j)}(hj Qh]hscoped_seqlock_read}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ](j j eh"]h$]h&]hhuh1jhj QhhhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM>ubah}(h]h ]h"]h$]h&]hhjuh1jjjhjQhhhj'QhM>ubah}(h]jQah ](jjeh"]h$]h&]j!j")j#huh1jhj'QhM>hjQhhubj%)}(hhh]h}(h]h ]h"]h$]h&]uh1j$hjQhhhj'QhM>ubeh}(h]h ](j2macroeh"]h$]h&]j7j2j8j@Qj9j@Qj:j;j<uh1jhhhjhNhNubh)}(h+``scoped_seqlock_read (_seqlock, _target)``h]jX)}(hjFQh]h'scoped_seqlock_read (_seqlock, _target)}(hjHQhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjDQubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM@hjhhubj)}(hjexecute the read-side critical section without manual sequence counter handling or calls to other helpers h]h)}(hiexecute the read-side critical section without manual sequence counter handling or calls to other helpersh]hiexecute the read-side critical section without manual sequence counter handling or calls to other helpers}(hj`QhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhM>hj\Qubah}(h]h ]h"]h$]h&]uh1jhjnQhM>hjhhubjo)}(hX**Parameters** ``_seqlock`` pointer to seqlock_t protecting the data ``_target`` an enum ss_state: one of {ss_lock, ss_lock_irqsave, ss_lockless} indicating the type of critical read section **Description** Example:: scoped_seqlock_read (&lock, ss_lock) { // read-side critical section } Starts with a lockess pass first. If it fails, restarts the critical section with the lock held.h](h)}(h**Parameters**h]jy)}(hj{Qh]h Parameters}(hj}QhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjyQubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMBhjuQubj)}(hhh](j)}(h6``_seqlock`` pointer to seqlock_t protecting the data h](j)}(h ``_seqlock``h]jX)}(hjQh]h_seqlock}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjQubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMAhjQubj)}(hhh]h)}(h(pointer to seqlock_t protecting the datah]h(pointer to seqlock_t protecting the data}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMAhjQubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjQhMAhjQubj)}(hz``_target`` an enum ss_state: one of {ss_lock, ss_lock_irqsave, ss_lockless} indicating the type of critical read section h](j)}(h ``_target``h]jX)}(hjQh]h_target}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jWhjQubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMChjQubj)}(hhh]h)}(hman enum ss_state: one of {ss_lock, ss_lock_irqsave, ss_lockless} indicating the type of critical read sectionh]hman enum ss_state: one of {ss_lock, ss_lock_irqsave, ss_lockless} indicating the type of critical read section}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMBhjQubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjQhMChjQubeh}(h]h ]h"]h$]h&]uh1jhjuQubh)}(h**Description**h]jy)}(hjRh]h Description}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj Rubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMEhjuQubh)}(h Example::h]hExample:}(hj%RhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMDhjuQubj)}(hJscoped_seqlock_read (&lock, ss_lock) { // read-side critical section }h]hJscoped_seqlock_read (&lock, ss_lock) { // read-side critical section }}hj4Rsbah}(h]h ]h"]h$]h&]hhuh1jhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMFhjuQubh)}(h`Starts with a lockess pass first. If it fails, restarts the critical section with the lock held.h]h`Starts with a lockess pass first. If it fails, restarts the critical section with the lock held.}(hjCRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/locking/seqlock:242: ./include/linux/seqlock.hhMJhjuQubeh}(h]h ] kernelindentah"]h$]h&]uh1jnhjhhhNhNubeh}(h]api-documentationah ]h"]api documentationah$]h&]uh1hhhhhhhhKubeh}(h]&sequence-counters-and-sequential-locksah ]h"]&sequence counters and sequential locksah$]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_handlerjRerror_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}(jC]j8aj$]jaj]jajq]jgaunameids}(jfRjcRjIjFjjCjjjj$jjjxjjwjtjjqjjj^Rj[Ru nametypes}(jfRjIjjjjjxjwjjj^Ruh}(jcRhjFhjCjLjjLj$j%jj%jjjtjjqjjjj[Rjjjjjjjjjj j j j j j$ j j jjj`jejjjjjjjHjMjRjWj\jajjjjjrjwjVj[jjjjj j j"j"j#j#j.&j3&jm'jr'j(j(j)j)j*j*j,j ,j1.j6.j/j/j$1j)1j2j2j3j3jV5j[5j6j6j8j8j9j9j;j;j=j=j>j>j?j?jCAjHAjBjBjCjCjEjEjoHjtHjCJjHJjLjLjNjNjQjQu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages](hsystem_message)}(hhh]h)}(hhh]h0Hyperlink target "seqcount-t" is not referenced.}hjRsbah}(h]h ]h"]h$]h&]uh1hhjRubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehnjlineK'uh1jRubjR)}(hhh]h)}(hhh]h9Hyperlink target "seqcount-locktype-t" is not referenced.}hjSsbah}(h]h ]h"]h$]h&]uh1hhjSubah}(h]h ]h"]h$]h&]levelKtypejSsourcehnjlineK\uh1jRubjR)}(hhh]h)}(hhh]h6Hyperlink target "seqcount-latch-t" is not referenced.}hj.Ssbah}(h]h ]h"]h$]h&]uh1hhj+Subah}(h]h ]h"]h$]h&]levelKtypejSsourcehnjlineKuh1jRubjR)}(hhh]h)}(hhh]h/Hyperlink target "seqlock-t" is not referenced.}hjHSsbah}(h]h ]h"]h$]h&]uh1hhjESubah}(h]h ]h"]h$]h&]levelKtypejSsourcehnjlineKuh1jRube transformerN include_log] decorationNhhub.