This patch does not apply to the current repository.  Is there a revised
version available?

Thanks.

Bill

On Wed, Oct 22, 2014 at 8:47 AM, Bill Fischofer <bill.fischo...@linaro.org>
wrote:

> I had previously detailed some of the problems that arise if we remove
> segmentation support from buffers while trying to keep it as part of
> packets.  I'd still like to see a response to these questions.  Given that
> we support unsegmented buffers I don't see what the objection is here.
> Those that don't want to deal with segments need not deal with them at
> all.  That may limit the platforms they can run on, but applications will
> always choose which implementations are best suited to their needs.
>
> Bill
>
> On Wed, Oct 22, 2014 at 7:27 AM, Savolainen, Petri (NSN - FI/Espoo) <
> petri.savolai...@nsn.com> wrote:
>
>> Hi,
>>
>> In short, I think we must not bring segmentation support to the buffer
>> level "just in case" someone would need it there. Real use cases for
>> segmentation are on packet level (large packets, packet
>> fragmentation/reassembly, etc), so the feature should be implemented there.
>>
>> -Petri
>>
>> > -----Original Message-----
>> > From: ext Ciprian Barbu [mailto:ciprian.ba...@linaro.org]
>> > Sent: Wednesday, October 22, 2014 3:00 PM
>> > To: Bill Fischofer
>> > Cc: Ola Liljedahl; Savolainen, Petri (NSN - FI/Espoo); lng-
>> > o...@lists.linaro.org
>> > Subject: Re: [lng-odp] [ODP/PATCH v1] ODP Buffer Segment Support API
>> >
>> > On Wed, Oct 22, 2014 at 2:47 PM, Ciprian Barbu <
>> ciprian.ba...@linaro.org>
>> > wrote:
>> > > This thread has been cold for 5 days, so the assumption is that we can
>> > > go forward with the design right now. This patch series proposed by
>> > > Bala updates some part of the API to the final form of the Buffer
>> > > Design Document, we should have it merged if there are no more
>> > > objections. For that more people with the right expertise should have
>> > > a look at it and get the thread back on track.
>> > >
>> > > I for example have observed the following issue. All the examples
>> > > create buffer pools over shared memory, which doesn't make sense for
>> > > some platforms, linux-dpdk for example, which ignores the base_addr
>> > > argument altogether. I think we need more clarity on this subject, for
>> > > sure the creation of buffer pools will differ from platform to
>> > > platform, which migrates to the application responsibility.
>> > >
>> > > I think we should have a helper function to easily create buffer pools
>> > > without worrying too much about the difference in buffer management
>> > > between platforms, so that one can write a simple portable application
>> > > with no sweat. For the hardcore programmers the API still gives fine
>> > > control to buffer management that depending on the platform could
>> > > involve additional prerequisites, like creating a shared memory
>> > > segment to hold the buffer pool.
>> >
>> > Ok, so I had another look at the Buffer Management final design. I now
>> > see that the option of creating buffer pools from regions has been
>> > removed, so in this case things will be simpler for the applications.
>> > In other words we should really start working on the full
>> > implementation of the API because from there the problem I just stated
>> > above (having to create shared memory segments) will disappear.
>> >
>> > >
>> > > On Fri, Oct 17, 2014 at 4:33 PM, Bill Fischofer
>> > > <bill.fischo...@linaro.org> wrote:
>> > >> Let's consider the implications of removing segmentation support from
>> > >> buffers and only having that concept be part of packets.
>> > >>
>> > >> The first question that arises is what is the relationship between
>> the
>> > >> abstract types odp_packet_t and odp_buffer_t? This is important
>> because
>> > >> currently we say that packets are allocated from ODP buffer pools,
>> not
>> > from
>> > >> packet pools.  Do we need a separate odp_packet_pool_t that is used
>> for
>> > >> packets?
>> > >>
>> > >> Today, when I allocate a packet I'm allocating a single object that
>> > happens
>> > >> to be a single buffer object of type ODP_BUFFER_TYPE_PACKET.  But
>> that
>> > only
>> > >> works if the two objects have compatible semantics (including
>> > segmentation).
>> > >> If the semantics are not compatible, then an odp_packet_t may in fact
>> > be
>> > >> composed of multiple odp_buffer_t's because the packet may consist of
>> > >> multiple segments and buffers no longer recognize the concept of
>> > segments so
>> > >> a single buffer can only be a single segment.
>> > >>
>> > >> So now an odp_packet_segment_t may be an odp_buffer_t but an
>> > odp_packet_t in
>> > >> fact is some meta-object that is constructed (by whom?) from multiple
>> > >> odp_packet_segment_ts that are themselves odp_buffer_ts.  So
>> > >> odp_packet_to_buffer() no longer makes sense since there is no
>> longer a
>> > >> one-to-one correspondence between packets and buffers.  We could have
>> > an
>> > >> odp_packet_segment_to_buffer() routine instead.
>> > >>
>> > >> Next question: What about meta data?  If an odp_packet_t is a type of
>> > an
>> > >> odp_buffer_t then this is very straightforward since all buffer meta
>> > data is
>> > >> reusable as packet meta data and the packet type can just add its own
>> > >> specific meta data to this set.  But if an odp_packet_t is now a
>> > separate
>> > >> object then where does the storage for its meta data come from? If we
>> > try to
>> > >> map it into an odp_buffer_t that doesn't work since an odp_packet_t
>> may
>> > >> consist of multiple underlying odp_buffer_ts, one for each
>> > >> odp_packet_segment_t.  Is the packet meta data duplicated in each
>> > segment?
>> > >> Is the first segment of a packet special
>> (odp_packet_first_segment_t)?
>> > And
>> > >> what about user meta data, since this is of potentially variable
>> size?
>> > >>
>> > >> I submit that there are a lot of implications to this that need to be
>> > fully
>> > >> thought through, which is why I believe it's simpler to keep
>> > segmentation as
>> > >> part of buffers that (for now) only happens to be used by a
>> particular
>> > type
>> > >> of buffer, namely packets.
>> > >>
>> > >> Bill
>> > >>
>> > >> On Fri, Oct 17, 2014 at 8:05 AM, Ola Liljedahl
>> > <ola.liljed...@linaro.org>
>> > >> wrote:
>> > >>>
>> > >>> Personally I don't see any need for segmentation support in
>> buffers. I
>> > am
>> > >>> just trying to shoot down what I think is flawed reasoning.
>> > >>>
>> > >>> -- Ola#1
>> > >>>
>> > >>> On 17 October 2014 15:03, Ola Liljedahl <ola.liljed...@linaro.org>
>> > wrote:
>> > >>>>
>> > >>>> But segmentation is already needed in a current and known subclass
>> > (i.e.
>> > >>>> packets). We are not talking about some other feature which we
>> don't
>> > know if
>> > >>>> it will be needed. So this is not a case of "just in case".
>> > >>>>
>> > >>>> -- Ola#1
>> > >>>>
>> > >>>>
>> > >>>> On 17 October 2014 14:45, Ola Dahl <dahl....@gmail.com> wrote:
>> > >>>>>
>> > >>>>> Hi,
>> > >>>>>
>> > >>>>> I do not think it is wise to put features in the base class "just
>> in
>> > >>>>> case" they would be needed in some future (not yet known)
>> subclass.
>> > >>>>>
>> > >>>>> So if the concept of segmentation is relevant for packets but not
>> > for
>> > >>>>> timers then I think it should be implemented as a feature of
>> > packets.
>> > >>>>>
>> > >>>>> Best regards,
>> > >>>>>
>> > >>>>> Ola D
>> > >>>>>
>> > >>>>> On Fri, Oct 17, 2014 at 2:33 PM, Bill Fischofer
>> > >>>>> <bill.fischo...@linaro.org> wrote:
>> > >>>>>>
>> > >>>>>> I agree that packets are the buffer type that most likely uses
>> > >>>>>> segments, however there are many advantages to putting this
>> support
>> > in the
>> > >>>>>> base class rather than the subclass independent of the number of
>> > buffer
>> > >>>>>> subclasses that will use this support today.
>> > >>>>>>
>> > >>>>>> It's simpler
>> > >>>>>> It's more extensible
>> > >>>>>> It results in cleaner and more efficient application code
>> > >>>>>>
>> > >>>>>> Allow me to expand on these points.  First simplicity.  Call the
>> > work
>> > >>>>>> required to support segmentation in the implementation X.  That X
>> > is going
>> > >>>>>> to be pretty much constant no matter where it is done.  But if
>> the
>> > >>>>>> implementation has a choice between doing X at a low level vs.
>> > doing it at a
>> > >>>>>> high level then it's simpler for the implementation to do it once
>> > and be
>> > >>>>>> done with it.  If the implementation does it at a higher level
>> then
>> > it is
>> > >>>>>> either constrained to map that higher-level implementation to be
>> > built on a
>> > >>>>>> set of lower-level functions that may or may not be appropriate
>> or
>> > else it
>> > >>>>>> needs to do a completely parallel implementation that is optimal
>> > but highly
>> > >>>>>> duplicative.
>> > >>>>>>
>> > >>>>>> Extensibility should be clear.  If at some future point we decide
>> > >>>>>> segmentation would be useful for some new buffer type (e.g., IPC)
>> > then
>> > >>>>>> that's trivial to do if the base class supports it and awkward if
>> > it's only
>> > >>>>>> part of packets.
>> > >>>>>>
>> > >>>>>> From an application standpoint, it's cleaner because the packet
>> > APIs
>> > >>>>>> are just wrappers around their corresponding buffer APIs and can
>> be
>> > mapped
>> > >>>>>> directly.  Otherwise we have a set of APIs that don't map and are
>> > not easily
>> > >>>>>> translatable.
>> > >>>>>>
>> > >>>>>> With regard to efficient segment access, that's what the
>> > >>>>>> odp_packet_addr() routine provides--one-step fast-path
>> > addressability to the
>> > >>>>>> first segment of a packet.  An odp_packet_t is an abstract opaque
>> > type.  It
>> > >>>>>> is not, and cannot be treated as an address by the application.
>> > >>>>>>
>> > >>>>>> Does that make sense?
>> > >>>>>>
>> > >>>>>> Bill
>> > >>>>>>
>> > >>>>>>
>> > >>>>>>
>> > >>>>>>
>> > >>>>>> On Fri, Oct 17, 2014 at 5:37 AM, Savolainen, Petri (NSN -
>> FI/Espoo)
>> > >>>>>> <petri.savolai...@nsn.com> wrote:
>> > >>>>>>>
>> > >>>>>>> Hi,
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> 1. The only segmentation use case is for segmented packet, not
>> for
>> > >>>>>>> segmented buffers.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> 2. Common case for packets is that everything application needs
>> is
>> > in
>> > >>>>>>> the first segment. Odp_packet_t could refer always into that
>> > “first
>> > >>>>>>> segment”, so that application (in the common case) would not
>> need
>> > to use
>> > >>>>>>> odp_packet_seg_xxx() calls at all – only odp_packet_xxx() calls.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> When buffer level features are minimized, the need for
>> > >>>>>>> odp_buffer_xxx(odp_packet_to_buffer(pkt),...) is minimized. All
>> > packet
>> > >>>>>>> manipulation should happen through odp_packet_xxx(pkt, …) calls.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> -Petri
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> From: ext Bill Fischofer [mailto:bill.fischo...@linaro.org]
>> > >>>>>>> Sent: Friday, October 17, 2014 1:17 PM
>> > >>>>>>> To: Savolainen, Petri (NSN - FI/Espoo)
>> > >>>>>>> Cc: ext Jacob, Jerin; lng-odp@lists.linaro.org
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> Subject: Re: [lng-odp] [ODP/PATCH v1] ODP Buffer Segment Support
>> > API
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> I'm not sure how to understand these two statements:
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> 1. There's no use case for segmented buffers
>> > >>>>>>>
>> > >>>>>>> 2. We should optimize for the common case (with segments)
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> These seem contradictory.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> The use case for segmented buffers is that some platforms have a
>> > >>>>>>> HW-defined and managed segmented buffer model. If we insist that
>> > the
>> > >>>>>>> application be able to specify and control packet segment sizes
>> we
>> > are
>> > >>>>>>> making the decision to exclude such platforms from supporting
>> ODP.
>> > The
>> > >>>>>>> optimization suggested is precisely what is being proposed here.
>> > By default
>> > >>>>>>> packets are assumed to be contained in implementation-managed
>> > segmented
>> > >>>>>>> buffers and the first segment will be large enough to contain
>> all
>> > packet
>> > >>>>>>> headers for non-pathological cases.  The case where the
>> > application wishes
>> > >>>>>>> to traverse the entire packet in SW is expected to be rare
>> because
>> > in the
>> > >>>>>>> data plane you simply do not have the cycles to do this at line
>> > rate for all
>> > >>>>>>> packets.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> As for having both odp_buffer_xxx() and odp_packet_xxx() APIs,
>> > this is
>> > >>>>>>> simply syntax to avoid the constant need for explicit conversion
>> > functions
>> > >>>>>>> since unlike C++, C does not support generic functions.  So you
>> > cannot pass
>> > >>>>>>> an odp_packet_t to a function that expects an odp_buffer_t
>> > argument without
>> > >>>>>>> a conversion call.  Do we really want to force applications to
>> > constantly be
>> > >>>>>>> writing code like:
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> odp_buffer_xxx(odp_packet_to_buffer(pkt),...)
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> rather than
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> odp_packet_xxx(pkt,...)
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> Not only is this awkward, it is also inefficient.  By having the
>> > >>>>>>> explicit odp_packet_xxx() calls, the implementation is free to
>> > optimize
>> > >>>>>>> these references in whatever manner is appropriate to that
>> > implementation.
>> > >>>>>>> For some this may be a simple preprocessor-type expansion while
>> > for others
>> > >>>>>>> there may be more sophisticated handling.  But the application
>> > should
>> > >>>>>>> neither know nor care about how the implementation chooses to do
>> > this.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> On Fri, Oct 17, 2014 at 2:27 AM, Savolainen, Petri (NSN -
>> > FI/Espoo)
>> > >>>>>>> <petri.savolai...@nsn.com> wrote:
>> > >>>>>>>
>> > >>>>>>> Hi,
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> This is also my opinion. There’s no use case for segmented
>> buffers
>> > in
>> > >>>>>>> v1.0 - so let’s keep it simple and define that buffers (and thus
>> > buffer
>> > >>>>>>> pools) are always unsegmented. Segmentation comes into play only
>> > with
>> > >>>>>>> packets (and only with those packets that cannot fit into a
>> single
>> > buffer).
>> > >>>>>>> For example, if implementation has max buffer size 256, any
>> > packets larger
>> > >>>>>>> than that are segmented and segments are handled with
>> > packet_seg_xxx calls.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> Also, I’d propose that we optimize for the common case (with
>> > segments)
>> > >>>>>>> - so that the odp_packet_t handle would refer always to the head
>> > of packet
>> > >>>>>>> segment. If the first segment (data/data_len pointed by the
>> > odp_packet_t)
>> > >>>>>>> carries all data application is interested in (=protocol
>> headers),
>> > the
>> > >>>>>>> application would not have to use the segment API at all. Most
>> > applications
>> > >>>>>>> would not see any difference between small/large or
>> > segmented/unsegmented
>> > >>>>>>> packets as long as all headers fit into the first segment.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> -Petri
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> From: lng-odp-boun...@lists.linaro.org
>> > >>>>>>> [mailto:lng-odp-boun...@lists.linaro.org] On Behalf Of ext
>> Jacob,
>> > Jerin
>> > >>>>>>> Sent: Friday, October 17, 2014 9:34 AM
>> > >>>>>>> To: Bill Fischofer
>> > >>>>>>> Cc: lng-odp@lists.linaro.org
>> > >>>>>>> Subject: Re: [lng-odp] [ODP/PATCH v1] ODP Buffer Segment Support
>> > API
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> The need for segment API infrastructure is very clear.The
>> question
>> > is,
>> > >>>>>>> Do we need separate APIs for
>> > >>>>>>>
>> > >>>>>>> segment management at odp_buffer_segment* AND
>> odp_packet_segment*
>> > >>>>>>> levels ?
>> > >>>>>>>
>> > >>>>>>> as ODP_BUFFER_TYPE_TIMEOUT and ODP_BUFFER_TYPE_RAW will be
>> always
>> > >>>>>>> unsegmented and if there is a
>> > >>>>>>>
>> > >>>>>>> API for odp_packet_segement* then there will be not be any
>> > consumer
>> > >>>>>>> for odp_buffer_segment* API for 1.0
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> ________________________________
>> > >>>>>>>
>> > >>>>>>> From: Bill Fischofer <bill.fischo...@linaro.org>
>> > >>>>>>> Sent: Thursday, October 16, 2014 9:08 PM
>> > >>>>>>> To: Jacob, Jerin
>> > >>>>>>> Cc: Ola Liljedahl; Balasubramanian Manoharan; lng-
>> > o...@lists.linaro.org
>> > >>>>>>> Subject: Re: [lng-odp] [ODP/PATCH v1] ODP Buffer Segment Support
>> > API
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> From the buffer design doc (p. 8-9):
>> > >>>>>>>
>> > >>>>>>> Buffer Pool Options
>> > >>>>>>>
>> > >>>>>>> The odp_buffer_opts_e enum is used to specify additional options
>> > >>>>>>> relating to the buffer pool.  Buffer pool options defined are:
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> ·     ODP_BUFFER_OPTS_NONE
>> > >>>>>>>
>> > >>>>>>> ·     ODP_BUFFER_OPTS_UNSEGMENTED
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> These options are additive so an application can simply specify
>> a
>> > >>>>>>> buf_opts by ORing together the options needed.  Note that buffer
>> > pool
>> > >>>>>>> options are themselves OPTIONAL and a given implementation MAY
>> > fail the
>> > >>>>>>> buffer pool creation request with an appropriate errno if the
>> > requested
>> > >>>>>>> option is not supported by the underlying ODP implementation,
>> with
>> > the
>> > >>>>>>> exception that UNSEGMENTED pools MUST be supported for
>> non-packet
>> > types and
>> > >>>>>>> for packet types as long as the requested size is less than the
>> > >>>>>>> implementation-defined native packet segment size.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> Use ODP_BUFFER_OPTS_NONE to specify default buffer pool options
>> > with
>> > >>>>>>> no additions.  The ODP_BUFFER_OPTS_UNSEGMENTED option specifies
>> > that the
>> > >>>>>>> buffer pool should be unsegmented.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> So unsegmented buffer pool support is available.  As far as RAW
>> > >>>>>>> buffers go, again from the doc (p. 14):
>> > >>>>>>>
>> > >>>>>>> ODP_BUFFER_TYPE_RAW
>> > >>>>>>>
>> > >>>>>>> This is the “basic” buffer type which simply consists of a
>> single
>> > >>>>>>> fixed-sized block of contiguous memory.  Buffers of this type do
>> > not support
>> > >>>>>>> user meta data and the only built-in meta data supported for
>> this
>> > type of
>> > >>>>>>> buffer are those that are statically computable, such as pool
>> and
>> > size. This
>> > >>>>>>> type of buffer is entirely under application control and most of
>> > the buffer
>> > >>>>>>> APIs defined in this document are not available.  APIs for this
>> > type of
>> > >>>>>>> buffer are described in this document.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> So RAW buffers are always unsegmented.  The intent is that
>> Packets
>> > are
>> > >>>>>>> by default segmented but can be unsegmented while the other
>> buffer
>> > types are
>> > >>>>>>> by default unsegmented but (with the exception of RAW buffers)
>> can
>> > be made
>> > >>>>>>> segmented.  This is because all buffers start out as a single
>> > segment and
>> > >>>>>>> hence are unsegmented until they are expanded to overflow that
>> > single
>> > >>>>>>> segment.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> Hope that clarifies things.  Again, this is all very
>> > straightforward
>> > >>>>>>> and only comes into play when actually needed.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> On Wed, Oct 8, 2014 at 4:03 AM, Jacob, Jerin
>> > >>>>>>> <jerin.ja...@caviumnetworks.com> wrote:
>> > >>>>>>>
>> > >>>>>>> If there is no valid use case for supporting segmentation for
>> raw
>> > >>>>>>> buffers then lets drop it. At least it will reduce the effort of
>> > >>>>>>>
>> > >>>>>>> implementing and testing/verification buffer APIs on  different
>> > >>>>>>> platforms.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> ________________________________
>> > >>>>>>>
>> > >>>>>>> From: lng-odp-boun...@lists.linaro.org
>> > >>>>>>> <lng-odp-boun...@lists.linaro.org> on behalf of Ola Liljedahl
>> > >>>>>>> <ola.liljed...@linaro.org>
>> > >>>>>>> Sent: Wednesday, October 8, 2014 1:37 PM
>> > >>>>>>> To: Balasubramanian Manoharan
>> > >>>>>>> Cc: lng-odp@lists.linaro.org
>> > >>>>>>> Subject: Re: [lng-odp] [ODP/PATCH v1] ODP Buffer Segment Support
>> > API
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> As I wrote in my comment to the architecture discussion
>> yesterday,
>> > I
>> > >>>>>>> am against segmentation for buffers. Or at least there must be
>> the
>> > >>>>>>> possibility to create a buffer pool with guaranteed
>> non-segmented
>> > buffers.
>> > >>>>>>> Segmented packets are OK but not all usages for buffers relate
>> to
>> > packets. A
>> > >>>>>>> lot of internal usages (timeouts, SW messages, internal data
>> > structures)
>> > >>>>>>> will not be able to handle segmented buffers so you must be able
>> > to force
>> > >>>>>>> the creation of buffer pools with non-segmented buffers.
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> -- Ola
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> On 8 October 2014 09:50, Balasubramanian Manoharan
>> > >>>>>>> <bala.manoha...@linaro.org> wrote:
>> > >>>>>>>
>> > >>>>>>> This patch contains ODP Buffer Management missing APIs
>> > >>>>>>> The intent of this patch is to port the missing APIs from Buffer
>> > >>>>>>> Management design document into Linux-generic repo.
>> > >>>>>>> The dummy functions will be replaced during linux-generic
>> > >>>>>>> implementation.
>> > >>>>>>>
>> > >>>>>>> Signed-off-by: Balasubramanian Manoharan
>> > <bala.manoha...@linaro.org>
>> > >>>>>>> ---
>> > >>>>>>>  platform/linux-generic/include/api/odp_buffer.h    | 203
>> > >>>>>>> ++++++++++++++++++++-
>> > >>>>>>>  .../linux-generic/include/api/odp_buffer_pool.h    |  30 +++
>> > >>>>>>>  platform/linux-generic/odp_buffer.c                | 120
>> > ++++++++++++
>> > >>>>>>>  platform/linux-generic/odp_buffer_pool.c           |   7 +
>> > >>>>>>>  4 files changed, 351 insertions(+), 9 deletions(-)
>> > >>>>>>>
>> > >>>>>>> diff --git a/platform/linux-generic/include/api/odp_buffer.h
>> > >>>>>>> b/platform/linux-generic/include/api/odp_buffer.h
>> > >>>>>>> index d8577fd..aeb75ed 100644
>> > >>>>>>> --- a/platform/linux-generic/include/api/odp_buffer.h
>> > >>>>>>> +++ b/platform/linux-generic/include/api/odp_buffer.h
>> > >>>>>>> @@ -28,8 +28,34 @@ extern "C" {
>> > >>>>>>>   */
>> > >>>>>>>  typedef uint32_t odp_buffer_t;
>> > >>>>>>>
>> > >>>>>>> -#define ODP_BUFFER_INVALID (0xffffffff) /**< Invalid buffer */
>> > >>>>>>> +/**
>> > >>>>>>> +* ODP buffer segment
>> > >>>>>>> +*/
>> > >>>>>>> +typedef uint32_t odp_buffer_segment_t;
>> > >>>>>>>
>> > >>>>>>> +/**
>> > >>>>>>> +* ODP buffer type
>> > >>>>>>> +*/
>> > >>>>>>> +typedef enum odp_buffer_type {
>> > >>>>>>> +       ODP_BUFFER_TYPE_INVALID = -1,   /**< Buffer type invalid
>> > */
>> > >>>>>>> +       ODP_BUFFER_TYPE_ANY = 0,        /**< Buffer that can
>> hold
>> > any
>> > >>>>>>> other
>> > >>>>>>> +                                       buffer type */
>> > >>>>>>> +       ODP_BUFFER_TYPE_RAW = 1,        /**< Raw buffer,
>> > >>>>>>> +                                       no additional metadata
>> */
>> > >>>>>>> +       ODP_BUFFER_TYPE_PACKET = 2,     /**< Packet buffer */
>> > >>>>>>> +       ODP_BUFFER_TYPE_TIMEOUT = 3     /**< Timeout buffer */
>> > >>>>>>> +} odp_buffer_type_e;
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> +* ODP buffer options
>> > >>>>>>> +*/
>> > >>>>>>> +typedef enum odp_buffer_opts {
>> > >>>>>>> +       ODP_BUFFER_OPTS_NONE,
>> > >>>>>>> +       ODP_BUFFER_OPTS_UNSEGMENTED
>> > >>>>>>> +} odp_buffer_opts_e;
>> > >>>>>>> +
>> > >>>>>>> +#define ODP_BUFFER_INVALID (0xffffffff) /**< Invalid buffer */
>> > >>>>>>> +#define ODP_SEGMENT_INVALID (0xffffffff) /**< Invalid segment
>> */
>> > >>>>>>>
>> > >>>>>>>  /**
>> > >>>>>>>   * Buffer start address
>> > >>>>>>> @@ -58,14 +84,6 @@ size_t odp_buffer_size(odp_buffer_t buf);
>> > >>>>>>>   */
>> > >>>>>>>  int odp_buffer_type(odp_buffer_t buf);
>> > >>>>>>>
>> > >>>>>>> -#define ODP_BUFFER_TYPE_INVALID (-1) /**< Buffer type invalid
>> */
>> > >>>>>>> -#define ODP_BUFFER_TYPE_ANY       0  /**< Buffer that can hold
>> > any
>> > >>>>>>> other
>> > >>>>>>> -                                         buffer type */
>> > >>>>>>> -#define ODP_BUFFER_TYPE_RAW       1  /**< Raw buffer, no
>> > additional
>> > >>>>>>> metadata */
>> > >>>>>>> -#define ODP_BUFFER_TYPE_PACKET    2  /**< Packet buffer */
>> > >>>>>>> -#define ODP_BUFFER_TYPE_TIMEOUT   3  /**< Timeout buffer */
>> > >>>>>>> -
>> > >>>>>>> -
>> > >>>>>>>  /**
>> > >>>>>>>   * Tests if buffer is valid
>> > >>>>>>>   *
>> > >>>>>>> @@ -76,6 +94,110 @@ int odp_buffer_type(odp_buffer_t buf);
>> > >>>>>>>  int odp_buffer_is_valid(odp_buffer_t buf);
>> > >>>>>>>
>> > >>>>>>>  /**
>> > >>>>>>> + * Tests if buffer is segmented
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Buffer handle
>> > >>>>>>> + *
>> > >>>>>>> + * @return             1 if buffer has more than one segment,
>> > >>>>>>> + *                     otherwise 0
>> > >>>>>>> + */
>> > >>>>>>> +
>> > >>>>>>> +int odp_buffer_is_segmented(odp_buffer_t buf);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> + * Get address and size of user meta data associated with a
>> > buffer
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf             Buffer handle
>> > >>>>>>> + * @param[out] udata_size      Number of bytes of user meta
>> data
>> > >>>>>>> available
>> > >>>>>>> + *                             at the returned address
>> > >>>>>>> + * @return                     Address of the user meta data
>> for
>> > this
>> > >>>>>>> buffer
>> > >>>>>>> + *                             or NULL if the buffer has no
>> user
>> > meta
>> > >>>>>>> data.
>> > >>>>>>> + */
>> > >>>>>>> +void *odp_buffer_udata(odp_buffer_t buf, size_t *udata_size);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> + * Get address of user meta data associated with a buffer
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Buffer handle
>> > >>>>>>> + *
>> > >>>>>>> + * @return             Address of the user meta data for this
>> > buffer
>> > >>>>>>> + *                     or NULL if the buffer has no user meta
>> > data.
>> > >>>>>>> + */
>> > >>>>>>> +void *odp_buffer_udata_addr(odp_buffer_t buf);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> + * Get count of number of segments in a buffer
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Buffer handle
>> > >>>>>>> + *
>> > >>>>>>> + * @return             Count of the number of segments in buf
>> > >>>>>>> + */
>> > >>>>>>> +size_t odp_buffer_segment_count(odp_buffer_t buf);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> + * Get the segment identifier for a buffer segment by index
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Buffer handle
>> > >>>>>>> + * @param[in]  ndx     Segment index of segment of interest
>> > >>>>>>> + *
>> > >>>>>>> + * @return             Segment identifier or
>> ODP_SEGMENT_INVALID
>> > if
>> > >>>>>>> the
>> > >>>>>>> + *                     supplied ndx is out of range.
>> > >>>>>>> + */
>> > >>>>>>> +odp_buffer_segment_t odp_buffer_segment_by_index(odp_buffer_t
>> > buf,
>> > >>>>>>> size_t ndx);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> + * Get the next segment identifier for a buffer segment
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Buffer handle
>> > >>>>>>> + * @param[in]  seg     Segment identifier of the previous
>> segment
>> > >>>>>>> + *
>> > >>>>>>> + * @return             Segment identifier of the next segment,
>> > >>>>>>> +                       or ODP_SEGMENT_INVALID.
>> > >>>>>>> + */
>> > >>>>>>> +odp_buffer_segment_t odp_buffer_segment_next(odp_buffer_t buf,
>> > >>>>>>> +
>> odp_buffer_segment_t
>> > >>>>>>> seg);
>> > >>>>>>> +/**
>> > >>>>>>> + * Get start address for a specified buffer segment
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Buffer handle
>> > >>>>>>> + * @param[in]  seg     Segment identifier of the buffer to be
>> > >>>>>>> addressed
>> > >>>>>>> + * @param[out] seglen  Returned number of bytes in this buffer
>> > >>>>>>> + *                     segment available at returned address
>> > >>>>>>> + *
>> > >>>>>>> + * @return             Segment start address or NULL
>> > >>>>>>> + */
>> > >>>>>>> +void *odp_buffer_segment_map(odp_buffer_t buf,
>> > odp_buffer_segment_t
>> > >>>>>>> seg,
>> > >>>>>>> +size_t *seglen);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> + *Unmap a buffer segment
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  seg     Buffer segment handle
>> > >>>>>>> + */
>> > >>>>>>> +void odp_buffer_segment_unmap(odp_buffer_segment_t seg);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> +* Get start address for a specified buffer offset
>> > >>>>>>> +*
>> > >>>>>>> +* @param[in]   buf     Buffer handle
>> > >>>>>>> +* @param[in]   offset  Byte offset within the buffer to be
>> > addressed
>> > >>>>>>> +* @param[out]  seglen  Returned number of bytes in this buffer
>> > >>>>>>> +*                      segment available at returned address
>> > >>>>>>> +*
>> > >>>>>>> +* @return              Offset start address or NULL
>> > >>>>>>> +*/
>> > >>>>>>> +void *odp_buffer_offset_map(odp_buffer_t buf, size_t offset,
>> > >>>>>>> +size_t *seglen);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> + * Unmap a buffer segment by offset
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Buffer handle
>> > >>>>>>> + * @param[in]  offset  Buffer offset
>> > >>>>>>> + */
>> > >>>>>>> +void odp_buffer_offset_unmap(odp_buffer_t buf, size_t offset);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>>   * Print buffer metadata to STDOUT
>> > >>>>>>>   *
>> > >>>>>>>   * @param buf      Buffer handle
>> > >>>>>>> @@ -83,6 +205,69 @@ int odp_buffer_is_valid(odp_buffer_t buf);
>> > >>>>>>>   */
>> > >>>>>>>  void odp_buffer_print(odp_buffer_t buf);
>> > >>>>>>>
>> > >>>>>>> +/**
>> > >>>>>>> + * Split a buffer into two buffers at a specified split point
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Handle of buffer to split
>> > >>>>>>> + * @param[in]  offset  Byte offset within buf to split buffer
>> > >>>>>>> + *
>> > >>>>>>> + * @return             Buffer handle of the created split
>> buffer
>> > >>>>>>> + */
>> > >>>>>>> +odp_buffer_t odp_buffer_split(odp_buffer_t buf, size_t offset);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> + * Join two buffers into a single buffer
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf1    Buffer handle of first buffer to join
>> > >>>>>>> + * @param[in]  buf2    Buffer handle of second buffer to join
>> > >>>>>>> + *
>> > >>>>>>> + * @return             Buffer handle of the joined buffer
>> > >>>>>>> + */
>> > >>>>>>> +odp_buffer_t odp_buffer_join(odp_buffer_t buf1, odp_buffer_t
>> > buf2);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> + * Trim a buffer at a specified trim point
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Buffer handle of buffer to trim
>> > >>>>>>> + * @param[in]  offset  byte offset within buf to trim
>> > >>>>>>> + *
>> > >>>>>>> + * @return             Handle of the trimmed buffer or
>> > >>>>>>> + *                     ODP_BUFFER_INVALID if the operation was
>> > not
>> > >>>>>>> performed
>> > >>>>>>> + */
>> > >>>>>>> +odp_buffer_t odp_buffer_trim(odp_buffer_t buf, size_t offset);
>> > >>>>>>> +/**
>> > >>>>>>> + * Extend a buffer for a specified number of bytes
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Buffer handle of buffer to expand
>> > >>>>>>> + * @param[in]  ext     size, in bytes, of the extent to add to
>> > the
>> > >>>>>>> + *                     existing buffer.
>> > >>>>>>> + *
>> > >>>>>>> + * @return             Handle of the extended buffer or
>> > >>>>>>> ODP_BUFFER_INVALID
>> > >>>>>>> + *                     if the operation was not performed
>> > >>>>>>> + */
>> > >>>>>>> +odp_buffer_t odp_buffer_extend(odp_buffer_t buf, size_t ext);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> + * Clone a buffer, returning an exact copy of it
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Buffer handle of buffer to duplicate
>> > >>>>>>> + *
>> > >>>>>>> + * @return             Handle of the duplicated buffer or
>> > >>>>>>> ODP_BUFFER_INVALID
>> > >>>>>>> + *                     if the operation was not performed
>> > >>>>>>> + */
>> > >>>>>>> +odp_buffer_t odp_buffer_clone(odp_buffer_t buf);
>> > >>>>>>> +
>> > >>>>>>> +/**
>> > >>>>>>> + * Copy a buffer, returning an exact copy of it
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  buf     Buffer handle of buffer to copy
>> > >>>>>>> + *
>> > >>>>>>> + * @return             Handle of the copied buffer or
>> > >>>>>>> ODP_BUFFER_INVALID
>> > >>>>>>> + *                     if the operation was not performed
>> > >>>>>>> + */
>> > >>>>>>> +odp_buffer_t odp_buffer_copy(odp_buffer_t buf);
>> > >>>>>>> +
>> > >>>>>>> +
>> > >>>>>>>
>> > >>>>>>>  #ifdef __cplusplus
>> > >>>>>>>  }
>> > >>>>>>> diff --git
>> a/platform/linux-generic/include/api/odp_buffer_pool.h
>> > >>>>>>> b/platform/linux-generic/include/api/odp_buffer_pool.h
>> > >>>>>>> index fe88898..f85d96c 100644
>> > >>>>>>> --- a/platform/linux-generic/include/api/odp_buffer_pool.h
>> > >>>>>>> +++ b/platform/linux-generic/include/api/odp_buffer_pool.h
>> > >>>>>>> @@ -52,6 +52,27 @@ odp_buffer_pool_t
>> odp_buffer_pool_create(const
>> > char
>> > >>>>>>> *name,
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>  /**
>> > >>>>>>> + * Get the next buffer pool from its predecessor
>> > >>>>>>> + *
>> > >>>>>>> + * @param[in]  pool            Buffer pool handle
>> > >>>>>>> + * @param[out] name            Name of the pool
>> > >>>>>>> + *                             (max ODP_BUFFER_POOL_NAME_LEN -
>> 1
>> > >>>>>>> chars)
>> > >>>>>>> + * @param[out] udata_size      Size of user meta data used by
>> > this
>> > >>>>>>> pool.
>> > >>>>>>> + * @param[out] buf_num         Number of buffers contained in
>> > this
>> > >>>>>>> pool
>> > >>>>>>> + * @param[out] buf_size        Default size of application data
>> > in
>> > >>>>>>> each buffer
>> > >>>>>>> + * @param[out] buf_type        Buffer type of the pool
>> > >>>>>>> + * @param[out] buf_opts        Buffer options for this pool
>> > >>>>>>> + * @param[out] predef          Predefined (1) or Created (0).
>> > >>>>>>> + *
>> > >>>>>>> + * @return                     Buffer pool handle
>> > >>>>>>> + */
>> > >>>>>>> +odp_buffer_pool_t odp_buffer_pool_next(odp_buffer_pool_t pool,
>> > >>>>>>> +                                      char *name, size_t
>> > *udata_size,
>> > >>>>>>> +                                      size_t *buf_num, size_t
>> > >>>>>>> *buf_size,
>> > >>>>>>> +                                      enum odp_buffer_type
>> > *buf_type,
>> > >>>>>>> +                                      enum odp_buffer_opts
>> > *buf_opts,
>> > >>>>>>> +                                      uint32_t *predef);
>> > >>>>>>> +/**
>> > >>>>>>>   * Find a buffer pool by name
>> > >>>>>>>   *
>> > >>>>>>>   * @param name      Name of the pool
>> > >>>>>>> @@ -80,6 +101,15 @@ void odp_buffer_pool_print(odp_buffer_pool_t
>> > >>>>>>> pool);
>> > >>>>>>>   */
>> > >>>>>>>  odp_buffer_t odp_buffer_alloc(odp_buffer_pool_t pool);
>> > >>>>>>>
>> > >>>>>>> +/**
>> > >>>>>>> +* Allocate a buffer from a buffer pool
>> > >>>>>>> +*
>> > >>>>>>> +* @param[in]   pool    Pool handle
>> > >>>>>>> +* @param[in]   size    Size of object to store in buffer
>> > >>>>>>> +*
>> > >>>>>>> +* @return              Buffer handle or ODP_BUFFER_INVALID
>> > >>>>>>> +*/
>> > >>>>>>> +odp_buffer_t odp_buffer_alloc_size(odp_buffer_pool_t pool,
>> size_t
>> > >>>>>>> size);
>> > >>>>>>>
>> > >>>>>>>  /**
>> > >>>>>>>   * Buffer free
>> > >>>>>>> diff --git a/platform/linux-generic/odp_buffer.c
>> > >>>>>>> b/platform/linux-generic/odp_buffer.c
>> > >>>>>>> index e54e0e7..7f4b4f0 100644
>> > >>>>>>> --- a/platform/linux-generic/odp_buffer.c
>> > >>>>>>> +++ b/platform/linux-generic/odp_buffer.c
>> > >>>>>>> @@ -45,6 +45,21 @@ int odp_buffer_is_valid(odp_buffer_t buf)
>> > >>>>>>>         return (handle.index != ODP_BUFFER_INVALID_INDEX);
>> > >>>>>>>  }
>> > >>>>>>>
>> > >>>>>>> +int odp_buffer_is_segmented(odp_buffer_t buf)
>> > >>>>>>> +{
>> > >>>>>>> +       odp_buffer_hdr_t *buf_hdr = odp_buf_to_hdr(buf);
>> > >>>>>>> +
>> > >>>>>>> +       if (buf_hdr->scatter.num_bufs == 0)
>> > >>>>>>> +               return 0;
>> > >>>>>>> +       else
>> > >>>>>>> +               return 1;
>> > >>>>>>> +}
>> > >>>>>>> +
>> > >>>>>>> +size_t odp_buffer_segment_count(odp_buffer_t buf)
>> > >>>>>>> +{
>> > >>>>>>> +       odp_buffer_hdr_t *buf_hdr = odp_buf_to_hdr(buf);
>> > >>>>>>> +       return (size_t)buf_hdr->scatter.num_bufs + 1;
>> > >>>>>>> +}
>> > >>>>>>>
>> > >>>>>>>  int odp_buffer_snprint(char *str, size_t n, odp_buffer_t buf)
>> > >>>>>>>  {
>> > >>>>>>> @@ -101,8 +116,113 @@ void odp_buffer_print(odp_buffer_t buf)
>> > >>>>>>>         printf("\n%s\n", str);
>> > >>>>>>>  }
>> > >>>>>>>
>> > >>>>>>> +void *odp_buffer_udata(odp_buffer_t buf, size_t *udata_size)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       (void)udata_size;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +
>> > >>>>>>> +void *odp_buffer_udata_addr(odp_buffer_t buf)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +
>> > >>>>>>> +odp_buffer_segment_t odp_buffer_segment_by_index(odp_buffer_t
>> > buf,
>> > >>>>>>> +                                                size_t ndx)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       (void)ndx;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +
>> > >>>>>>> +odp_buffer_segment_t odp_buffer_segment_next(odp_buffer_t buf,
>> > >>>>>>> +
>> odp_buffer_segment_t
>> > seg)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       (void)seg;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +
>> > >>>>>>> +void *odp_buffer_segment_map(odp_buffer_t buf,
>> > odp_buffer_segment_t
>> > >>>>>>> seg,
>> > >>>>>>> +                            size_t *seglen)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       (void)seg;
>> > >>>>>>> +       (void)seglen;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +void *odp_buffer_offset_map(odp_buffer_t buf, size_t offset,
>> > >>>>>>> +size_t *seglen)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       (void)offset;
>> > >>>>>>> +       (void)seglen;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +void odp_buffer_offset_unmap(odp_buffer_t buf, size_t offset)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       (void)offset;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return;
>> > >>>>>>> +}
>> > >>>>>>> +
>> > >>>>>>>  void odp_buffer_copy_scatter(odp_buffer_t buf_dst, odp_buffer_t
>> > >>>>>>> buf_src)
>> > >>>>>>>  {
>> > >>>>>>>         (void)buf_dst;
>> > >>>>>>>         (void)buf_src;
>> > >>>>>>>  }
>> > >>>>>>> +
>> > >>>>>>> +odp_buffer_t odp_buffer_split(odp_buffer_t buf, size_t offset)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       (void)offset;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +
>> > >>>>>>> +odp_buffer_t odp_buffer_join(odp_buffer_t buf1, odp_buffer_t
>> > buf2)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf1;
>> > >>>>>>> +       (void)buf2;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +
>> > >>>>>>> +odp_buffer_t odp_buffer_trim(odp_buffer_t buf, size_t offset)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       (void)offset;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +odp_buffer_t odp_buffer_extend(odp_buffer_t buf, size_t ext)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       (void)ext;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +
>> > >>>>>>> +odp_buffer_t odp_buffer_clone(odp_buffer_t buf)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +
>> > >>>>>>> +odp_buffer_t odp_buffer_copy(odp_buffer_t buf)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)buf;
>> > >>>>>>> +       ODP_UNIMPLEMENTED();
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>> +
>> > >>>>>>> diff --git a/platform/linux-generic/odp_buffer_pool.c
>> > >>>>>>> b/platform/linux-generic/odp_buffer_pool.c
>> > >>>>>>> index a48d7d6..bff4db5 100644
>> > >>>>>>> --- a/platform/linux-generic/odp_buffer_pool.c
>> > >>>>>>> +++ b/platform/linux-generic/odp_buffer_pool.c
>> > >>>>>>> @@ -471,6 +471,13 @@ odp_buffer_t
>> > odp_buffer_alloc(odp_buffer_pool_t
>> > >>>>>>> pool_hdl)
>> > >>>>>>>         return handle.u32;
>> > >>>>>>>  }
>> > >>>>>>>
>> > >>>>>>> +odp_buffer_t odp_buffer_alloc_size(odp_buffer_pool_t pool,
>> size_t
>> > >>>>>>> size)
>> > >>>>>>> +{
>> > >>>>>>> +       (void)pool;
>> > >>>>>>> +       (void) size;
>> > >>>>>>> +       ODP_ERR("%s function is yet to be implemented",
>> __func__);
>> > >>>>>>> +       return 0;
>> > >>>>>>> +}
>> > >>>>>>>
>> > >>>>>>>  void odp_buffer_free(odp_buffer_t buf)
>> > >>>>>>>  {
>> > >>>>>>> --
>> > >>>>>>> 2.0.1.472.g6f92e5f
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> _______________________________________________
>> > >>>>>>> lng-odp mailing list
>> > >>>>>>> lng-odp@lists.linaro.org
>> > >>>>>>> http://lists.linaro.org/mailman/listinfo/lng-odp
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>> _______________________________________________
>> > >>>>>>> lng-odp mailing list
>> > >>>>>>> lng-odp@lists.linaro.org
>> > >>>>>>> http://lists.linaro.org/mailman/listinfo/lng-odp
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>>
>> > >>>>>>
>> > >>>>>>
>> > >>>>>>
>> > >>>>>> _______________________________________________
>> > >>>>>> lng-odp mailing list
>> > >>>>>> lng-odp@lists.linaro.org
>> > >>>>>> http://lists.linaro.org/mailman/listinfo/lng-odp
>> > >>>>>>
>> > >>>>>
>> > >>>>>
>> > >>>>> _______________________________________________
>> > >>>>> lng-odp mailing list
>> > >>>>> lng-odp@lists.linaro.org
>> > >>>>> http://lists.linaro.org/mailman/listinfo/lng-odp
>> > >>>>>
>> > >>>>
>> > >>>
>> > >>
>> > >>
>> > >> _______________________________________________
>> > >> lng-odp mailing list
>> > >> lng-odp@lists.linaro.org
>> > >> http://lists.linaro.org/mailman/listinfo/lng-odp
>> > >>
>>
>
>
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to