Petri Savolainen(psavol) replied on github web page:

platform/linux-generic/odp_packet.c
line 34
@@ -944,6 +949,45 @@ odp_event_t odp_packet_to_event(odp_packet_t pkt)
        return (odp_event_t)buffer_handle(packet_hdr(pkt));
 }
 
+void odp_packet_from_event_multi(odp_packet_t pkt[], const odp_event_t ev[],
+                                int num)
+{
+       int i;
+
+       for (i = 0; i < num; i++)
+               pkt[i] = odp_packet_from_event(ev[i]);
+}
+
+void odp_packet_to_event_multi(const odp_packet_t pkt[], odp_event_t ev[],
+                              int num)
+{
+       int i;
+
+       for (i = 0; i < num; i++)
+               ev[i] = odp_packet_to_event(pkt[i]);
+}
+
+int odp_event_filter_packet(const odp_event_t event[],


Comment:
Yes.

> Petri Savolainen(psavol) wrote:
> Schedulers do not work that way. You cannot peak into head of schedule queue 
> and ignore non-packets and just select packets. Scheduler returns N events.
> 
> Also storing non-packets locally (inside scheduler SW) would not help, since 
> application could easily starve non-packets by polling those too seldom. 


>> Petri Savolainen(psavol) wrote:
>> The same answer. Improved implementation efficiency and cleaner application 
>> code.


>>> Petri Savolainen(psavol) wrote:
>>> pkts = odp_schedule_multi(NULL, ODP_SCHED_NO_WAIT, ev_tbl, MAX_PKT_BURST);
>>> 
>>> if (pkts <= 0)
>>>     continue;
>>> 
>>> for (i = 0; i < pkts; i++)
>>>     pkt_tbl[i] = odp_packet_from_event(ev_tbl[i]);
>>> 
>>> VS.
>>> 
>>> odp_packet_from_event_multi(pkt_tlb, ev_tbl, num_pkts);
>>> 
>>> 1) Single call vs. many calls makes difference when not inlined (ABI 
>>> compat).
>>> 2) This is not only cast, it's also a copy of the handle. Implementation 
>>> may be vectorized, for loop unrolled, etc.
>>> 3) Depending on implementation the conversion may include additional things 
>>> to the handle copy: extra checks, post processing of the event, etc 
>>> HW/implementation specific tricks. Which would open more optimization 
>>> opportunity in addition to load+store.
>>> 4) Application code is cleaner 


>>>> Petri Savolainen(psavol) wrote:
>>>> The same answer. Improved implementation efficiency.


>>>>> Petri Savolainen(psavol) wrote:
>>>>> " Handles are outputted to both arrays in the same order those are stored 
>>>>> in 'event' array. "
>>>>> 
>>>>> Events are not reordered. Packets are copied into packet[] and 
>>>>> non-packets into remain[]. Both arrays maintain p and np order of the 
>>>>> original array. Also original array is not modified.
>>>>> 
>>>>> packet[] = p1, p2, p3
>>>>> remain[] = np1, np2


>>>>>> muvarov wrote
>>>>>> why not odp_schedule_type(ODP_PACKET,  void  *array) ? I.e. if you need 
>>>>>> only packets then do scheduling only for packets. That has to be more 
>>>>>> fast than get all and then filer them.


>>>>>>> muvarov wrote
>>>>>>> is it valid case when odp_schedule() returns mixed events types? I.e. 
>>>>>>> some packets, some timeouts, some packets from one pool and packets 
>>>>>>> from other pool.


>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>> Application knows the configuration, so it knows when all packets 
>>>>>>>> (e.g. from certain queue/pkt input/etc) are allocated from the same 
>>>>>>>> pool. When that's the case, free implementation can be more efficient 
>>>>>>>> (than today) as it does not have to access/check/sort all packets of 
>>>>>>>> the burst. It can just free all into the pool of the first packet. 


>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>> Doesn't this reorder events? As described consider an array of events 
>>>>>>>>> that consist of packets (p) and non-packets (np).
>>>>>>>>> 
>>>>>>>>> With an input array of events: np1, p1, np2, p2, p3 as described 
>>>>>>>>> `odp_event_filter_packet()` would have RC = 3, the `packet[]` array 
>>>>>>>>> would contain p1, p2, p3, and the `remain[]` event would contain np1, 
>>>>>>>>> np2.  Is that behavior what we want?


>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>> Even with the `odp_event_type_multi()` API semantics, it's still not 
>>>>>>>>>> clear why this is needed. Given that `odp_packet_from_event()` is 
>>>>>>>>>> likely just a cast there doesn't seem to be a great deal to be 
>>>>>>>>>> gained by having a `multi` version of this which can't be easily 
>>>>>>>>>> inlined away.


>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>> Again since `odp_packet_to_event()` is likely to be just a cast 
>>>>>>>>>>> that can be inlined away it's not clear why a `multi` version is 
>>>>>>>>>>> needed.


>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>> Again, it's not clear why this is needed. 


>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>> Not clear why this is needed. How does an application determine 
>>>>>>>>>>>>> this more efficiently than the implementation would?


https://github.com/Linaro/odp/pull/318#discussion_r154608767
updated_at 2017-12-04 10:24:55

Reply via email to