From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0D99B41C8D; Tue, 14 Feb 2023 00:19:02 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A53E340E2D; Tue, 14 Feb 2023 00:19:01 +0100 (CET) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id AE34940A7D; Tue, 14 Feb 2023 00:19:00 +0100 (CET) Received: by linux.microsoft.com (Postfix, from userid 1086) id CD37020D4DA3; Mon, 13 Feb 2023 15:18:59 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com CD37020D4DA3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1676330339; bh=veQvXdajH9vfnoV185287yNVeMR+Pz2TyNdHndSNFrM=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=jAW8cdGaXLkCxGvEdXBHamDRpAif+3kNizRcSHWRFtxozFR9Xd4+L8o23Xxk80u6J +H9UKGCPG6QI31JxCer+JEIEAc7bZ8uaKv/XcsNwN0IbKh6maRchEQ1F0FirG0x6wB UmqItzsgWetH+p2wRzYmQs1eNRy9gD9V9fDXgAgI= Date: Mon, 13 Feb 2023 15:18:59 -0800 From: Tyler Retzlaff To: Honnappa Nagarahalli Cc: Morten =?iso-8859-1?Q?Br=F8rup?= , "thomas@monjalon.net" , "dev@dpdk.org" , "bruce.richardson@intel.com" , "david.marchand@redhat.com" , "jerinj@marvell.com" , "konstantin.ananyev@huawei.com" , "ferruh.yigit@amd.com" , nd , "techboard@dpdk.org" Subject: Re: [PATCH] eal: introduce atomics abstraction Message-ID: <20230213231859.GB24482@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net> References: <20230201214111.GA30564@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net> <20230208012040.GA22219@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net> <98CBD80474FA8B44BF855DF32C47DC35D8770D@smartserver.smartshare.dk> <20230208163521.GB5117@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net> <20230209173017.GA21854@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net> <20230210203013.GB25500@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org On Mon, Feb 13, 2023 at 05:04:49AM +0000, Honnappa Nagarahalli wrote: > Hi Tyler, > Few more comments inline. Let us continue to make progress, I will add this topic for Techboard discussion for 22nd Feb. > > > -----Original Message----- > > From: Tyler Retzlaff > > Sent: Friday, February 10, 2023 2:30 PM > > To: Honnappa Nagarahalli > > Cc: Morten Brørup ; thomas@monjalon.net; > > dev@dpdk.org; bruce.richardson@intel.com; david.marchand@redhat.com; > > jerinj@marvell.com; konstantin.ananyev@huawei.com; > > ferruh.yigit@amd.com; nd ; techboard@dpdk.org > > Subject: Re: [PATCH] eal: introduce atomics abstraction > > > > On Fri, Feb 10, 2023 at 05:30:00AM +0000, Honnappa Nagarahalli wrote: > > > > > > > > > > On Thu, Feb 09, 2023 at 12:16:38AM +0000, Honnappa Nagarahalli wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > For environments where stdatomics are not supported, > > > > > > > > > > > we could > > > > > > > > have a > > > > > > > > > > stdatomic.h in DPDK implementing the same APIs (we have > > > > > > > > > > to support > > > > > > > > only > > > > > > > > > > _explicit APIs). This allows the code to use stdatomics > > > > > > > > > > APIs and > > > > > > > > when we move > > > > > > > > > > to minimum supported standard C11, we just need to get > > > > > > > > > > rid of the > > > > > > > > file in DPDK > > > > > > > > > > repo. > > > > > > > > > > > > > > > > > > > > my concern with this is that if we provide a stdatomic.h > > > > > > > > > > or > > > > > > > > introduce names > > > > > > > > > > from stdatomic.h it's a violation of the C standard. > > > > > > > > > > > > > > > > > > > > references: > > > > > > > > > > * ISO/IEC 9899:2011 sections 7.1.2, 7.1.3. > > > > > > > > > > * GNU libc manual > > > > > > > > > > > > > > > > > > > > https://www.gnu.org/software/libc/manual/html_node/Reser > > > > > > > > > > ved- > > > > > > > > > > Names.html > > > > > > > > > > > > > > > > > > > > in effect the header, the names and in some instances > > > > > > > > > > namespaces > > > > > > > > introduced > > > > > > > > > > are reserved by the implementation. there are several > > > > > > > > > > reasons in > > > > > > > > the GNU libc > > > > > > > > > Wouldn't this apply only after the particular APIs were > > introduced? > > > > > > > > i.e. it should not apply if the compiler does not support stdatomics. > > > > > > > > > > > > > > > > yeah, i agree they're being a bit wishy washy in the > > > > > > > > wording, but i'm not convinced glibc folks are documenting > > > > > > > > this as permissive guidance against. > > > > > > > > > > > > > > > > > > > > > > > > > > > manual that explain the justification for these > > > > > > > > > > reservations and if > > > > > > > > if we think > > > > > > > > > > about ODR and ABI compatibility we can conceive of others. > > > > > > > > > > > > > > > > > > > > i'll also remark that the inter-mingling of names from > > > > > > > > > > the POSIX > > > > > > > > standard > > > > > > > > > > implicitly exposed as a part of the EAL public API has > > > > > > > > > > been > > > > > > > > problematic for > > > > > > > > > > portability. > > > > > > > > > These should be exposed as EAL APIs only when compiled > > > > > > > > > with a > > > > > > > > compiler that does not support stdatomics. > > > > > > > > > > > > > > > > you don't necessarily compile dpdk, the application or its > > > > > > > > other dynamically linked dependencies with the same compiler > > > > > > > > at the same time. > > > > > > > > i.e. basically the model of any dpdk-dev package on any > > > > > > > > linux distribution. > > > > > > > > > > > > > > > > if dpdk is built without real stdatomic types but the > > > > > > > > application has to interoperate with a different kit or > > > > > > > > library that does they would be forced to dance around dpdk > > > > > > > > with their own version of a shim to hide our faked up stdatomics. > > > > > > > > > > > > > > > > > > > > > > So basically, if we want a binary DPDK distribution to be > > > > > > > compatible with a > > > > > > separate application build environment, they both have to > > > > > > implement atomics the same way, i.e. agree on the ABI for atomics. > > > > > > > > > > > > > > Summing up, this leaves us with only two realistic options: > > > > > > > > > > > > > > 1. Go all in on C11 stdatomics, also requiring the application > > > > > > > build > > > > > > environment to support C11 stdatomics. > > > > > > > 2. Provide our own DPDK atomics library. > > > > > > > > > > > > > > (As mentioned by Tyler, the third option - using C11 > > > > > > > stdatomics inside DPDK, and requiring a build environment > > > > > > > without C11 stdatomics to implement a shim - is not > > > > > > > realistic!) > > > > > > > > > > > > > > I strongly want atomics to be available for use across inline > > > > > > > and compiled > > > > > > code; i.e. it must be possible for both compiled DPDK functions > > > > > > and inline functions to perform atomic transactions on the same > > atomic variable. > > > > > > > > > > > > i consider it a mandatory requirement. i don't see practically > > > > > > how we could withdraw existing use and even if we had clean way > > > > > > i don't see why we would want to. so this item is defintely > > > > > > settled if you were > > > > concerned. > > > > > I think I agree here. > > > > > > > > > > > > > > > > > > > > > > > > > So either we upgrade the DPDK build requirements to support > > > > > > > C11 (including > > > > > > the optional stdatomics), or we provide our own DPDK atomics. > > > > > > > > > > > > i think the issue of requiring a toolchain conformant to a > > > > > > specific standard is a separate matter because any adoption of > > > > > > C11 standard atomics is a potential abi break from the current use of > > intrinsics. > > > > > I am not sure why you are calling it as ABI break. Referring to > > > > > [1], I just see > > > > wrappers around intrinsics (though [2] does not use the intrinsics). > > > > > > > > > > [1] > > > > > https://github.com/gcc-mirror/gcc/blob/master/gcc/ginclude/stdatom > > > > > ic.h > > > > > [2] > > > > > https://github.com/llvm-mirror/clang/blob/master/lib/Headers/stdat > > > > > omic > > > > > .h > > > > > > > > it's a potential abi break because atomic types are not the same > > > > types as their corresponding integer types etc.. (or at least are > > > > not guaranteed to be by all implementations of c as an abstract language). > > > > > > > > ISO/IEC 9899:2011 > > > > > > > > 6.2.5 (27) > > > > Further, there is the _Atomic qualifier. The presence of the _Atomic > > > > qualifier designates an atomic type. The size, representation, and > > alignment > > > > of an atomic type need not be the same as those of the corresponding > > > > unqualified type. > > > > > > > > 7.17.6 (3) > > > > NOTE The representation of atomic integer types need not have the > > same size > > > > as their corresponding regular types. They should have the same > > > > size whenever > > > > possible, as it eases effort required to port existing code. > > > > > > > > i use the term `potential abi break' with intent because for me to > > > > assert in absolute terms i would have to evaluate the implementation > > > > of every current and potential future compilers atomic vs non-atomic > > > > types. this as i'm sure you understand is not practical, it would > > > > also defeat the purpose of moving to a standard. therefore i rely on > > > > the specification prescribed by the standard not the detail of a specific > > implementation. > > > Can we say that the platforms 'supported' by DPDK today do not have this > > problem? Any future platforms that will come to DPDK have to evaluate this. > > > > sadly i don't think we can. i believe in an earlier post i linked a bug filed on > > gcc that shows that clang / gcc were producing different layout than the > > equivalent non-atomic type. > I looked at that bug again, it is to do with structure. just to be clear, you're saying you aren't concerned because we don't have in our public api struct objects to which we apply atomic operations? if that guarantee is absolute and stays true in our public api then i am satisfied and we can drop the issue. hypothetically if we make this assumption are you proposing that all platform/toolchain combinations that support std=c11 and optional stdatomic should adopt them as default on? there are other implications to doing this, let's dig into the details at the next technical board meeting. > > > > > > > > > > > > > > > > > > > > the abstraction (whatever namespace it resides) allows the > > > > > > existing toolchain/platform combinations to maintain > > > > > > compatibility by defaulting to current non-standard intrinsics. > > > > > How about using the intrinsics (__atomic_xxx) name space for > > abstraction? > > > > This covers the GCC and Clang compilers. > > > > i haven't investigated fully but there are usages of these intrinsics that > > indicate there may be undesirable difference between clang and gcc versions. > > the hint is there seems to be conditionally compiled code under __clang__ > > when using some __atomic's. > I sent an RFC to address this [1]. I think the size specific intrinsics are not necessary. > > [1] http://patches.dpdk.org/project/dpdk/patch/20230211015622.408487-1-honnappa.nagarahalli@arm.com/ yep, looks good to me. i acked the change. thank you. > > > > > for the purpose of this discussion clang just tries to look like gcc so i don't > > regard them as being different compilers for the purpose of this discussion. > > > > > > > > > > the namespace starting with `__` is also reserved for the implementation. > > > > this is why compilers gcc/clang/msvc place name their intrinsic and > > > > builtin functions starting with __ to explicitly avoid collision > > > > with the application namespace. > > > > > Agreed. But, here we are considering '__atomic_' specifically (i.e. > > > not just '__') > > > > i don't understand the confusion __atomic is within the __ namespace that is > > reserved. > What I mean is, we are not formulating a policy/rule to allow for any name space that starts with '__'. understood, but we appear to be trying to formulate a policy allowing a name within that space which is reserved by the standard for and claimed by gcc. anyway, let's discuss further at the meeting. > > > > > let me ask this another way, what benefit do you see to trying to overlap with > > the standard namespace? the only benefit i can see is that at some point in > > the future it avoids having to perform a mechanical change to eventually > > retire the abstraction once all platform/toolchains support standard atomics. > > i.e. basically s/rte_atomic/atomic/g > > > > is there another benefit i'm missing? > The abstraction you have proposed solves the problem for the long term. The proposed abstraction stops us from thinking about moving to stdatomics. i think this is where you've got me a bit confused. i'd like to understand how it stops us thinking about moving to stdatomics. > IMO, the problem is short term. Using the __atomic_ name space does not have any practical issues with the platforms DPDK supports (unless msvc has a problem with this, more questions below). oh, sorry for not answering this previously. msvc (and as it happens clang) both use __c11_atomic_xxx as a namespace. i'm only aware of gcc and potentially compilers that try to look like gcc using __atomic_xxxx. so if you're asking if that selection would interfere with msvc, it wouldn't. i'm only concerned with mingling in a namespace that gcc has claimed. > > > > > > > > > > > > > > ISO/IEC 9899:2011 > > > > > > > > 7.1.3 (1) > > > > All identifiers that begin with an underscore and either an uppercase > > > > letter or another underscore are always reserved for any use. > > > > > > > > ... > > > > > > > > > If there is another platform that uses the same name space for > > > > > something > > > > else, I think DPDK should not be supporting that platform. > > > > > > > > that's effectively a statement excluding windows platform and all > > > > non-gcc compilers from ever supporting dpdk. > > > Apologies, I did not understand your comment on windows platform. Do > > you mean to say a compiler for windows platform uses '__atomic_xxx' name > > space to provide some other functionality (and hence it would get excluded)? > > > > i mean dpdk can never fully be supported without msvc except for statically > > linked builds which are niche and limit it too severely for many consumers to > > practically use dpdk. there are also many application developers who would > > like to integrate dpdk but can't and telling them their only choice is to re-port > > their entire application to clang isn't feasible. > > > > i can see no technical reason why we should be excluding a major compiler in > > broad use if it is capable of building dpdk. msvc arguably has some of the > > most sophisticated security features in the industry and the use of those > > features is mandated by many of the customers who might deploy dpdk > > applications on windows. > I did not mean DPDK should not support msvc (may be my sentence below was misunderstood). > Does msvc provide '__atomic_xxx' intrinsics? msvc provides stdatomic (behind stdatomic there are intrinsics) > > > > > > Clang supports these intrinsics. I am not sure about the merit of supporting > > other non-gcc compilers. May be a topic Techboard discussion. > > > > > > > > > > > > What problems do you see? > > > > > > > > i'm fairly certain at least one other compiler uses the __atomic > > > > namespace but > > > Do you mean __atomic namespace is used for some other purpose? > > > > > > > it would take me time to check, the most notable potential issue > > > > that comes to mind is if such an intrinsic with the same name is > > > > provided in a different implementation and has either regressive > > > > code generation or different semantics it would be bad because it is > > > > intrinsic you can't just hack around it with #undef __atomic to shim in a > > semantically correct version. > > > I do not think we should worry about regressive code generation problem. It > > should be fixed by that compiler. > > > Different semantics is something we need to worry about. It would be good > > to find out more about a compiler that does this. > > > > again, this is about portability it's about potential not that we can find an > > example. > > > > > > > > > > > > > how about this, is there another possible namespace you might > > > > suggest that conforms or doesn't conflict with the the rules defined > > > > in ISO/IEC 9899:2011 > > > > 7.1.3 i think if there were that would satisfy all of my concerns > > > > related to namespaces. > > > > > > > > keep in mind the point of moving to a standard is to achieve > > > > portability so if we do things that will regress us back to being > > > > dependent on an implementation we haven't succeeded. that's all i'm > > trying to guarantee here. > > > Agree. We are trying to solve a problem that is temporary. I am trying to > > keep the problem scope narrow which might help us push to adopt the > > standard sooner. > > > > i do wish we could just target the standard but unless we are willing to draw a > > line and say no more non std=c11 and also we potentially break the abi we > > are talking years. i don't think it is reasonable to block progress for years, so > > i'm offering a transitional path. it's an evolution over time that we have to > > manage. > Apologies if I am sounding like I am blocking progress. Rest assured, we will find a way. It is just about which solution we are going to pick. no problems, i really appreciate any help. > Also, is there are any information on how long before we move to C11? we need to clear all long term compatibility promises for gcc/linux platforms that don't support -std=c11 and implement stdatomic option. the last discussion was that it was years i believe. Bruce has a patch series and another thread going talking about moving to -std=c99 which is good but of course doesn't get us to std=c99. > > > > > > > > > > > > > > i feel like we are really close on this discussion, if we can just > > > > iron this issue out we can probably get going on the actual changes. > > > > > > > > thanks for the consideration. > > > > > > > > > > > > > > > > > > > > > once in place it provides an opportunity to introduce new > > > > > > toolchain/platform combinations and enables an opt-in capability > > > > > > to use stdatomics on existing toolchain/platform combinations > > > > > > subject to community discussion on how/if/when. > > > > > > > > > > > > it would be good to get more participants into the discussion so > > > > > > i'll cc techboard for some attention. i feel like the only area > > > > > > that isn't decided is to do or not do this in rte_ namespace. > > > > > > > > > > > > i'm strongly in favor of rte_ namespace after discussion, mainly > > > > > > due to to disadvantages of trying to overlap with the standard > > > > > > namespace while not providing a compatible api/abi and because > > > > > > it provides clear disambiguation of that difference in semantics > > > > > > and compatibility with > > > > the standard api. > > > > > > > > > > > > so far i've noted the following > > > > > > > > > > > > * we will not provide the non-explicit apis. > > > > > +1 > > > > > > > > > > > * we will make no attempt to support operate on struct/union atomics > > > > > > with our apis. > > > > > +1 > > > > > > > > > > > * we will mirror the standard api potentially in the rte_ namespace to > > > > > > - reference the standard api documentation. > > > > > > - assume compatible semantics (sans exceptions from first 2 points). > > > > > > > > > > > > my vote is to remove 'potentially' from the last point above for > > > > > > reasons previously discussed in postings to the mail thread. > > > > > > > > > > > > thanks all for the discussion, i'll send up a patch removing > > > > > > non-explicit apis for viewing. > > > > > > > > > > > > ty