On 19 May 2016 at 03:30, Christophe Milard <christophe.mil...@linaro.org> wrote:
> On 19 May 2016 at 06:05, Bill Fischofer <bill.fischo...@linaro.org> wrote: > > > Expand thread section to explain rationale for threads not being ODP > > objects and how this relates to addressability considerations for shared > > resources. > > > > Signed-off-by: Bill Fischofer <bill.fischo...@linaro.org> > > --- > > doc/users-guide/users-guide.adoc | 40 > > ++++++++++++++++++++++++++++++++++++---- > > 1 file changed, 36 insertions(+), 4 deletions(-) > > > > diff --git a/doc/users-guide/users-guide.adoc > > b/doc/users-guide/users-guide.adoc > > index 745b85f..fbe745f 100755 > > --- a/doc/users-guide/users-guide.adoc > > +++ b/doc/users-guide/users-guide.adoc > > @@ -288,6 +288,17 @@ _thread mask_ and _scheduler group_ that determine > > where they can run and > > the type of work that they can handle. These will be discussed in > greater > > detail later. > > > > +It is important to note that threads are not ODP objects. This is > > intentional. > > +The ODP API is designed to abstract objects and functions that are > > relevant to > > +data plane programming, and that may find accelerated implementation > > across > > +diverse platforms and architectures. It is not, however, designed to > > abstract > > +operating system objects and concepts. As a result while ODP _refers_ to > > +threads, it does not _define_ threads in terms of their creation or > > management > > +from an operating system perspective. ODP does provide _helper_ > functions > > that > > +permit Posix threads to be created and managed, however. Applications > are > > free > > +to use these helpers or to manage threads in some other manner of their > > +choosing. > > + > > === Event > > Events are what threads process to perform their work. Events can > > represent > > new work, such as the arrival of a packet that needs to be processed, or > > they > > @@ -332,6 +343,9 @@ ODP applications if desired. > > > > Shared memory is represented by handles of abstract type `odp_shm_t`. > > > > +Note that addressability of shared memory is subject to operating system > > +considerations as described in <<Addressing Scope>>. > > + > > === Buffer > > A buffer is a fixed sized block of shared storage that is used by ODP > > components and/or applications to realize their function. Buffers > contain > > @@ -587,10 +601,28 @@ in response to an `odp_queue_deq()` call to get an > > event from a queue simply > > indicates that the queue is empty. > > > > === Addressing Scope > > -Unless specifically noted in the API, all ODP resources are global to > the > > ODP > > -application, whether it runs as a single process or multiple processes. > > ODP > > -handles therefore have common meaning within an ODP application but have > > no > > -meaning outside the scope of the application. > > +ODP objects and their associated handles are intended to be global to an > > ODP > > +instance, _i.e.,_ to the thread that calls `odp_init_global()` and its > > +descendants. > > > This is saying that all ODP threads of a given ODP instance are descendant > of the ODP instantiation process. I already tried to define ODP threads > this way, but it was rejected, and the ODP instance number was added to the > API so that any thread/process could join any ODP instance. > I still get the feeling that, despite this add-on, we are still saying that > a odpthread belongs to the ODP instance it is a descendand of, rather than > the one specified in the "instance" parameter passed at odp_local_init() > time... > The only possible usage of the odp_instance parameter passed at > odp_local_init() time would then be on OSes which do not support process > hierarchy... Is any such OS known to suport ODP? > If not, I thing the odp_instance number should either be suppressed, or > clearly stated as meaningless on OS which have process hierarchy, as the > process hierarchy seems to take precedence over this parameter in all our > discussions. > I will post a patch on the glossary just stating that, see if we can at > least all agree on that little thing... > > However, because ODP does not impose a threading model, > > +responsibility for achieving this is shared with both the ODP > > implementation as > > +well as the ODP application. In the odp-linux reference implementation, > > for > > +example, threads are assumed to be Posix-style threads that all share a > > single > > > > *ODP* threads are assumed to be Posix-style threads... > This is for monarch only, right? > > +address space. As a result, all ODP handles and any addresses derived from > > +them, are globally sharable throughout the ODP instance. Other > > implementations > > +may offer the same capabilities or may use a process-based threading > > model in > > +which individual threads execute in distinct address spaces. > > > > Confused: are talking monarch or some later version? BTW is monarch the > name of the API version only or does the "monarch" name also include the > linux-generic platform example? > > > > + > > +If a platform uses process that follow a Unix-style `fork()` model of > > process > > +creation, then for best portability ODP applications should be designed > so > > +that any ODP resource creation (_e.g.,_ pools, shared memory objects, > > pktios) > > > > "any ODP resource": That includes everything, e.g. atomics, barrier, > timers... as well...right...? > > +are created during initialization by the thread that creates the ODP > > instance > > +by calling `odp_init_global()` _before_ any other threads are > > +created/launched. This will allow any common objects to be visible in > > forked > > +processes. > > > > well... yes... But the interesting point is really not mentioned: > > Either we say: > *ALL* odp objects *have to* be created between opd_init_global() and any > odp thread creation. That is clear but very restrictive (it would > includes everything: for instance, all atomics would have to be known in > advance. same for timers or barriers... while it is maybe clear for pools, > it is maybe harder to enforce this for these small objects). But at least > the definition would be clear... > > or we say > SOME odp objects *have to* be created between opd_init_global() and any > odp thread creation, in which case, we have to come with a clear list of > which ones we talk about and a precise description of how objects which are > not on that list behave, especially when created after fork. This > description could of course refer to the OS behavior, but should clearly > state what this OS rule applies to (e.g. a how buffer or packet alloc > performed after fork() behaves -I guess it depends on when the pool was > allocated...). > > Saying that "most" ODP objects "would possibly" be defined at init time > does not really tell much... > > + > > +If a platform uses some other process addressing model, then refer to > that > > +platform for recommendations to achieve application-desired shared > > +addressability. > > > > === Resources and Names > > Many ODP resource objects, such as pools and queues, support an > > -- > > 2.7.4 > > > > > Thank you for trying, Bill. We need to succeed. I'll keep trying with you. > > A french writter, Boileau, wrote " Ce qui se conçoit bien, s'énonce > clairement". I know you speak some french... I guess this guy would laugh > at us right now :-) > What is conceived well is expressed clearly ? > > Christophe > > _______________________________________________ > > lng-odp mailing list > > lng-odp@lists.linaro.org > > https://lists.linaro.org/mailman/listinfo/lng-odp > > > _______________________________________________ > lng-odp mailing list > 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 "Work should be fun and collaborative, the rest follows" _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp