On 14 May 2015 at 07:29, Maxim Uvarov <maxim.uva...@linaro.org> wrote:

> On 05/14/2015 13:45, Mike Holmes wrote:
>
>>
>>
>> On 14 May 2015 at 06:31, Maxim Uvarov <maxim.uva...@linaro.org <mailto:
>> maxim.uva...@linaro.org>> wrote:
>>
>>     On 05/14/2015 01:17, Mike Holmes wrote:
>>
>>
>>
>>         On 13 May 2015 at 05:03, Maxim Uvarov <maxim.uva...@linaro.org
>>         <mailto:maxim.uva...@linaro.org>
>>         <mailto:maxim.uva...@linaro.org
>>         <mailto:maxim.uva...@linaro.org>>> wrote:
>>
>>             On 05/12/2015 20:52, Mike Holmes wrote:
>>
>>                 I dont think you can implement a mandatory ODP API
>>         based on an
>>                 optional helper api.
>>
>>                 The ring implementation should be inside the linux-generic
>>                 implementation if you want to use it, other
>>         implementations
>>                 can copy it as they do now from linux-generic for other
>>                 features such as timers.
>>
>>                 Helpers need to be supporting the tests, examples and
>>                 applications and not the implementations.
>>
>>                 We have been walking a fuzzy line previously but I
>>         think the
>>                 complexities and coupling get unwound when
>>         linux-generic does
>>                 not rely on or compile in any helper code.
>>
>>                 Mike
>>
>>
>>             I think it depends if someone else uses odp ring from
>>         helper or
>>             not. Ring itself might be useful as middle buffer between
>>             processes. Also I just added shm flag which is in our api
>>         to have
>>             smaller changes. I think later we can decided where it's
>>         better to
>>             move odp ring.
>>
>>
>>         I dont agree that we can decide later.  The test
>>         infrastructure that we decided to punt on to get 1.0 done is
>>         proving very difficult to fix now that it has established a
>>         pattern of use that is coupled to the platform is awkward
>>         ways, lets not do the same with helpers.
>>
>>         Basing an implementation on optional code is not very robust,
>>         the makefile looks wrong with ../../ (below)
>>
>>     we have the same for linux.c and it works. That looks good for me.
>>     Don't know why you don't like ../../
>>
>>
>> I object strongly to linux.c why is that built into the implementation
>> when it is not an ODP API and is not in any way used by the implementation
>> of linux-genric? It is optional support for tests, it makes no sense - this
>> is exactly what I am trying to undo.
>>
>>  Ok, now looks like I  understand. Looks like we wrongly compiled linux.c
> inside linux-generic implementation. linux-generic does not use any
> helper/linux.c functions. So that tests have to compile that helper on
> their build.
> Send a quick patch for that.


It is not so quick, but yes we need to decouple it. We need to make a lib
that the ODP tests can link to,  there is already a patch floating to
actually test the helpers themselves if it were its own lib.



>
>
>
>>         , we have made helpers not optional in this way. We compile in
>>         the now not optional ring.c and we dont test it or use it in
>>         any way at all!  that can't be correct.
>>
>>
>>     We compile it and test:
>>     ./test/api_test/odp_ring_test.c
>>
>>
>>         __LIB__libodp_la_SOURCES = \
>>         >------->------->-------   odp_barrier.c \
>>         >------->------->-------   odp_buffer.c \
>>         >------->------->------- odp_classification.c \
>>         >------->------->-------   odp_cpumask.c \
>>         >------->------->-------   odp_crypto.c \
>>         >------->------->-------   odp_errno.c \
>>         >------->------->-------   odp_event.c \
>>         >------->------->-------   odp_init.c \
>>         >------->------->-------   odp_impl.c \
>>         >------->------->------- ../../helper/linux.c \
>>         >------->------->-------   odp_packet.c \
>>         >------->------->------- odp_packet_flags.c \
>>         >------->------->-------   odp_packet_io.c \
>>         >------->------->------- odp_packet_socket.c \
>>         >------->------->-------   odp_pool.c \
>>         >------->------->-------   odp_queue.c \
>>         >------->------->------- ../../helper/ring.c \
>>
>>         To share implementations, thus far KS2 and DPDK have their
>>         make file include the src from linux-generic as appropriate,
>>         so they will reuse ring & IPC from there and all re-use is
>>         then uniformly handled.
>>
>>
>>     Both KS2 and DPDK do not need odph_ring and linux-generic IPC for
>>     IPC support. IPC there will be implemented in different way. But
>>     if needed they can use odph_ring for something else
>>
>>
>> Sure, I have no objection to reusing the code,  but I dont agree to doing
>> so by including it from the helper directory.
>>
>
> I do not see nothing bad in including them.


 I think I do - see my thought below.


> But that include has to be reasonable. In case of IPC it is reasonable
> (ring.c). In case of linux.c it's not reasonable due to implementation even
> do not use that functions.


I could agree on the dependency if helpers are a separate lib and
linux-genric requires it for its IPC implementation but not when the code
is directly included.

I believe we need a clear distinction between helpers and implementation
code so that we promote helpers being a reusable support library and not an
ad hock source code sharing mechanism.

If you build an app that uses rings and run it on platform x that does not
build in ring.c for its IPC, then you have to add it at compile time. Now
you move to linux-generic and it is built in, do you add compiler flags to
compile it in optionally for the app when changing platforms ? You can hope
the linker gets the version you want, but what happens if the app is built
with one version of ring.c and the implementation used another - you may
get the wrong one, I think it complicates platform independence.

This problem will only get worse as more helpers are added to increase the
level of abstraction ODP can offer. Helpers need to be a library, and I
believe linux-generic should not depend on including the code directly in
its implementation, but it could depend on that lib.



>
>
>
>>
>>         Let start by being clear what the helpers are before we start
>>         coupling them even more tightly with IPC.
>>
>>
>>     ok.
>>
>>         Previously stated and presumed still true is this description
>>         "Helpers are there to help tests, examples and applications,
>>         not implementations. Helpers are optional for applications"
>>    we need to establish this as fact before deciding much more.
>>
>>         If helpers are not  separate support code from the
>>         implementation then we need to state that all implementations
>>         should compile them all in so that customers of vendor
>>         implementations can run the validation tests.
>>
>>
>>     I think that implementation should not be limitation here. If any
>>     implementation wish to use helper it's free to do it.
>>
>>     I would say that "Helpers are functions which are optional for
>>     applications. That function is very often used in ODP applications
>>     but they are not separate ODP API.
>>
>> If they are not separate why are they not in the ODP API ? We say very
>> clearly that there are no optional odp apis yet here we are coding exactly
>> that so lets add them to the API or not.
>>
> Because they are optional and you can create application without that
> functions. I.e. use systems one or create your custom function. Most of
> that function can not be HW offloaded so no need
> to put them to separate API.
>
>
>
>      These functions are not hided inside implementation so that apps
>>     can use them directly. "
>>
>>
>>     Maxim.
>>
>>         Mike
>>
>>
>>             Maxim.
>>
>>
>>                 On 8 May 2015 at 05:57, Maxim Uvarov
>>         <maxim.uva...@linaro.org <mailto:maxim.uva...@linaro.org>
>>                 <mailto:maxim.uva...@linaro.org
>>         <mailto:maxim.uva...@linaro.org>>
>>                 <mailto:maxim.uva...@linaro.org
>>         <mailto:maxim.uva...@linaro.org>
>>                 <mailto:maxim.uva...@linaro.org
>>         <mailto:maxim.uva...@linaro.org>>>> wrote:
>>
>>                     Signed-off-by: Maxim Uvarov
>>         <maxim.uva...@linaro.org <mailto:maxim.uva...@linaro.org>
>>                 <mailto:maxim.uva...@linaro.org
>>         <mailto:maxim.uva...@linaro.org>>
>>                     <mailto:maxim.uva...@linaro.org
>>         <mailto:maxim.uva...@linaro.org>
>>
>>                 <mailto:maxim.uva...@linaro.org
>>         <mailto:maxim.uva...@linaro.org>>>>
>>
>>                     ---
>>                      helper/include/odp/helper/ring.h | 2 ++
>>                      helper/ring.c                    | 9 ++++++++-
>>                      2 files changed, 10 insertions(+), 1 deletion(-)
>>
>>                     diff --git a/helper/include/odp/helper/ring.h
>>                     b/helper/include/odp/helper/ring.h
>>                     index 65c32ad..5e640a7 100644
>>                     --- a/helper/include/odp/helper/ring.h
>>                     +++ b/helper/include/odp/helper/ring.h
>>                     @@ -158,6 +158,8 @@ typedef struct odph_ring {
>>
>>                      #define ODPH_RING_F_SP_ENQ 0x0001 /* The default
>>         enqueue is
>>                     "single-producer".*/
>>                      #define ODPH_RING_F_SC_DEQ 0x0002 /* The default
>>         dequeue is
>>                     "single-consumer".*/
>>                     +#define ODPH_RING_SHM_PROC 0x0004 /* If set -
>>         ring is visible
>>                     from different
>>                     +  processes. Default is
>>                 thread
>>                     visible.     */
>>                      #define ODPH_RING_QUOT_EXCEED (1 << 31) /* Quota
>>         exceed for
>>                     burst ops */
>>                      #define ODPH_RING_SZ_MASK (unsigned)(0x0fffffff)
>>         /* Ring size
>>                     mask */
>>
>>                     diff --git a/helper/ring.c b/helper/ring.c
>>                     index a24a020..0927a6c 100644
>>                     --- a/helper/ring.c
>>                     +++ b/helper/ring.c
>>                     @@ -159,8 +159,14 @@ odph_ring_create(const char
>>         *name,
>>                 unsigned
>>                     count, unsigned flags)
>>                             char ring_name[ODPH_RING_NAMESIZE];
>>                             odph_ring_t *r;
>>                             size_t ring_size;
>>                     +       uint32_t shm_flag;
>>                             odp_shm_t shm;
>>
>>                     +       if (flags & ODPH_RING_SHM_PROC)
>>                     +               shm_flag = ODP_SHM_PROC;
>>                     +       else
>>                     +               shm_flag = 0;
>>                     +
>>                             /* count must be a power of 2 */
>>                             if (!ODP_VAL_IS_POWER_2(count) || (count >
>>                     ODPH_RING_SZ_MASK)) {
>>                                     ODP_ERR("Requested size is
>>         invalid, must
>>                 be power
>>                     of 2, and  do not exceed the size limit %u\n",
>>                     @@ -173,7 +179,8 @@ odph_ring_create(const char *name,
>>                 unsigned
>>                     count, unsigned flags)
>>
>>         odp_rwlock_write_lock(&qlock);
>>                             /* reserve a memory zone for this ring.*/
>>                     -       shm = odp_shm_reserve(ring_name, ring_size,
>>                     ODP_CACHE_LINE_SIZE, 0);
>>                     +       shm = odp_shm_reserve(ring_name, ring_size,
>>                     ODP_CACHE_LINE_SIZE,
>>                     +                             shm_flag);
>>
>>                             r = odp_shm_addr(shm);
>>
>>                     --
>>                     1.9.1
>>
>>         _______________________________________________
>>                     lng-odp mailing list
>>         lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
>>         <mailto:lng-odp@lists.linaro.org
>>         <mailto:lng-odp@lists.linaro.org>>
>>                 <mailto:lng-odp@lists.linaro.org
>>         <mailto:lng-odp@lists.linaro.org>
>>                 <mailto:lng-odp@lists.linaro.org
>>         <mailto:lng-odp@lists.linaro.org>>>
>>         https://lists.linaro.org/mailman/listinfo/lng-odp
>>
>>
>>
>>
>>                 --         Mike Holmes
>>                 Technical Manager - Linaro Networking Group
>>                 Linaro.org <http://www.linaro.org/>***│ *Open source
>>         software
>>                 for ARM SoCs
>>
>>
>>
>>
>>
>>         --         Mike Holmes
>>         Technical Manager - Linaro Networking Group
>>         Linaro.org <http://www.linaro.org/>***│ *Open source software
>>         for ARM SoCs
>>
>>
>>
>>
>>
>> --
>> Mike Holmes
>> Technical Manager - Linaro Networking Group
>> Linaro.org <http://www.linaro.org/>***│ *Open source software for ARM
>> SoCs
>>
>>
>


-- 
Mike Holmes
Technical Manager - Linaro Networking Group
Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to