DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Mattias Rönnblom" <hofors@lysator.liu.se>
To: "Morten Brørup" <mb@smartsharesystems.com>,
	"Mattias Rönnblom" <mattias.ronnblom@ericsson.com>,
	dev@dpdk.org
Cc: Heng Wang <heng.wang@ericsson.com>,
	Stephen Hemminger <stephen@networkplumber.org>,
	Tyler Retzlaff <roretzla@linux.microsoft.com>
Subject: Re: [RFC v7 3/6] eal: add exactly-once bit access functions
Date: Wed, 8 May 2024 11:27:28 +0200	[thread overview]
Message-ID: <1c557696-492d-445c-af5c-9341a538d782@lysator.liu.se> (raw)
In-Reply-To: <98CBD80474FA8B44BF855DF32C47DC35E9F429@smartserver.smartshare.dk>

On 2024-05-08 10:11, Morten Brørup wrote:
>> From: Mattias Rönnblom [mailto:hofors@lysator.liu.se]
>> Sent: Wednesday, 8 May 2024 10.00
>>
>> On 2024-05-08 09:33, Morten Brørup wrote:
>>>> From: Mattias Rönnblom [mailto:hofors@lysator.liu.se]
>>>> Sent: Wednesday, 8 May 2024 08.47
>>>>
>>>> On 2024-05-07 21:17, Morten Brørup wrote:
>>>>>> From: Mattias Rönnblom [mailto:mattias.ronnblom@ericsson.com]
>>>>>> Sent: Sunday, 5 May 2024 10.38
>>>>>>
>>>>>> Add test/set/clear/assign/flip functions which prevents certain
>>>>>> compiler optimizations and guarantees that program-level memory loads
>>>>>> and/or stores will actually occur.
>>>>>>
>>>>>> These functions are useful when interacting with memory-mapped
>>>>>> hardware devices.
>>>>>>
>>>>>> The "once" family of functions does not promise atomicity and provides
>>>>>> no memory ordering guarantees beyond the C11 relaxed memory model.
>>>>>
>>>>> In another thread, Stephen referred to the extended discussion on memory
>>>> models in Linux kernel documentation:
>>>>> https://www.kernel.org/doc/html/latest/core-api/wrappers/memory-
>>>> barriers.html
>>>>>
>>>>> Unlike the "once" family of functions in this RFC, the "once" family of
>>>> functions in the kernel also guarantee memory ordering, specifically for
>>>> memory-mapped hardware devices. The document describes the rationale with
>>>> examples.
>>>>>
>>>>
>>>> What more specifically did you have in mind? READ_ONCE() and
>>>> WRITE_ONCE()? They give almost no guarantees. Very much relaxed.
>>>
>>> The way I read it, they do provide memory ordering guarantees.
>>>
>>
>> Sure. All types memory operations comes with some kind guarantees. A
>> series of non-atomic, non-volatile stores issued by a particular thread
>> are guaranteed to happen in program order, from the point of view of
>> that thread, for example. Would be hard to write a program if that
>> wasn't true.
>>
>> "This macro does not give any guarantees in regards to memory ordering /../"
>>
>> This is not true. I will rephrase to "any *additional* guarantees" for
>> both plain and "once" family documentation.
> 
> Consider code like this:
> set_once(HW_START_BIT);
> while (!get_once(HW_DONE_BIT)) /*busy wait*/;
> 
> If the "once" functions are used for hardware access, they must guarantee that HW_START_BIT has been written before HW_DONE_BIT is read.
> 

Provided bits reside in the same word, there is (or at least, should be) 
such guarantee, and otherwise, you'll need a barrier.

I'm guessing in most cases the requirements are actually not as strict 
as you pose them: DONE starts as 0, so it may actually be read before 
START is written to, but not all DONE reads can be reordered ahead of 
the single START write. In that case, a compiler barrier between set and 
the get loop should suffice. Otherwise, you need a full barrier, or an 
I/O barrier.

Anyway, since the exact purpose of the "once" type bit operations is 
unclear, maybe I should drop them from the patch set.

Now, they are much like the Linux kernel's __set_bit(), but for hardware 
access, maybe they should be more like writel().

> The documentation must reflect this ordering guarantee.
> 
>>
>>> Ignore that the kernel's "once" functions operates on words and this RFC
>> operates on bits, the behavior is the same. Either there are memory ordering
>> guarantees, or there are not.
>>>
>>>>
>>>> I've read that document.
>>>>
>>>> What you should keep in mind if you read that document, is that DPDK
>>>> doesn't use the kernel's memory model, and doesn't have the kernel's
>>>> barrier and atomics APIs. What we have are an obsolete, miniature
>>>> look-alike in <rte_atomic.h> and something C11-like in <rte_stdatomic.h>.
>>>>
>>>> My general impression is that DPDK was moving in the C11 direction
>>>> memory model-wise, which is not the model the kernel uses.
>>>
>>> I think you and I agree that using legacy methods only because "the kernel
>> does it that way" would not be the optimal roadmap for DPDK.
>>>
>>> We should keep moving in the C11 direction memory model-wise.
>>> I consider it more descriptive, and thus expect compilers to eventually
>> produce better optimized code.
>>>
>>>>
>>>>> It makes me think that DPDK "once" family of functions should behave
>>>> similarly.
>>>>
>>>> I think they do already.
>>>
>>> I haven't looked deep into it, but the RFC's documentation says otherwise:
>>> The "once" family of functions does not promise atomicity and provides *no
>> memory ordering* guarantees beyond the C11 relaxed memory model.
>>>
>>>>
>>>> Also, rte_bit_once_set() works as the kernel's __set_bit().
>>>>
>>>>> Alternatively, if the "once" family of functions cannot be generically
>>>> implemented with a memory ordering that is optimal for all use cases, drop
>>>> this family of functions, and instead rely on the "atomic" family of
>> functions
>>>> for interacting with memory-mapped hardware devices.
>>>>>
>>>>>>
>>>>>> RFC v7:
>>>>>>     * Fix various minor issues in documentation.
>>>>>>
>>>>>> RFC v6:
>>>>>>     * Have rte_bit_once_test() accept const-marked bitsets.
>>>>>>
>>>>>> RFC v3:
>>>>>>     * Work around lack of C++ support for _Generic (Tyler Retzlaff).
>>>>>>
>>>>>> Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
>>>>>> Acked-by: Morten Brørup <mb@smartsharesystems.com>
>>>>>> Acked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
>>>>>> ---
>>>>>

  reply	other threads:[~2024-05-08  9:27 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-02 13:53 [RFC 0/7] Improve EAL bit operations API Mattias Rönnblom
2024-03-02 13:53 ` [RFC 1/7] eal: extend bit manipulation functions Mattias Rönnblom
2024-03-02 17:05   ` Stephen Hemminger
2024-03-03  6:26     ` Mattias Rönnblom
2024-03-04 16:34       ` Tyler Retzlaff
2024-03-05 18:01         ` Mattias Rönnblom
2024-03-05 18:06           ` Tyler Retzlaff
2024-04-25  8:58   ` [RFC v2 0/6] Improve EAL bit operations API Mattias Rönnblom
2024-04-25  8:58     ` [RFC v2 1/6] eal: extend bit manipulation functionality Mattias Rönnblom
2024-04-29  9:51       ` [RFC v3 0/6] Improve EAL bit operations API Mattias Rönnblom
2024-04-29  9:51         ` [RFC v3 1/6] eal: extend bit manipulation functionality Mattias Rönnblom
2024-04-29 11:12           ` Morten Brørup
2024-04-30  9:55           ` [RFC v4 0/6] Improve EAL bit operations API Mattias Rönnblom
2024-04-30  9:55             ` [RFC v4 1/6] eal: extend bit manipulation functionality Mattias Rönnblom
2024-04-30 12:08               ` [RFC v5 0/6] Improve EAL bit operations API Mattias Rönnblom
2024-04-30 12:08                 ` [RFC v5 1/6] eal: extend bit manipulation functionality Mattias Rönnblom
2024-05-02  5:57                   ` [RFC v6 0/6] Improve EAL bit operations API Mattias Rönnblom
2024-05-02  5:57                     ` [RFC v6 1/6] eal: extend bit manipulation functionality Mattias Rönnblom
2024-05-05  8:37                       ` [RFC v7 0/6] Improve EAL bit operations API Mattias Rönnblom
2024-05-05  8:37                         ` [RFC v7 1/6] eal: extend bit manipulation functionality Mattias Rönnblom
2024-05-05  8:37                         ` [RFC v7 2/6] eal: add unit tests for bit operations Mattias Rönnblom
2024-05-05  8:37                         ` [RFC v7 3/6] eal: add exactly-once bit access functions Mattias Rönnblom
2024-05-07 19:17                           ` Morten Brørup
2024-05-08  6:47                             ` Mattias Rönnblom
2024-05-08  7:33                               ` Morten Brørup
2024-05-08  8:00                                 ` Mattias Rönnblom
2024-05-08  8:11                                   ` Morten Brørup
2024-05-08  9:27                                     ` Mattias Rönnblom [this message]
2024-05-08 10:08                                       ` Morten Brørup
2024-05-08 15:15                                 ` Stephen Hemminger
2024-05-08 16:16                                   ` Morten Brørup
2024-05-05  8:37                         ` [RFC v7 4/6] eal: add unit tests for " Mattias Rönnblom
2024-05-05  8:37                         ` [RFC v7 5/6] eal: add atomic bit operations Mattias Rönnblom
2024-05-05  8:37                         ` [RFC v7 6/6] eal: add unit tests for atomic bit access functions Mattias Rönnblom
2024-05-02  5:57                     ` [RFC v6 2/6] eal: add unit tests for bit operations Mattias Rönnblom
2024-05-02  5:57                     ` [RFC v6 3/6] eal: add exactly-once bit access functions Mattias Rönnblom
2024-05-02  5:57                     ` [RFC v6 4/6] eal: add unit tests for " Mattias Rönnblom
2024-05-02  5:57                     ` [RFC v6 5/6] eal: add atomic bit operations Mattias Rönnblom
2024-05-03  6:41                       ` Mattias Rönnblom
2024-05-03 23:30                         ` Tyler Retzlaff
2024-05-04 15:36                           ` Mattias Rönnblom
2024-05-02  5:57                     ` [RFC v6 6/6] eal: add unit tests for atomic bit access functions Mattias Rönnblom
2024-04-30 12:08                 ` [RFC v5 2/6] eal: add unit tests for bit operations Mattias Rönnblom
2024-04-30 12:08                 ` [RFC v5 3/6] eal: add exactly-once bit access functions Mattias Rönnblom
2024-04-30 12:08                 ` [RFC v5 4/6] eal: add unit tests for " Mattias Rönnblom
2024-04-30 12:08                 ` [RFC v5 5/6] eal: add atomic bit operations Mattias Rönnblom
2024-04-30 12:08                 ` [RFC v5 6/6] eal: add unit tests for atomic bit access functions Mattias Rönnblom
2024-04-30  9:55             ` [RFC v4 2/6] eal: add unit tests for bit operations Mattias Rönnblom
2024-04-30  9:55             ` [RFC v4 3/6] eal: add exactly-once bit access functions Mattias Rönnblom
2024-04-30  9:55             ` [RFC v4 4/6] eal: add unit tests for " Mattias Rönnblom
2024-04-30 10:37               ` Morten Brørup
2024-04-30 11:58                 ` Mattias Rönnblom
2024-04-30  9:55             ` [RFC v4 5/6] eal: add atomic bit operations Mattias Rönnblom
2024-04-30  9:55             ` [RFC v4 6/6] eal: add unit tests for atomic bit access functions Mattias Rönnblom
2024-04-29  9:51         ` [RFC v3 2/6] eal: add unit tests for bit operations Mattias Rönnblom
2024-04-29  9:51         ` [RFC v3 3/6] eal: add exactly-once bit access functions Mattias Rönnblom
2024-04-29  9:51         ` [RFC v3 4/6] eal: add unit tests for " Mattias Rönnblom
2024-04-29  9:51         ` [RFC v3 5/6] eal: add atomic bit operations Mattias Rönnblom
2024-04-29  9:51         ` [RFC v3 6/6] eal: add unit tests for atomic bit access functions Mattias Rönnblom
2024-04-25  8:58     ` [RFC v2 2/6] eal: add unit tests for bit operations Mattias Rönnblom
2024-04-25  8:58     ` [RFC v2 3/6] eal: add exactly-once bit access functions Mattias Rönnblom
2024-04-25  8:58     ` [RFC v2 4/6] eal: add unit tests for " Mattias Rönnblom
2024-04-25  8:58     ` [RFC v2 5/6] eal: add atomic bit operations Mattias Rönnblom
2024-04-25 10:25       ` Morten Brørup
2024-04-25 14:36         ` Mattias Rönnblom
2024-04-25 16:18           ` Morten Brørup
2024-04-26  9:39             ` Mattias Rönnblom
2024-04-26 12:00               ` Morten Brørup
2024-04-28 15:37                 ` Mattias Rönnblom
2024-04-29  7:24                   ` Morten Brørup
2024-04-30 16:52               ` Tyler Retzlaff
2024-04-25  8:58     ` [RFC v2 6/6] eal: add unit tests for atomic bit access functions Mattias Rönnblom
2024-04-25 18:05     ` [RFC v2 0/6] Improve EAL bit operations API Tyler Retzlaff
2024-04-26 11:17       ` Mattias Rönnblom
2024-04-26 21:35     ` Patrick Robb
2024-03-02 13:53 ` [RFC 2/7] eal: add generic bit manipulation macros Mattias Rönnblom
2024-03-04  8:16   ` Heng Wang
2024-03-04 15:41     ` Mattias Rönnblom
2024-03-04 16:42   ` Tyler Retzlaff
2024-03-05 18:08     ` Mattias Rönnblom
2024-03-05 18:22       ` Tyler Retzlaff
2024-03-05 20:02         ` Mattias Rönnblom
2024-03-05 20:53           ` Tyler Retzlaff
2024-03-02 13:53 ` [RFC 3/7] eal: add bit manipulation functions which read or write once Mattias Rönnblom
2024-03-02 13:53 ` [RFC 4/7] eal: add generic once-type bit operations macros Mattias Rönnblom
2024-03-02 13:53 ` [RFC 5/7] eal: add atomic bit operations Mattias Rönnblom
2024-03-02 13:53 ` [RFC 6/7] eal: add generic " Mattias Rönnblom
2024-03-02 13:53 ` [RFC 7/7] eal: deprecate relaxed family of " Mattias Rönnblom
2024-03-02 17:07   ` Stephen Hemminger
2024-03-03  6:30     ` Mattias Rönnblom

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1c557696-492d-445c-af5c-9341a538d782@lysator.liu.se \
    --to=hofors@lysator.liu.se \
    --cc=dev@dpdk.org \
    --cc=heng.wang@ericsson.com \
    --cc=mattias.ronnblom@ericsson.com \
    --cc=mb@smartsharesystems.com \
    --cc=roretzla@linux.microsoft.com \
    --cc=stephen@networkplumber.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).