muvarov replied on github web page:

platform/linux-generic/odp_packet_io.c
line 22
@@ -1577,10 +1577,27 @@ int odp_pktin_recv_tmo(odp_pktin_queue_t queue, 
odp_packet_t packets[], int num,
        odp_time_t t1, t2;
        struct timespec ts;
        int started = 0;
+       pktio_entry_t *entry;
 
        ts.tv_sec  = 0;
        ts.tv_nsec = SLEEP_NSEC;
 
+       entry = get_pktio_entry(queue.pktio);
+       if (entry == NULL) {
+               ODP_DBG("pktio entry %d does not exist\n", queue.pktio);
+               return -1;
+       }
+
+       if (entry->s.ops->recv_tmo) {
+               uint64_t usecs = (wait * SLEEP_NSEC + 999) / 1000;
+
+               if (wait == ODP_PKTIN_WAIT)
+                       usecs = ODP_PKTIN_WAIT;
+
+               return entry->s.ops->recv_tmo(entry, queue.index, packets, num,
+                                             usecs);


Comment:
just pass nsec to drivers or you will have double calculation like in netmap 
code.

> Juha-Matti Tilli(jmtilli) wrote:
> Are you entirely sure about this? This is a function pointer, and if two 
> pktio devices have the same function pointer for recv_mq_tmo(), the other 
> function pointers including the recv() function pointer should be identical 
> as well. We do pass the device (entry[i]) to the function pointed to by 
> recv_mq_tmo as well, so it should be able to update the correct counters. The 
> ops structure is const, after all...
> 
> So, when receiving packets from a particular device using netmap, we do call 
> netmap_recv() and pass to it the pktio_entry[i] and also index[i] for the 
> queue index. This is the same that the odp_pktin_recv_mq_tmo() function 
> already did. It calls odp_pktin_recv() in a loop, and the latter function 
> calls entry->s.ops->recv(entry, queue.index, packets, num); which to me seems 
> to be exactly the same thing -- you pass exactly the same entry and the same 
> queue.index. Same function, same arguments, I can't see how the behavior 
> would be different...
> 
> Now, if somebody opposes the .recv_mq_tmo function pointer due to added code 
> line count, I might perhaps agree. But it seems to be the only way the DPDK 
> support for genuine sleep could be added, so I see some value in it.


>> Juha-Matti Tilli(jmtilli) wrote:
>> Several options: (1) I could implement a binary search algorithm that 
>> incrementally checks various usec values and uses odp_pktin_wait_time() to 
>> check which one of these trial attempts result in the same sleep wait value, 
>> but that would be slow; (2) I could implement odp_pktin_wait_time_reverse() 
>> that does the conversion in the other direction, but that would be an API 
>> change; (3) I could just do the conversion and pass usec values instead of 
>> sleep wait values. I carefully considered each and selected (3), but do you 
>> think (2) or (1) would be better?


>>> Juha-Matti Tilli(jmtilli) wrote:
>>> Will fix.


>>>> Juha-Matti Tilli(jmtilli) wrote:
>>>> I disagree. SLEEP_NSEC is a private #define in odp_packet_io.c so what the 
>>>> wait parameter actually means cannot be interpreted in the drivers. 
>>>> (Believe me, I tried it!) Thus, the conversion from the sleep wait 
>>>> parameter to microseconds is needed.


>>>>> Matias Elo(matiaselo) wrote:
>>>>> As I noted in the previous comment, I think this check isn't enough. The 
>>>>> input queues would have to be from the same pktio device for this to work.


>>>>>> Matias Elo(matiaselo) wrote:
>>>>>> Internal functions should not use odp_ prefix.


>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>> You should pass the `wait` parameter to `entry->s.ops->recv_tmo()` and 
>>>>>>> not do any conversions here.


>>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>>> ODP_TIME_SEC_IN_NS would work here.


https://github.com/Linaro/odp/pull/341#discussion_r157292206
updated_at 2017-12-15 20:27:24

Reply via email to