2016-10-11 22:56 GMT+02:00 Wiles, Keith <keith.wiles at intel.com>:
>> On Oct 11, 2016, at 6:30 AM, Micha? Miros?aw <mirqus at gmail.com> wrote:
>>
>> 2016-10-04 16:45 GMT+02:00, Keith Wiles <keith.wiles at intel.com>:
>>> The rte_eth_tap.c PMD creates a device using TUN/TAP interfaces
>>> on the local host. The PMD allows for DPDK and the host to
>>> communicate using a raw device interface on the host and in
>>> the DPDK application. The device created is a Tap device with
>>> a L2 packet header.
>> [...]
>>> +static uint16_t
>>> +pmd_rx_burst(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
>>> +{
>>> + int len, n;
>>> + struct rte_mbuf *mbuf;
>>> + struct rx_queue *rxq = queue;
>>> + struct pollfd pfd;
>>> + uint16_t num_rx;
>>> + unsigned long num_rx_bytes = 0;
>>> +
>>> + pfd.events = POLLIN;
>>> + pfd.fd = rxq->fd;
>>> + for (num_rx = 0; num_rx < nb_pkts; ) {
>>> + n = poll(&pfd, 1, 0);
>>> +
>>> + if (n <= 0)
>>> + break;
>>> +
>>
>> Considering that syscalls are rather expensive, it would be cheaper to
>> allocate an mbuf here and free it when read() returns -1 instead of
>> calling poll() to check whether a packet is waiting. This way you
>> save a syscall per packet and replace one syscall with one mbuf free
>> per poll.
>
> I made this change, but saw no performance difference in the two methods.
> Removing poll seems reasonable as it is simpler. TAP is already so slow is
> why the performance did not change is my guess. Anyone wanting to use TAP as
> a high performance interface is going to be surprised. I believe the best use
> case for the TAP interface is for control or exception path.
Agreed, TAP does not look like designed for performance as a first goal.
You could do the same simplification for TX path, BTW.
Best Regards,
Micha? Miros?aw