On 11/10/2014 08:07 PM, Bill Fischofer wrote:
> Thanks.  See inline comments:
> 
> On Mon, Nov 10, 2014 at 11:37 AM, Taras Kondratiuk 
> <[email protected] <mailto:[email protected]>> wrote:
> 
>     On 11/10/2014 07:10 PM, Bill Fischofer wrote:
> 
>         Signed-off-by: Bill Fischofer <[email protected]
>         <mailto:[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
> 
> 
> 
>         +
>         +               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().
> 
> 
> They are initialized in the lines just above your comment.  Not sure 
> what problem you see here.  The ret_buf()/ret_blk() routines push 
> buffers/blocks onto their respective freelists, so the contents of these 
> pointers become the next pointer for the freed elements.  Result is that 
> the NULL propagates to the last element of the list, and is restored to 
> the list anchor when the last element on that list is popped off of it.  
> These are push/pop stack structures.

That's is not how it works right now. Current code does:
1. pool->s.blk_freelist = NULL;
2. later odp_cs(pool->blk_freelist, oldhead, newhead) ->
        __sync_bool_compare_and_swap(pool->blk_freelist, oldhead, newhead)
3. __sync_bool_compare_and_swap() dereferences blk_freelist and get
   segfault, because it is NULL.

To get behavior that you have described a *pointer* to blk_freelist
have to passed in odp_cs instead of blk_freelist itself.

-odp_cs(pool->blk_freelist, oldhead, newhead)
+odp_cs(&pool->blk_freelist, oldhead, newhead)

> 
> 
>         +
>         +               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?
> 
> 
> No, it is initialized a few lines above in the statement:
> uint8_t *udata_base_addr = pool->s.pool_base_addr + mdata_size;
> uint8_t *block_base_addr = udata_base_addr + udata_size;

That's the point. Local udata_base_addr is initialized, but then
uninitialized pool->s.udata_base_addr is used, which leads to segfault.

Maybe you have sent not the latest patch?

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

Reply via email to