On 26 April 2017 at 07:10, Elo, Matias (Nokia - FI/Espoo)
<[email protected]> wrote:
>
>> On 19 Apr 2017, at 10:14, Brian Brooks <[email protected]> wrote:
>>
>> Signed-off-by: Kevin Wang <[email protected]>
>> ---
>> platform/linux-generic/pktio/loop.c | 11 +++++++++--
>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>
>> diff --git a/platform/linux-generic/pktio/loop.c
>> b/platform/linux-generic/pktio/loop.c
>> index e9ad22ba..cbb15179 100644
>> --- a/platform/linux-generic/pktio/loop.c
>> +++ b/platform/linux-generic/pktio/loop.c
>> @@ -80,11 +80,13 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int
>> index ODP_UNUSED,
>>
>> for (i = 0; i < nbr; i++) {
>> uint32_t pkt_len;
>> -
>> +#ifdef ODP_SCHEDULE_SCALABLE
>> + pkt = _odp_packet_from_buffer((odp_buffer_t)(hdr_tbl[i]));
>> +#else
>> pkt = _odp_packet_from_buffer(odp_hdr_to_buf(hdr_tbl[i]));
>> +#endif
>> pkt_len = odp_packet_len(pkt);
>>
>> -
>
> No #ifdef code please. Especially since the pktio should be completely
> independent
> from the scheduler code.
Agree. I wish the pktio was independent of scheduler/queues.
odp_packet_t -> pointer to void (memory address) -> not symmetrical to
odp_buffer_t
odp_packet_hdr_t -> pointer to void (memory address)
odp_buffer_t -> pointer to void (stores {pool_id, index})
odp_buffer_hdr_t -> pointer to void (memory address)
odp_event_t -> pointer to void (stores {pool_id, index})
The default queue stores odp_buffer_hdr_t in its linked list. So,
odp_event_t is converted to odp_buffer_hdr_t as the linked list 'next'
pointer is part of odp_buffer_hdr_t.
The scalable queues store odp_event_t because it does not depend on
the 'next' pointer in the odp_buffer_hdr_t, there is no need to take
the overhead of conversion.
In the loopback_recv function, the odp_packet_t needs to be converted
to odp_buffer_hdr_t for default queues (there is multi-level
conversion happening here (memory address->handle->memory address),
should be just a typecast)
For scalable queues, the conversion needs to be happen from
odp_packet_t to odp_event_t.
>
>> if (pktio_cls_enabled(pktio_entry)) {
>> odp_packet_t new_pkt;
>> odp_pool_t new_pool;
>> @@ -163,7 +165,12 @@ static int loopback_send(pktio_entry_t *pktio_entry,
>> int index ODP_UNUSED,
>> len = QUEUE_MULTI_MAX;
>>
>> for (i = 0; i < len; ++i) {
>> +#ifdef ODP_SCHEDULE_SCALABLE
>> + hdr_tbl[i] = (odp_buffer_hdr_t *)(uintptr_t)
>> + _odp_packet_to_buffer(pkt_tbl[i]);
>> +#else
>> hdr_tbl[i] = buf_hdl_to_hdr(_odp_packet_to_buffer(pkt_tbl[i]));
>> +#endif
>> bytes += odp_packet_len(pkt_tbl[i]);
>> }
>>
>> --
>> 2.12.2
>>
>