On 11/10/2014 07:10 PM, Bill Fischofer wrote:
Signed-off-by: Bill Fischofer <[email protected]>
---
Versions of this patch
==
v1 - Original (missing files)
v2 - Added missing odp_buffer_inlines.h
v3 - Added missing odph_tcp.h
v4 - (mispublished as v3): Allow NULL arguments to odp_buffer_pool_create()
v5 - Correctly handle timer allocs (no blocks), add support for buf_init calls
      on allocation.
v6 - Add remaining segment APIs + unmaps + additional (void *) casts needed
      for some C compiler environments, as noted by Taras


[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;

Looks like pool->s.blk_freelist and pool->s.buf_freelist are not updated anywhere. And then dereferenced in ret_buf().

+
+               uint8_t *buf = pool->s.udata_base_addr - buf_stride;

pool->s.udata_base_addr is not initialized here.
Should it be just udata_base_addr?

+               uint8_t *udat = (udata_stride == 0) ? NULL :
+                       block_base_addr - udata_stride;
+
+               /* Init buffer common header and add to pool buffer freelist */
+               do {
+                       odp_buffer_hdr_t *tmp =
+                               (odp_buffer_hdr_t *)(void *)buf;
+                       tmp->pool_hdl = pool->s.pool_hdl;
+                       tmp->size = 0;
+                       tmp->type = params->buf_type;
+                       tmp->udata_addr = (void *)udat;
+                       tmp->udata_size = init_params->udata_size;
+                       tmp->segcount = 0;
+                       tmp->segsize = pool->s.seg_size;
+                       tmp->buf_hdl.handle =
+                               odp_buffer_encode_handle((odp_buffer_hdr_t *)
+                                                        (void *)buf);
+                       ret_buf(&pool->s, tmp);
+                       buf  -= buf_stride;
+                       udat -= udata_stride;
+               } while (buf >= pool->s.pool_base_addr);
+
+               /* Form block freelist for pool */
+               uint8_t *blk = pool->s.pool_base_addr + pool->s.pool_size -
+                       pool->s.seg_size;
+
+               if (blk_size > 0)
+                       do {
+                               ret_blk(&pool->s, blk);
+                               blk -= pool->s.seg_size;
+                       } while (blk >= block_base_addr);
+
                UNLOCK(&pool->s.lock);
+
+               pool_hdl = pool->s.pool_hdl;
+               break;


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

Reply via email to