Juha-Matti Tilli(jmtilli) replied on github web page:

platform/linux-generic/odp_packet_io.c
line 104
@@ -1626,6 +1683,68 @@ int odp_pktin_recv_mq_tmo(const odp_pktin_queue_t 
queues[], unsigned num_q,
        odp_time_t t1, t2;
        struct timespec ts;
        int started = 0;
+       pktio_entry_t *entry[num_q];
+       int index[num_q];
+       fd_set readfds;
+       int maxfd = -1;
+       uint64_t usecs = (wait * SLEEP_NSEC + 999) / 1000;
+       int (*impl)(int num_q, pktio_entry_t *entry[], int index[],
+                   odp_packet_t packets[], int num, unsigned *from,
+                   uint64_t wait_usecs) = NULL;
+       int impl_set = 0;
+
+       if (wait == ODP_PKTIN_WAIT)
+               usecs = ODP_PKTIN_WAIT;
+
+       for (i = 0; i < num_q; i++) {
+               entry[i] = get_pktio_entry(queues[i].pktio);
+               index[i] = queues[i].index;
+               if (entry[i] == NULL) {
+                       ODP_DBG("pktio entry %d does not exist\n",
+                               queues[i].pktio);
+                       return -1;
+               }
+               if (!impl_set) {
+                       impl = entry[i]->s.ops->recv_mq_tmo;
+                       impl_set = 1;
+               } else {
+                       if (impl != entry[i]->s.ops->recv_mq_tmo) {


Comment:
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_r157253391
updated_at 2017-12-15 17:14:33

Reply via email to