Bill Fischofer(Bill-Fischofer-Linaro) 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:
`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_r162224859
updated_at 2018-01-18 01:19:27