On Thu, May 4, 2017 at 9:24 AM, Petri Savolainen <
[email protected]> wrote:

> Added packet pool parameters for more fine grained pool
> configuration. The basic usage of the parameters is not changed,
> except that implementation may now round up 'num' by default.
> Application can limit the round up with new 'max_num' parameter.
> Another new parameter (prio) allows application to prioritize
> some pools (or parts of pools) over others. Implementation may
> use this information to decide e.g. on HW resource usage.
>
> Additionally, pool configuration may be extended with a table of
> num/len/prio values. This gives application more flexibility to
> specify requirements for various packet sizes.
>
> Signed-off-by: Petri Savolainen <[email protected]>
> ---
>  include/odp/api/spec/pool.h                        | 117
> +++++++++++++++++++--
>  include/odp/arch/default/api/abi/pool.h            |   2 +
>  .../include/odp/api/plat/pool_types.h              |   2 +
>  3 files changed, 110 insertions(+), 11 deletions(-)
>
> diff --git a/include/odp/api/spec/pool.h b/include/odp/api/spec/pool.h
> index 6fc5b6b4..2bf37e5d 100644
> --- a/include/odp/api/spec/pool.h
> +++ b/include/odp/api/spec/pool.h
> @@ -41,6 +41,9 @@ extern "C" {
>   * Maximum pool name length in chars including null char
>   */
>
> +/** Maximum number of additional packet pool parameters */
> +#define ODP_POOL_PKT_ADD_MAX  7
> +
>  /**
>   * Pool capabilities
>   */
> @@ -127,6 +130,9 @@ typedef struct odp_pool_capability_t {
>                  * The value of zero means that limited only by the
> available
>                  * memory size for the pool. */
>                 uint32_t max_uarea_size;
> +
> +               /** Number of priority levels */
> +               uint8_t num_prio;
>

In what sense are these "priorities"? Perhaps just num_subpool?


>         } pkt;
>
>         /** Timeout pool capabilities  */
> @@ -156,6 +162,28 @@ typedef struct odp_pool_capability_t {
>  int odp_pool_capability(odp_pool_capability_t *capa);
>
>  /**
> + * @def ODP_POOL_PRIO_DEFAULT
>

Not clear what this controls or how it's expected to be used.


> + *
> + * Default pool priority. User does not care about the selected priority
> + * level.
> + */
> +
> +/**
> + * Additional parameters for packet pool creation
> + */
> +typedef struct odp_pool_param_pkt_add_t {
> +       /** Number of packets */
> +       uint32_t num;
> +
> +       /** Packet length in bytes */
> +       uint32_t len;
> +
> +       /** Priority level */
> +       uint8_t prio;
> +
> +} odp_pool_param_pkt_add_t;
>

This is a confusing choice of name. Since this is intended to introduce the
notion of subpools, why not just call it odp_pool_subpool_param_t?  An
array of these are then just part of the containing odp_pool_param_t struct.


> +
> +/**
>   * Pool parameters
>   * Used to communicate pool creation options.
>   * @note A single thread may not be able to allocate all 'num' elements
> @@ -185,25 +213,56 @@ typedef struct odp_pool_param_t {
>
>                 /** Parameters for packet pools */
>                 struct {
> -                       /** The number of packets that the pool must
> provide
> -                           that are packet length 'len' bytes or smaller.
> -                           The maximum value is defined by pool capability
> -                           pkt.max_num. */
> +                       /** The minimum number of packets that are packet
> length
> +                        *  'len' bytes or smaller. The maximum value is
> defined
> +                        *  by pool capability pkt.max_num. An
> implementation
> +                        *  may round up the value, as long as the
> 'max_num'
> +                        *  parameter below is not violated.
> +                        */
>                         uint32_t num;
>
> -                       /** Minimum packet length that the pool must
> provide
> -                           'num' packets. The number of packets may be
> less
> -                           than 'num' when packets are larger than 'len'.
> -                           The maximum value is defined by pool capability
> -                           pkt.max_len. Use 0 for default. */
> +                       /** The minimum packet length that at least 'num'
> +                        *  packets are required. The maximum value is
> defined
> +                        *  by pool capability pkt.max_len. Use 0 for
> default.
> +                        */
>                         uint32_t len;
>
> +                       /** Priority level
> +                        *
> +                        *  Priority indicates the relative service level
> +                        *  between pools and packet length configuration
>

Needs more explanation. What is a "service level" in this context? When a
packet arrives and a CoS assigns it to this pool, what's supposed to
happen? When odp_packet_alloc() is called against this pool, again what's
supposed to happen?


> +                        *  within a pool. The highest priority level is
> zero.
> +                        *  Number of priorities is defined by pool
> capability
> +                        *  pkt.num_prio. Thus the lowest priority level is
> +                        *  pkt.num_prio - 1. The default value is
> +                        *  ODP_POOL_PRIO_DEFAULT.
> +                        */
> +                       uint8_t prio;
> +
> +                       /** Number of additional packet pool parameters
> +                        *
> +                        *  The number of pkt.add[] table entries filled.
> The
> +                        *  value must not exceed ODP_POOL_PKT_ADD_MAX.
>

ODP_POOL_SUBPOOL_MAX?


> +                        *  The default value is 0.
> +                        */
> +                       uint8_t num_add;
> +
>                         /** Maximum packet length that will be allocated
> from
>                             the pool. The maximum value is defined by pool
>                             capability pkt.max_len. Use 0 for default (the
>                             pool maximum). */
>                         uint32_t max_len;
>
> +                       /** Maximum number of packets
> +                        *
> +                        *  This is the maximum number of packets of any
> length
> +                        *  that can be allocated from the pool. The
> maximum
> +                        *  value is defined by pool capability
> pkt.max_num.
> +                        *  Use 0 for no requirement for maximum number.
> +                        *  The default value is 0.
> +                        */
> +                       uint32_t max_num;
> +
>                         /** Minimum number of packet data bytes that are
> stored
>                             in the first segment of a packet. The maximum
> value
>                             is defined by pool capability pkt.max_seg_len.
> @@ -214,6 +273,26 @@ typedef struct odp_pool_param_t {
>                             defined by pool capability pkt.max_uarea_size.
>                             Specify as 0 if no user area is needed. */
>                         uint32_t uarea_size;
> +
> +                       /** Additional packet pool parameters
> +                        *
> +                        *  This table gives more fine grained
> requirements for
> +                        *  pool configuration. The table continues from
> +                        *  num/len/prio specification above. Therefore,
> +                        *  pkt.add[0].len must be greater than pkt.len,
> and
> +                        *  pkt.add[0].num refers to packet lengths between
> +                        *  pkt.len + 1 and pkt.add[0].len.
> +                        *
> +                        *  Table enties must be ordered by the packet
> length.
> +                        *  A number of packets figure (pkt.add[N].num)
> refers
> +                        *  to packet lengths between pkt.add[N-1].len + 1
> and
> +                        *  pkt.add[N].len. Each number of packets
> requirement
> +                        *  may be rounded up, as long as the 'max_num'
> +                        *  parameter is not violated. Also, more than one
> +                        *  number of packets requirement may not be
> fulfilled
> +                        *  simultaneously.
>

Not clear what you're referring to in this last remark.


> +                        */
> +                       odp_pool_param_pkt_add_t add[ODP_POOL_PKT_ADD_MAX];
>                 } pkt;
>
>                 /** Parameters for timeout pools */
> @@ -278,8 +357,24 @@ odp_pool_t odp_pool_lookup(const char *name);
>   * Used to get information about a pool.
>   */
>  typedef struct odp_pool_info_t {
> -       const char *name;          /**< pool name */
> -       odp_pool_param_t params;   /**< pool parameters */
> +       /** Pool name */
> +       const char *name;
> +
> +       /** Copy of the pool parameters */
> +       odp_pool_param_t params;
> +
> +       /** Packet pool info */
> +       struct {
> +               /** Maximum number of packets of any length
> +                *
> +                *  This many packets in maximum can be allocated from the
> pool.
> +                *  Application can use this e.g. to prepare enough per
> packet
> +                *  contexts.
> +                */
> +               uint32_t max_num;
> +
> +       } pkt;
> +
>  } odp_pool_info_t;
>
>  /**
> diff --git a/include/odp/arch/default/api/abi/pool.h
> b/include/odp/arch/default/api/abi/pool.h
> index 4637d19f..2e2eaf07 100644
> --- a/include/odp/arch/default/api/abi/pool.h
> +++ b/include/odp/arch/default/api/abi/pool.h
> @@ -26,6 +26,8 @@ typedef _odp_abi_pool_t *odp_pool_t;
>
>  #define ODP_POOL_NAME_LEN  32
>
> +#define ODP_POOL_PRIO_DEFAULT 0
> +
>  typedef enum odp_pool_type_t {
>         ODP_POOL_BUFFER  = ODP_EVENT_BUFFER,
>         ODP_POOL_PACKET  = ODP_EVENT_PACKET,
> diff --git a/platform/linux-generic/include/odp/api/plat/pool_types.h
> b/platform/linux-generic/include/odp/api/plat/pool_types.h
> index 8bc816d4..7bab2fd6 100644
> --- a/platform/linux-generic/include/odp/api/plat/pool_types.h
> +++ b/platform/linux-generic/include/odp/api/plat/pool_types.h
> @@ -36,6 +36,8 @@ typedef ODP_HANDLE_T(odp_pool_t);
>
>  #define ODP_POOL_NAME_LEN  32
>
> +#define ODP_POOL_PRIO_DEFAULT 0
> +
>  typedef enum odp_pool_type_t {
>         ODP_POOL_BUFFER  = ODP_EVENT_BUFFER,
>         ODP_POOL_PACKET  = ODP_EVENT_PACKET,
> --
> 2.11.0
>
>

Reply via email to