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. Best Regards, Micha??Miros?aw