Dmitry Eremin-Solenikov(lumag) replied on github web page:
test/validation/api/pktio/pktio.c
line 16
@@ -1195,10 +1195,8 @@ void pktio_test_index(void)
ndx = odp_pktio_index(pktio);
CU_ASSERT(ndx >= 0);
- CU_ASSERT(odp_pktio_index(pktio_inval) < 0);
CU_ASSERT(odp_pktio_close(pktio) == 0);
- CU_ASSERT(odp_pktio_index(pktio) < 0);
Comment:
@psavol Totally agree about close + index.
> Petri Savolainen(psavol) wrote:
> To me "(e.g. handle not valid)" does not yet guarantee the check. This would:
> "<0 When pktio handle is invalid, or some other error happened".
>
> In general, we should remove all such "e.g. handle not valid" comments.
>> Petri Savolainen(psavol) wrote:
>> API does not (and should not) guarantee that invalid or stale handles are
>> checked on fast path functions, such as this conversion to index.
>> Especially, any API function is not specified to check against stale
>> handles. Function may return -1, if it finds an error but we don't guarantee
>> which errors are checked. For example, there may be check against invalid
>> handle, but there may not be either. Invalid values are mostly needed for
>> API function to be able return that e.g. create/open/alloc failed. E.g.
>> here, application should check that pktio open succeeded, if it did not
>> succeed it should not continue and pass that invalid handle to other pktio
>> calls. That way every API call does not need to check the handle, only
>> application needs to check it once after open/create/alloc.
>>
>> This close + index test above it basically the same thing as doing:
>> odp_packet_free(pkt);
>> data = odp_packet_data(pkt);
>> // now we can assume that data is NULL, since pkt packet was freed and this
>> function always searches through valid handles and notices that this handle
>> value is not valid anymore.
>>> Petri Savolainen(psavol) wrote:
>>> Those need to be inside #include <odp/visibility_begin.h> #include
>>> <odp/visibility_end.h>. It's cleaner to have one vs multiple such regions
>>> in one c file.
>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>> We can have `_odp_pktio_index()` which does not perform such checks and
>>>> `odp_pktio_index()` which does `ODP_PKTIO_INVALID` check.
>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>> Generally I would agree. However we explicitly have the invalid usecase
>>>>> in API:
>>>>> ```
>>>>> @retval <0 On failure (e.g., handle not valid)
>>>>> ```
>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>> Is there a reason to move function bodies?
>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>> Maybe `(uintptr_t)(handle) == (uintptr_t)0` would do the trick?
>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>> Very strange. I'm Ok with this workaround, but a comment about clang
>>>>>>>> version might be appropriate. Don't know if it's worth doing a clang
>>>>>>>> version check. We do things like that in the `ODP_STATIC_ASSERT()`
>>>>>>>> macro itself for similar reasons.
>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>> odp_packet.c:52:19: error: static_assert expression is not an
>>>>>>>>> integral constant
>>>>>>>>> expression
>>>>>>>>> ODP_STATIC_ASSERT(_odp_typeval(ODP_BUFFER_INVALID) == 0, "Buffer
>>>>>>>>> inval not 0");
>>>>>>>>> ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>> ../../platform/linux-generic/include/odp/api/plat/strong_types.h:32:30:
>>>>>>>>> note:
>>>>>>>>> expanded from macro '_odp_typeval'
>>>>>>>>> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle))
>>>>>>>>> ^
>>>>>>>>> ../../include/odp/api/abi-default/debug.h:26:53: note: expanded from
>>>>>>>>> macro
>>>>>>>>> 'ODP_STATIC_ASSERT'
>>>>>>>>> #define ODP_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg)
>>>>>>>>> ^~~~
>>>>>>>>> odp_packet.c:52:19: note: cast that performs the conversions of a
>>>>>>>>> reinterpret_cast is not allowed in a constant expression
>>>>>>>>> ../../platform/linux-generic/include/odp/api/plat/strong_types.h:32:41:
>>>>>>>>> note:
>>>>>>>>> expanded from macro '_odp_typeval'
>>>>>>>>> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle))
>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>> static_assert() seems special. The clang version in Travis does not
>>>>>>>>>> accept type casts with static_assert(). The cast confuses it to
>>>>>>>>>> think that (uintptr_t)0 == 0 is not an integral constant.
>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>> `_odp_typeval()` is defined as:
>>>>>>>>>>> ```
>>>>>>>>>>> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle))
>>>>>>>>>>> ```
>>>>>>>>>>> It's used elsewhere in the ODP code and clang doesn't have any
>>>>>>>>>>> problem with it. I've verified this works for clang 4.2.1. Since
>>>>>>>>>>> it works elsewhere on Travis I'm not sure why it wouldn't in this
>>>>>>>>>>> instance.
>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>> I'm OK with just a modified commit name. I agree we needn't be too
>>>>>>>>>>>> granular about these things.
>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>> I could rename the patch to:
>>>>>>>>>>>>> "linux-gen: packet: use inlined flow hash and ts set"
>>>>>>>>>>>>>
>>>>>>>>>>>>> ... if necessary. The comment says already that also ts set is
>>>>>>>>>>>>> modified the same way.
>>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>>> I did try several combinations of type casts of invalid values,
>>>>>>>>>>>>>> also cast to uintptr_t. The problem is that gcc and clang (clang
>>>>>>>>>>>>>> version 3.8.0-2ubuntu4) of my machine accepted all of those
>>>>>>>>>>>>>> casts, but the clang version in Travis (clang version
>>>>>>>>>>>>>> 3.8.0-2ubuntu3~trusty5) does not accept anything.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Maybe it's a bug in the particular version of clang. Anyway,
>>>>>>>>>>>>>> addition of this check even only on gcc side is improvement
>>>>>>>>>>>>>> against what we currently have (no check). Packet invalid is
>>>>>>>>>>>>>> currently 0xfffffff in ABI spec, but event/buffer invalid are 0.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> odp_packet.c:55:19: error: static_assert expression is not an
>>>>>>>>>>>>>> integral constant
>>>>>>>>>>>>>> expression
>>>>>>>>>>>>>> ODP_STATIC_ASSERT(((uintptr_t)ODP_PACKET_INVALID) == 0, "Packet
>>>>>>>>>>>>>> invalid not 0");
>>>>>>>>>>>>>> ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>>>>>> ../../include/odp/api/abi-default/debug.h:26:53: note: expanded
>>>>>>>>>>>>>> from macro
>>>>>>>>>>>>>> 'ODP_STATIC_ASSERT'
>>>>>>>>>>>>>> #define ODP_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg)
>>>>>>>>>>>>>> ^~~~
>>>>>>>>>>>>>> odp_packet.c:55:20: note: cast that performs the conversions of a
>>>>>>>>>>>>>> reinterpret_cast is not allowed in a constant expression
>>>>>>>>>>>>>> ODP_STATIC_ASSERT(((uintptr_t)ODP_PACKET_INVALID) == 0, "Packet
>>>>>>>>>>>>>> invalid not 0");
>>>>>>>>>>>>>> ^
>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>> Since you want to breech the strong type you need to use the
>>>>>>>>>>>>>>> internal `odp_typeval()` macro here.
>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>> ODP_STATIC_ASSERT(_odp_typeval(ODP_EVENT_INVALID) == 0, "Event
>>>>>>>>>>>>>>> invalid not 0");
>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>> etc. I've verified that this works fine for clang, so no need
>>>>>>>>>>>>>>> for the conditional compilation.
>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>> Should this be in its own commit? Different function.
https://github.com/Linaro/odp/pull/437#discussion_r165285392
updated_at 2018-02-01 08:29:14