Matias Elo(matiaselo) replied on github web page:
platform/linux-generic/pktio/socket_mmap.c
line 98
@@ -251,6 +263,50 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t
*pktio_entry,
return nb_rx;
}
+static unsigned handle_pending_frames(int sock, struct ring *ring, int frames)
+{
+ int i;
+ int retry = 0;
+ unsigned nb_tx = 0;
+ unsigned frame_num;
+ unsigned frame_count = ring->rd_num;
+ unsigned first_frame_num = ring->frame_num;
+
+ for (frame_num = first_frame_num, i = 0; i < frames; i++) {
+ struct tpacket2_hdr *hdr = ring->rd[frame_num].iov_base;
+
+ if (odp_likely(hdr->tp_status == TP_STATUS_AVAILABLE ||
+ hdr->tp_status == TP_STATUS_SENDING)) {
+ nb_tx++;
+ } else if (hdr->tp_status == TP_STATUS_SEND_REQUEST) {
+ if (retry++ < TX_RETRIES) {
+ struct timespec ts = { .tv_nsec = TX_RETRY_NSEC,
+ .tv_sec = 0 };
+
+ sendto(sock, NULL, 0, MSG_DONTWAIT, NULL, 0);
+ nanosleep(&ts, NULL);
+ i--;
+ continue;
+ } else {
+ hdr->tp_status = TP_STATUS_AVAILABLE;
+ }
+ } else { /* TP_STATUS_WRONG_FORMAT */
+ /* Don't try re-sending frames after failure */
+ for (; i < frames; i++) {
+ hdr = ring->rd[frame_num].iov_base;
+ hdr->tp_status = TP_STATUS_AVAILABLE;
+ frame_num = next_frame(frame_num, frame_count);
+ }
+ break;
+ }
+ frame_num = next_frame(frame_num, frame_count);
+ }
+
+ ring->frame_num = (first_frame_num + nb_tx) % frame_count;
Comment:
Will fix.
> Matias Elo(matiaselo) wrote:
> ring->rd_num is not guaranteed to be a power of two. At least on my test
> system (28 lcores) it is not.
>> Matias Elo(matiaselo) wrote:
>> Will fix.
>>> Matias Elo(matiaselo) wrote:
>>> This array is used to update `stats.out_octets` correctly if `enq_multi()`
>>> fails to enqueue all packets. Without it a second for loop would be
>>> required inside `if (ret > 0)` clause below.
>>>> Matias Elo(matiaselo) wrote:
>>>> The most specific error type an application can see is
>>>> odp_packet_has_l2_error(), so it cannot trust packet contents anyway.
>>>>> Matias Elo(matiaselo) wrote:
>>>>> Will fix.
>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>> The error bit simply says the packet was truncated to max length.
>>>>>> Perhaps the application is only interested in the first few bytes of a
>>>>>> packet?
>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>> `ring->frame_num = next_frame(first_frame_num + nb_tx - 1,
>>>>>>> frame_count);` is an alternative here.
>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>> Since `ring->rd_num` is a power of two, is the concern here that the
>>>>>>>> `%` operator might result in a division if the compiler doesn't know
>>>>>>>> that it's a power of two? In that case:
>>>>>>>> ```
>>>>>>>> return ++cur_frame & (frame_count - 1);
>>>>>>>> ```
>>>>>>>> solves that problem and avoids conditional branching.
>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>> If we're cleaning up, might as well delete that extraneous `+` in the
>>>>>>>>> above line: `TPACKET_ALIGNMENT + + (pz - 1)) & (-pz);` I'm surprised
>>>>>>>>> the compiler doesn't flag that since it's normally so picky about
>>>>>>>>> issuing warnings.
>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>> Not sure I understand what `out_octets_tbl` is accumulating here. If
>>>>>>>>>> I'm sending three 100 byte packets this will set `out_octets_tbl[0]`
>>>>>>>>>> to 100, `out_octets_tbl[1]` to 200, and `out_octets_tbl[2]` to 300.
>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>> Since you're doing miscellaneous cleanups anyway, perhaps changing
>>>>>>>>>>> `len` to `num` here should be considered? `len` is confusing since
>>>>>>>>>>> it doesn't represent packet length.
>>>>>>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>>>>>>> The odp_pktin_maxlen() API states:
>>>>>>>>>>>> > Maximum frame length in bytes that the packet IO interface can
>>>>>>>>>>>> > receive.
>>>>>>>>>>>>
>>>>>>>>>>>> I interpret this so that the application shouln't see packets
>>>>>>>>>>>> which exceed pktin max length.
>>>>>>>>>>>>
>>>>>>>>>>>>> muvarov wrote
>>>>>>>>>>>>> same here.
>>>>>>>>>>>>>> muvarov wrote
>>>>>>>>>>>>>> maybe to just set error bit and deliver this packet to
>>>>>>>>>>>>>> application?
https://github.com/Linaro/odp/pull/397#discussion_r162331990
updated_at 2018-01-18 12:49:24