DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Mattias Rönnblom" <hofors@lysator.liu.se>
To: Tyler Retzlaff <roretzla@linux.microsoft.com>
Cc: "Mattias Rönnblom" <mattias.ronnblom@ericsson.com>,
	dev@dpdk.org, "Heng Wang" <heng.wang@ericsson.com>
Subject: Re: [RFC 2/7] eal: add generic bit manipulation macros
Date: Tue, 5 Mar 2024 21:02:34 +0100	[thread overview]
Message-ID: <79dbc7d5-a519-4349-9652-6c458e11b0c0@lysator.liu.se> (raw)
In-Reply-To: <20240305182221.GA24679@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net>

On 2024-03-05 19:22, Tyler Retzlaff wrote:
> On Tue, Mar 05, 2024 at 07:08:36PM +0100, Mattias Rönnblom wrote:
>> On 2024-03-04 17:42, Tyler Retzlaff wrote:
>>> On Sat, Mar 02, 2024 at 02:53:23PM +0100, Mattias Rönnblom wrote:
>>>> Add bit-level test/set/clear/assign macros operating on both 32-bit
>>>> and 64-bit words by means of C11 generic selection.
>>>>
>>>> Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
>>>> ---
>>>
>>> _Generic is nice here. should we discourage direct use of the inline
>>> functions in preference of using the macro always? either way lgtm.
>>>
>>
>> That was something I considered, but decided against it for RFC v1.
>> I wasn't even sure people would like _Generic.
>>
>> The big upside of having only the _Generic macros would be a much
>> smaller API, but maybe a tiny bit less (type-)safe to use.
> 
> i'm curious what misuse pattern you anticipate or have seen that may be
> less type-safe? just so i can look out for them.
> 

That was just a gut feeling, not to be taken too seriously.

uint32_t *p = some_void_pointer;
/../
rte_bit_set32(p, 17);

A code section like this is redundant in the way the type (or at least 
type size) is coded both into the function name, and the pointer type. 
The use of rte_set_bit() will eliminate this, which is good (DRY), and 
bad, because now the type isn't "double-checked".

As you can see, it's a pretty weak argument.

> i (perhaps naively) have liked generic functions for their selection of
> the "correct" type and for _Generic if no leg/case exists compiler
> error (as opposed to e.g. silent truncation).
> 
>>
>> Also, _Generic is new for DPDK, so who knows what issues it might
>> cause with old compilers.
> 
> i was thinking about this overnight, it's supposed to be standard C11
> and my use on various compilers showed no problem but I can't recall if
> i did any evaluation when consuming as a part of a C++ translation unit
> so there could be problems.
> 

It would be unfortunate if DPDK was prohibited from using _Generic.

>>
>> Thanks.
>>
>>> Acked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
>>>
>>>>   lib/eal/include/rte_bitops.h | 81 ++++++++++++++++++++++++++++++++++++
>>>>   1 file changed, 81 insertions(+)
>>>>
>>>> diff --git a/lib/eal/include/rte_bitops.h b/lib/eal/include/rte_bitops.h
>>>> index 9a368724d5..afd0f11033 100644
>>>> --- a/lib/eal/include/rte_bitops.h
>>>> +++ b/lib/eal/include/rte_bitops.h
>>>> @@ -107,6 +107,87 @@ extern "C" {
>>>>   #define RTE_FIELD_GET64(mask, reg) \
>>>>   		((typeof(mask))(((reg) & (mask)) >> rte_ctz64(mask)))
>>>> +/**
>>>> + * Test bit in word.
>>>> + *
>>>> + * Generic selection macro to test the value of a bit in a 32-bit or
>>>> + * 64-bit word. The type of operation depends on the type of the @c
>>>> + * addr parameter.
>>>> + *
>>>> + * This macro does not give any guarantees in regards to memory
>>>> + * ordering or atomicity.
>>>> + *
>>>> + * @param addr
>>>> + *   A pointer to the word to modify.
>>>> + * @param nr
>>>> + *   The index of the bit.
>>>> + */
>>>> +#define rte_bit_test(addr, nr)				\
>>>> +	_Generic((addr),				\
>>>> +		 uint32_t *: rte_bit_test32,		\
>>>> +		 uint64_t *: rte_bit_test64)(addr, nr)
>>>> +
>>>> +/**
>>>> + * Set bit in word.
>>>> + *
>>>> + * Generic selection macro to set a bit in a 32-bit or 64-bit
>>>> + * word. The type of operation depends on the type of the @c addr
>>>> + * parameter.
>>>> + *
>>>> + * This macro does not give any guarantees in regards to memory
>>>> + * ordering or atomicity.
>>>> + *
>>>> + * @param addr
>>>> + *   A pointer to the word to modify.
>>>> + * @param nr
>>>> + *   The index of the bit.
>>>> + */
>>>> +#define rte_bit_set(addr, nr)				\
>>>> +	_Generic((addr),				\
>>>> +		 uint32_t *: rte_bit_set32,		\
>>>> +		 uint64_t *: rte_bit_set64)(addr, nr)
>>>> +
>>>> +/**
>>>> + * Clear bit in word.
>>>> + *
>>>> + * Generic selection macro to clear a bit in a 32-bit or 64-bit
>>>> + * word. The type of operation depends on the type of the @c addr
>>>> + * parameter.
>>>> + *
>>>> + * This macro does not give any guarantees in regards to memory
>>>> + * ordering or atomicity.
>>>> + *
>>>> + * @param addr
>>>> + *   A pointer to the word to modify.
>>>> + * @param nr
>>>> + *   The index of the bit.
>>>> + */
>>>> +#define rte_bit_clear(addr, nr)			\
>>>> +	_Generic((addr),				\
>>>> +		 uint32_t *: rte_bit_clear32,		\
>>>> +		 uint64_t *: rte_bit_clear64)(addr, nr)
>>>> +
>>>> +/**
>>>> + * Assign a value to a bit in word.
>>>> + *
>>>> + * Generic selection macro to assign a value to a bit in a 32-bit or 64-bit
>>>> + * word. The type of operation depends on the type of the @c addr parameter.
>>>> + *
>>>> + * This macro does not give any guarantees in regards to memory
>>>> + * ordering or atomicity.
>>>> + *
>>>> + * @param addr
>>>> + *   A pointer to the word to modify.
>>>> + * @param nr
>>>> + *   The index of the bit.
>>>> + * @param value
>>>> + *   The new value of the bit - true for '1', or false for '0'.
>>>> + */
>>>> +#define rte_bit_assign(addr, nr, value)			\
>>>> +	_Generic((addr),				\
>>>> +		 uint32_t *: rte_bit_assign32,			\
>>>> +		 uint64_t *: rte_bit_assign64)(addr, nr, value)
>>>> +
>>>>   /**
>>>>    * Test if a particular bit in a 32-bit word is set.
>>>>    *
>>>> -- 
>>>> 2.34.1

  reply	other threads:[~2024-03-05 20:02 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
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 [this message]
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=79dbc7d5-a519-4349-9652-6c458e11b0c0@lysator.liu.se \
    --to=hofors@lysator.liu.se \
    --cc=dev@dpdk.org \
    --cc=heng.wang@ericsson.com \
    --cc=mattias.ronnblom@ericsson.com \
    --cc=roretzla@linux.microsoft.com \
    /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).