]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
documentation: seqlock: fix the wrong documentation of read_seqbegin_or_lock/need_seq...
authorOleg Nesterov <oleg@redhat.com>
Sun, 28 Sep 2025 16:20:29 +0000 (18:20 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 21 Oct 2025 10:31:56 +0000 (12:31 +0200)
The comments and pseudo code in Documentation/locking/seqlock.rst are wrong:

int seq = 0;
do {
read_seqbegin_or_lock(&foo_seqlock, &seq);

/* ... [[read-side critical section]] ... */

} while (need_seqretry(&foo_seqlock, seq));

read_seqbegin_or_lock() always returns with an even "seq" and need_seqretry()
doesn't change this counter. This means that seq is always even and thus the
locking pass is simply impossible.

IOW, "_or_lock" has no effect and this code doesn't differ from

do {
seq = read_seqbegin(&foo_seqlock);

/* ... [[read-side critical section]] ... */

} while (read_seqretry(&foo_seqlock, seq));

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Documentation/locking/seqlock.rst

index 3fb7ea3ab22a6cf6cd58f72d68ed1045a89ea816..9899871d3d9a955ad9035d15124675d9a82a2ee7 100644 (file)
@@ -220,13 +220,14 @@ Read path, three categories:
    according to a passed marker. This is used to avoid lockless readers
    starvation (too much retry loops) in case of a sharp spike in write
    activity. First, a lockless read is tried (even marker passed). If
-   that trial fails (odd sequence counter is returned, which is used as
-   the next iteration marker), the lockless read is transformed to a
-   full locking read and no retry loop is necessary::
+   that trial fails (sequence counter doesn't match), make the marker
+   odd for the next iteration, the lockless read is transformed to a
+   full locking read and no retry loop is necessary, for example::
 
        /* marker; even initialization */
-       int seq = 0;
+       int seq = 1;
        do {
+               seq++; /* 2 on the 1st/lockless path, otherwise odd */
                read_seqbegin_or_lock(&foo_seqlock, &seq);
 
                /* ... [[read-side critical section]] ... */