On 12/25/2014 12:15 PM, Taras Kondratiuk wrote:
There is no need to make it so complex. At least until 'static'
before 'not static' functions is forbidden by some post-C11 standard).

Me and Anders are making another try to separate clean API. In a
previous try common (clean) API headers were public. They had
<plat/...> include hooks to pull platform specific definitions. That
appeared to be not flexible enough. Current approach is to make common
API headers private in a sense that application won't include them
directly, but instead implementation will provide public headers and
embedded clean API headers there.

Please check [1] for an example of this approach tried for a few
headers (atomic, byteorder). It seems to be working fine for now. I'm
reworking Keystone implementation based on this approach.

[1] 
https://git.linaro.org/people/taras.kondratiuk/odp.git/shortlog/refs/heads/api/change_namespace

I see from your patch you are doing:

rename from platform/linux-generic/include/api/odp/buffer.h
rename to include/api/odp/buffer.h

"api" looks like is not needed and it can be simple include/buffer.h


btw,  what should I do with thread patch? Should I send updated version?

Maxim.


On 12/24/2014 05:56 PM, Bill Fischofer wrote:
Getting the ODP API files out of platform/include/api is the first
step.  But based on earlier attempts to deal with inlining Taras kept
running into issues because GCC insists that functions to be inlined
must have inline in their forward declarations.  There's no simple way
to do that without a lot of macro ugliness, but I suspect autotools
could help with that.

Each ODP API specified in a common header may need to have a
platform-specific inline specification attached to it, depending on what
the implementation needs. If this were an all-or-nothing thing we could
do that with a simple macro that gets set in odp_platform_types.h (or a
similar file).  Call it ODP_API and it's either set to null or to
'static inline'.

Then the common ODP API files would say:

ODP_API <rest of function prototype>

for example, instead of today saying

void *odp_buffer_addr(odp_buffer_t buf);

the canonical form would be written as

ODP_API void *odp_buffer_addr(odp_buffer_t buf);

and we'd get the needed static inline (or not) depending on how the
implementation is written.  But it's not that simple because each API is
independently inlineable, so a single macro won't do.  We could have a
separate macro for each API, but that gets unwieldy very quickly.

Instead, the API file could contain some common symbols that get
macro-expanded based on ./configure options so that what gets generated
into platform/include/api is what's needed for that platform/arch/etc.

This might also be a way to easily capture platform-specific doxygen
since if the API files are being custom generated then they can have
specific documentation attached to them as well.  That might be a
cleaner way of addressing Petri's earlier concern about odp_config.h
containing linux-generic stuff mixed in with general ODP documentation.

On Wed, Dec 24, 2014 at 9:28 AM, Mike Holmes <[email protected]
<mailto:[email protected]>> wrote:



     On 24 December 2014 at 10:05, Bill Fischofer
     <[email protected] <mailto:[email protected]>> wrote:

         I suspect the long-term answer will be to use the autotools to
         construct the actual include hierarchy (and possibly the files
         themelves) needed for a given --with-platform specification.


     Let me check I have the same terminology in my head - we should have
     this defined in the arch doc but I did not look.
     platform = a physical board with interfaces etc and a core of some
     architecture as a complete solution
     arch = a cpu core for example octeon, arm, x86

     In this case I then see a need to pick up arch independently
     from --with-platform so that the optimizations can be reused by all
     platforms with that architecture core. If we dont I would see a need
     for
     platform/linux-x86-generic
     platform/linux-arm-generic
     platform/linux-octeon-generic
         That would mean the canonical ODP API files may need to be
         meta-files that are used as input to ./configure to generate the
         actual ones used.


     If the work Taras and Anders are doing to clean out the API and move
     it back to the root succeeds, and it looks good to me, then it opens
     the door to some more wriggle room in solving this issue I think.
     But I could see the configure step helping take a single API
     definition and attaching it to the required optimizations as a
     solution if it cannot be done within C / GCC



         On Wed, Dec 24, 2014 at 9:03 AM, Bill Fischofer
         <[email protected] <mailto:[email protected]>>
         wrote:

             That makes sense.  The only problem is GCC's problems with
             forward declarations and inlining.  IMO a design issue with
             the compiler, but it is what it is.  But we do need a
             general solution to this problem in 2015 since proper
             inlining support will be critical for production-grade
             implementations.

             On Wed, Dec 24, 2014 at 8:59 AM, Mike Holmes
             <[email protected] <mailto:[email protected]>> wrote:



                 On 24 December 2014 at 06:19, Maxim Uvarov
                 <[email protected]
                 <mailto:[email protected]>> wrote:

                     On 12/23/2014 10:40 PM, Mike Holmes wrote:



                         On 23 December 2014 at 13:49, Bill Fischofer
                         <[email protected]
                         <mailto:[email protected]>
                         <mailto:bill.fischofer@linaro.__org
                         <mailto:[email protected]>>> wrote:

                             That's good to know and certainly the code
                         is cleaner that way.  I
                             think we should adopt the practice that any
                         architecture-specific
                             changes to linux-generic code (adds,
                         updates, or removals) must
                             either originate from or have a Reviewed-by
                         a representative of
                             that architecture (in this case, Bala).
                         That way there's no
                             confusion as to whether the known experts
                         agree with the change,
                             since these sort of things can have subtle
                         implications that are
                             not obvious to the layman.


                         I think linux-generic should be devoid of any
                         per core optimizations in its default state.
                         There could be in an arch directory and it would
                         be supported as you say Bill by someone who will
                         care for that that variant, this also avoids
                         filling linux-generic with a possibly large list
                         of preprocessor flags that we can't test.

                         In this case we don't have public access to the
                         octeon to even know if this code works so
                         separating or deletion feels right to me,
                         although Cavium are adding their board in this case.

                     To have optimizations we should understand which per
                     arch optimization we need. I see that if newer gcc
                     supports good optimizations then we need to use that
                     gcc. Most of people use Open Embedded and Linaro gcc
                     which is almost latest version. So if there is no
                     optimization in standard environment (gcc, kernel,
                     libc) then arch implementation should go to platform
                     specific git variant. If it's covered by standard
                     environment then we simple updating minimal version
                     requirement for required component.


                 Lets take an example ODP API file

                 static inline void odp_sync_stores(void)
                 {
                 #if defined __x86_64__ || defined __i386__

                 >-------__asm__  __volatile__ ("sfence\n" : : : "memory");

                 #elif defined(__arm__)
                 #if __ARM_ARCH == 6
                 >-------__asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \
                 >------->------->-------: : "r" (0) : "memory");
                 #elif __ARM_ARCH >= 7 || defined __aarch64__

                 >-------__asm__ __volatile__ ("dmb st" : : : "memory");
                 #else
                 >-------__asm__ __volatile__ ("" : : : "memory");
                 #endif

                 #elif defined __OCTEON__

                 >-------__asm__  __volatile__ ("syncws\n" : : : "memory");

                 #else
                 >-------__sync_synchronize();
                 #endif


                 How do we accommodate this without resorting to
                 architecture specific processor flags / assembly?

                 I would prefer to
                 see platform/linux-generic/include/api/odp_sync.h changed to

                 platform/linux-generic/include/api/x86/odp_sync.h
                 platform/linux-generic/include/api/arm/odp_sync.h
                 platform/linux-generic/include/api/octeon/odp_sync.h

                 This assumes that there is currently no pure c code that
                 can be used that is acceptable on all three platforms.

                 Or since linux-generic is not a performance platform but
                 rather a reference whenever we need to make a trade off
                 between simplicity and performance, we alter this to be
                 a regular function and move to:-

                 platform/linux-generic/include/api/odp_sync.h <- now a
                 pure forward declaration of the API with doxygen
                 documentation
                 and implementations correctly broken down by arch

                 arch/x86/odp_sync.h
                 arch/arm/odp_sync.h
                 arch/octeon/odp_sync.h

                     Maxim.



                             On Tue, Dec 23, 2014 at 12:38 PM, Ola Liljedahl
                             <[email protected]
                         <mailto:[email protected]>
                         <mailto:ola.liljedahl@linaro.__org
                         <mailto:[email protected]>>> wrote:

                                 I had some discussions with Bala and we
                         think the GCC
                                 generates the
                                 appropriate code for OCTEON so there
                         should be no need for any
                                 OCTEON-specific inline assembler in
                         odp_atomic.h. I just
                                 didn't want
                                 to remove this piece of code when I
                         redesigned the atomic support
                                 because I didn't understand why there is
                         a SYNCW instruction
                                 *before*
                                 the load. Load-acquire type of loads may
                         need sync or barrier
                                 instructions but they come after the
                         load, not before.

                                 I think we should trust GCC to generate
                         better code for OCTEON
                                 than us
                                 mere humans, at least until proven
                         wrong. So please remove this
                                 OCTEON-specific snippet.

                                 -- Ola


                                 On 23 December 2014 at 18:01, Mike Holmes
                                 <[email protected]
                         <mailto:[email protected]>
                         <mailto:[email protected]
                         <mailto:[email protected]>__>> wrote:
                                 >
                                 >
                                 > On 23 December 2014 at 11:15, Taras
                         Kondratiuk
                                 <[email protected]
                         <mailto:[email protected]>
                         <mailto:taras.kondratiuk@__linaro.org
                         <mailto:[email protected]>>>

                                 > wrote:
                                 >>
                                 >> On 12/23/2014 05:28 PM, Mike Holmes
                         wrote:
                                 >> > how will this work, Octeon does not
                         care about
                                  __atomic_fetch_add(&v,
                                 >> > 1, __ATOMIC_RELAXED); and yet you
                         will fail configure I
                                 assume
                                 >> >
                                 >> > static inline uint32_t
odp_atomic_fetch_inc_u32(odp___atomic_u32_t *atom)
                                 >> > {
                                 >> > #if defined __OCTEON__
                                 >> >>-------uint32_t ret;
                                 >> >>-------__asm__ __volatile__ ("syncws");
                                 >> >>-------__asm__ __volatile__ ("lai
                         %0,(%2)" : "=r" (ret),
                                 "+m" (atom) :
                                 >> >>------->------->------- "r" (atom));
                                 >> >>-------return ret;
                                 >> > #else
                                 >> >>-------return
                         __atomic_fetch_add(&atom->v, 1,
                                 __ATOMIC_RELAXED);
                                 >> > #endif
                                 >> > }
                                 >>
                                 >> Linux-generic shouldn't have arch
                         specific parts, because it is
                                 >> *generic*. Instead it can fall back
                         to strong __sync
                                 functions if
                                 >> __atomic are not available.
                                 >>
                                 >
                                 > Linux kernel is generic but has core
                         specifics - is this not
                                 the same ?
                                 >
                                 > What about these cases ?
                                 >
                                 >
                         platform/linux-generic/odp___system_info.c:static int
                                 cpuinfo_octeon(FILE
                                 > *file, odp_system_info_t *sysinfo)
                                 >
                         platform/linux-generic/odp___system_info.c:
                         .cpu_arch_str =
                                 "octeon",
                                 >
                         platform/linux-generic/odp___system_info.c:
                         .cpuinfo_parser =
                                 > cpuinfo_octeon
                                 >
                         platform/linux-generic/__include/api/odp_align.h:#if
                         defined
                                 __x86_64__ ||
                                 > defined __i386__
                                 >
                         platform/linux-generic/__include/api/odp_sync.h:#if
                         defined
                                 __x86_64__ ||
                                 > defined __i386__
                                 >
                         
platform/linux-generic/__include/odp_spin_internal.h:#__if
                                 defined __x86_64__ ||
                                 > defined __i386__
                                 >
                         platform/linux-generic/odp___system_info.c:#if
                         defined
                                 __x86_64__ || defined
                                 > __i386__ || defined __OCTEON__ || \
                                 >
                         platform/linux-generic/odp___system_info.c:#if
                         defined
                                 __x86_64__ || defined
                                 > __i386__
                                 >
                         platform/linux-generic/odp___system_info.c:static int
                                 cpuinfo_x86(FILE *file,
                                 > odp_system_info_t *sysinfo)
                                 >
                         platform/linux-generic/odp___system_info.c:
                         #if defined
                                 __x86_64__ ||
                                 > defined __i386__
                                 >
                         platform/linux-generic/odp___system_info.c:
                         .cpu_arch_str =
                                 "x86",
                                 >
                         platform/linux-generic/odp___system_info.c:
                         .cpuinfo_parser =
                                 > cpuinfo_x86
                                 >
                         platform/linux-generic/odp___system_info.c:#if
                         defined
                                 __x86_64__ || defined
                                 > __i386__ || defined __OCTEON__ || \
                                 >
                         platform/linux-generic/odp___time.c:#if defined
                         __x86_64__ ||
                                 defined __i386__
                                 >
                         platform/linux-generic/__include/api/odp_align.h:#elif
                         defined
                                 __arm__ ||
                                 > defined __aarch64__
                                 >
                         platform/linux-generic/__include/api/odp_sync.h:#elif
                                 defined(__arm__)
                                 >
                         
platform/linux-generic/__include/odp_spin_internal.h:#__elif
                                 defined __arm__
                                 >
                         platform/linux-generic/odp___system_info.c:#elif
                         defined
                                 __arm__ || defined
                                 > __aarch64__
                                 >
                         platform/linux-generic/odp___system_info.c:static int
                                 cpuinfo_arm(FILE *file
                                 > ODP_UNUSED,
                                 >
                         platform/linux-generic/odp___system_info.c:
                         #elif defined
                                 __arm__ ||
                                 > defined __aarch64__
                                 >
                         platform/linux-generic/odp___system_info.c:
                         .cpu_arch_str =
                                 "arm",
                                 >
                         platform/linux-generic/odp___system_info.c:
                         .cpuinfo_parser =
                                 > cpuinfo_arm
                                 >
                                 >
                                 >>
                                 >>
                                 >> Taras Kondratiuk
                                 >
                                 >
                                 >
                                 >
                                 > --
                                 > Mike Holmes
                                 > Linaro  Sr Technical Manager
                                 > LNG - ODP

_________________________________________________
                                 lng-odp mailing list
                                 [email protected]
                         <mailto:[email protected]>
                         <mailto:[email protected].__org
                         <mailto:[email protected]>>
http://lists.linaro.org/__mailman/listinfo/lng-odp
                         <http://lists.linaro.org/mailman/listinfo/lng-odp>




                         --
                         *Mike Holmes*
                         Linaro  Sr Technical Manager
                         LNG - ODP


                         _________________________________________________
                         lng-odp mailing list
                         [email protected]
                         <mailto:[email protected]>
                         http://lists.linaro.org/__mailman/listinfo/lng-odp
                         <http://lists.linaro.org/mailman/listinfo/lng-odp>



                     _________________________________________________
                     lng-odp mailing list
                     [email protected]
                     <mailto:[email protected]>
                     http://lists.linaro.org/__mailman/listinfo/lng-odp
                     <http://lists.linaro.org/mailman/listinfo/lng-odp>




                 --
                 *Mike Holmes*
                 Linaro  Sr Technical Manager
                 LNG - ODP

                 _______________________________________________
                 lng-odp mailing list
                 [email protected] <mailto:[email protected]>
                 http://lists.linaro.org/mailman/listinfo/lng-odp






     --
     *Mike Holmes*
     Linaro  Sr Technical Manager
     LNG - ODP




_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp




_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to