On 11/12/2014 02:59 AM, Bill Fischofer wrote:

[snip]

+static inline odp_buffer_hdr_t *validate_buf(odp_buffer_t buf)
+{
+       odp_buffer_bits_t handle;
+       odp_buffer_hdr_t *buf_hdr;
+       handle.u32 = buf;
+
+       /* For buffer handles, segment index must be 0 */
+       if (handle.seg != 0)
+               return NULL;
+
+       pool_entry_t *pool = odp_pool_to_entry(handle.pool_id);
+
+       /* If pool not created, handle is invalid */
+       if (pool->s.shm == ODP_SHM_INVALID)
+               return NULL;
+
+       /* A valid buffer index must be on stride, and must be in range */
+       if ((handle.index % pool->s.mdata_stride != 0) ||
+           ((uint32_t)(handle.index / pool->s.mdata_stride) >=
+            pool->s.num_bufs))
+               return NULL;

pool->s.mdata_stride is not initialized.

[snip]

-odp_buffer_pool_t odp_buffer_pool_create(const char *name,
-                                        void *base_addr, uint64_t size,
-                                        size_t buf_size, size_t buf_align,
-                                        int buf_type)
-{
-       odp_buffer_pool_t pool_hdl = ODP_BUFFER_POOL_INVALID;
-       pool_entry_t *pool;
-       uint32_t i;

        for (i = 0; i < ODP_CONFIG_BUFFER_POOLS; i++) {
                pool = get_pool_entry(i);

                LOCK(&pool->s.lock);
+               if (pool->s.shm != ODP_SHM_INVALID) {
+                       UNLOCK(&pool->s.lock);
+                       continue;
+               }

-               if (pool->s.buf_base == 0) {
-                       /* found free pool */
+               /* found free pool */
+               size_t block_size, mdata_size, udata_size;

-                       strncpy(pool->s.name, name,
-                               ODP_BUFFER_POOL_NAME_LEN - 1);
-                       pool->s.name[ODP_BUFFER_POOL_NAME_LEN - 1] = 0;
-                       pool->s.pool_base_addr = base_addr;
-                       pool->s.pool_size      = size;
-                       pool->s.user_size      = buf_size;
-                       pool->s.user_align     = buf_align;
-                       pool->s.buf_type       = buf_type;
+               strncpy(pool->s.name, name,
+                       ODP_BUFFER_POOL_NAME_LEN - 1);
+               pool->s.name[ODP_BUFFER_POOL_NAME_LEN - 1] = 0;

-                       link_bufs(pool);
+               pool->s.params = *params;
+               pool->s.init_params = *init_params;

-                       UNLOCK(&pool->s.lock);
+               mdata_size = params->buf_num * buf_stride;
+               udata_size = params->buf_num * udata_stride;
+               block_size = params->buf_num * blk_size;
+
+               pool->s.pool_size = ODP_PAGE_SIZE_ROUNDUP(mdata_size +
+                                                         udata_size +
+                                                         block_size);

-                       pool_hdl = pool->s.pool_hdl;
-                       break;
+               pool->s.shm = odp_shm_reserve(pool->s.name, pool->s.pool_size,
+                                             ODP_PAGE_SIZE, 0);
+               if (pool->s.shm == ODP_SHM_INVALID) {
+                       UNLOCK(&pool->s.lock);
+                       return ODP_BUFFER_POOL_INVALID;
                }

+               pool->s.pool_base_addr = (uint8_t *)odp_shm_addr(pool->s.shm);
+               pool->s.flags.unsegmented = unsegmented;
+               pool->s.seg_size = unsegmented ?
+                       blk_size : ODP_CONFIG_BUF_SEG_SIZE;
+               uint8_t *udata_base_addr = pool->s.pool_base_addr + mdata_size;
+               uint8_t *block_base_addr = udata_base_addr + udata_size;
+
+               pool->s.bufcount = 0;
+               pool->s.buf_freelist = NULL;
+               pool->s.blk_freelist = NULL;
+
+               uint8_t *buf = pool->s.udata_base_addr - buf_stride;
+               uint8_t *udat = (udata_stride == 0) ? NULL :
+                       block_base_addr - udata_stride;

Initialized pool->s.udata_base_addr is still here.

[snip]

+odp_buffer_t odp_buffer_alloc(odp_buffer_pool_t pool_hdl)
+{
+       return buffer_alloc(pool_hdl, 0);

Here buffer is allocated with 0 size, but my understanding was that allocated buffer size should be equal to value passed to
odp_buffer_pool_create().

As far as I remember we talked about zero _packet_ size after
packet allocation, but not buffer size.

Also odp_buffer_hdr_t.size field is not initialized during buffer
allocation.

BTW head/tailroom are added at buffer pool level, but they are a
feature of PACKET buffer type and doesn't make sense for RAW buffers.
IMO odp_buffer_pool_set_headroom() should return failure for pools,
that are not PACKET.

+}
+
+void odp_buffer_free(odp_buffer_t buf)
+{
+       odp_buffer_hdr_t *hdr = odp_buf_to_hdr(buf);
+       pool_entry_t *pool = odp_buf_to_pool(hdr);
+       ret_buf(&pool->s, hdr);
+}

  void odp_buffer_pool_print(odp_buffer_pool_t pool_hdl)
  {
        pool_entry_t *pool;
-       odp_buffer_chunk_hdr_t *chunk_hdr;
-       uint32_t i;
        uint32_t pool_id;

        pool_id = pool_handle_to_index(pool_hdl);
@@ -528,47 +460,4 @@ void odp_buffer_pool_print(odp_buffer_pool_t pool_hdl)
        printf("  pool          %i\n",           pool->s.pool_hdl);
        printf("  name          %s\n",           pool->s.name);
        printf("  pool base     %p\n",           pool->s.pool_base_addr);
-       printf("  buf base      0x%"PRIxPTR"\n", pool->s.buf_base);
-       printf("  pool size     0x%"PRIx64"\n",  pool->s.pool_size);
-       printf("  buf size      %zu\n",          pool->s.user_size);
-       printf("  buf align     %zu\n",          pool->s.user_align);
-       printf("  hdr size      %zu\n",          pool->s.hdr_size);
-       printf("  alloc size    %zu\n",          pool->s.buf_size);
-       printf("  offset to hdr %zu\n",          pool->s.buf_offset);
-       printf("  num bufs      %"PRIu64"\n",    pool->s.num_bufs);
-       printf("  free bufs     %"PRIu64"\n",    pool->s.free_bufs);

Should all odp_*_print() functions use ODP_LOG() instead of direct
printf?

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

Reply via email to