• Ahmed S. Darwish's avatar
    seqlock: Introduce seqcount_latch_t · 80793c34
    Ahmed S. Darwish authored
    Latch sequence counters are a multiversion concurrency control mechanism
    where the seqcount_t counter even/odd value is used to switch between
    two copies of protected data. This allows the seqcount_t read path to
    safely interrupt its write side critical section (e.g. from NMIs).
    
    Initially, latch sequence counters were implemented as a single write
    function above plain seqcount_t: raw_write_seqcount_latch(). The read
    side was expected to use plain seqcount_t raw_read_seqcount().
    
    A specialized latch read function, raw_read_seqcount_latch(), was later
    added. It became the standardized way for latch read paths.  Due to the
    dependent load, it has one read memory barrier less than the plain
    seqcount_t raw_read_seqcount() API.
    
    Only raw_write_seqcount_latch() and raw_read_seqcount_latch() should be
    used with latch sequence counters. Having *unique* read and write path
    APIs means that latch sequence counters are actually a data type of
    their own -- just inappropriately overloading plain seqcount_t.
    
    Introduce seqcount_latch_t. This adds type-safety and ensures that only
    the correct latch-safe APIs are to be used.
    
    Not to break bisection, let the latch APIs also accept plain seqcount_t
    or seqcount_raw_spinlock_t. After converting all call sites to
    seqcount_latch_t, only that new data type will be allowed.
    
    References: 9b0fd802 ("seqcount: Add raw_write_seqcount_latch()")
    References: 7fc26327 ("seqlock: Introduce raw_read_seqcount_latch()")
    References: aadd6e5c ("time/sched_clock: Use raw_read_seqcount_latch()")
    Signed-off-by: default avatarAhmed S. Darwish <a.darwish@linutronix.de>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20200827114044.11173-4-a.darwish@linutronix.de
    80793c34
seqlock.rst 7.56 KB