On 2022-05-31 13:52, David Marchand wrote:
> On Mon, May 23, 2022 at 4:24 PM Mattias Rönnblom
> <mattias.ronnb...@ericsson.com> wrote:
>>
>> A sequence lock (seqlock) is a synchronization primitive which allows
>> for data-race free, low-overhead, high-frequency reads, suitable for
>> data structures shared across many cores and which are updated
>> relatively infrequently.
>>
>> A seqlock permits multiple parallel readers. A spinlock is used to
>> serialize writers. In cases where there is only a single writer, or
>> writer-writer synchronization is done by some external means, the
>> "raw" sequence counter type (and accompanying rte_seqcount_*()
>> functions) may be used instead.
>>
>> To avoid resource reclamation and other issues, the data protected by
>> a seqlock is best off being self-contained (i.e., no pointers [except
>> to constant data]).
>>
>> One way to think about seqlocks is that they provide means to perform
>> atomic operations on data objects larger than what the native atomic
>> machine instructions allow for.
>>
>> DPDK seqlocks (and the underlying sequence counters) are not
>> preemption safe on the writer side. A thread preemption affects
>> performance, not correctness.
>>
>> A seqlock contains a sequence number, which can be thought of as the
>> generation of the data it protects.
>>
>> A reader will
>>    1. Load the sequence number (sn).
>>    2. Load, in arbitrary order, the seqlock-protected data.
>>    3. Load the sn again.
>>    4. Check if the first and second sn are equal, and even numbered.
>>       If they are not, discard the loaded data, and restart from 1.
>>
>> The first three steps need to be ordered using suitable memory fences.
>>
>> A writer will
>>    1. Take the spinlock, to serialize writer access.
>>    2. Load the sn.
>>    3. Store the original sn + 1 as the new sn.
>>    4. Perform load and stores to the seqlock-protected data.
>>    5. Store the original sn + 2 as the new sn.
>>    6. Release the spinlock.
>>
>> Proper memory fencing is required to make sure the first sn store, the
>> data stores, and the second sn store appear to the reader in the
>> mentioned order.
>>
>> The sn loads and stores must be atomic, but the data loads and stores
>> need not be.
>>
>> The original seqlock design and implementation was done by Stephen
>> Hemminger. This is an independent implementation, using C11 atomics.
>>
>> For more information on seqlocks, see
>> https://en.wikipedia.org/wiki/Seqlock
> 
> The SoB and other tags were with annotations, just repeating them here
> (in the hope patchwork will catch them):
> 
> Acked-by: Morten Brørup <m...@smartsharesystems.com>
> Acked-by: Konstantin Ananyev <konstantin.anan...@intel.com>
> Reviewed-by: Ola Liljedahl <ola.liljed...@arm.com>
> Reviewed-by: Chengwen Feng <fengcheng...@huawei.com>
> Signed-off-by: Mattias Rönnblom <mattias.ronnb...@ericsson.com>
> 
> GHA had a hiccup on Ubuntu vm installation at the time of the v9 reception.
> I had run the checks on my side:
> https://protect2.fireeye.com/v1/url?k=31323334-501d5122-313273af-454445555731-b0b15dcc7275f17b&q=1&e=d209ff4b-9405-4dbe-8e79-b8505f61ca68&u=https%3A%2F%2Fgithub.com%2Fdavid-marchand%2Fdpdk%2Factions%2Fruns%2F2373533127
> 
> I noticed a little issue in the example in the doxygen comments that I
> can fix myself:
> --- a/lib/eal/include/rte_seqlock.h
> +++ b/lib/eal/include/rte_seqlock.h
> @@ -63,7 +63,7 @@ extern "C" {
>    *                 // An alternative to an immediate retry is to abort and
>    *                 // try again at some later time, assuming progress is
>    *                 // possible without the data.
> - *         } while (rte_seqlock_read_retry(&config->lock));
> + *         } while (rte_seqlock_read_retry(&config->lock, sn));
>    * }
>    *
>    * // Accessor function for writing config fields.
> 
> I also have some whitespace fixes here and there.
> 
> I may shorten the release notes update to keep only the first
> paragraph, as the rest is too verbose and repeated in the
> documentation.

Makes sense.

> 
> Overall, comments were addressed and the patch looks ready.
> Last call before merging?
> 
> 

I don't have anything to add. Thanks.

Reply via email to