Hi John, On 02/13/2015 04:39 PM, John McNamara wrote: > From: Richardson, Bruce <bruce.richardson at intel.com> > > Example showing how callbacks can be used to insert a timestamp > into each packet on RX. On TX the timestamp is used to calculate > the packet latency through the app, in cycles. > > Signed-off-by: Bruce Richardson <bruce.richardson at intel.com>
I'm looking at the example and I don't understand what is the advantage of having callbacks in ethdev layer, knowing that the application can do the same job by a standard function call. What is the advantage of having callbacks compared to: for (port = 0; port < nb_ports; port++) { struct rte_mbuf *bufs[BURST_SIZE]; const uint16_t nb_rx = rte_eth_rx_burst(port, 0, bufs, BURST_SIZE); if (unlikely(nb_rx == 0)) continue; add_timestamp(bufs, nb_rx); const uint16_t nb_tx = rte_eth_tx_burst(port ^ 1, 0, bufs, nb_rx); calc_latency(bufs, nb_tx); if (unlikely(nb_tx < nb_rx)) { uint16_t buf; for (buf = nb_tx; buf < nb_rx; buf++) rte_pktmbuf_free(bufs[buf]); } } To me, doing like the code above has several advantages: - code is more readable: the callback is explicitly invoked, so there is no risk to forget it - code is faster: the functions calls can be inlined by the compiler - easier to handle error cases in the callback function as the error code is accessible to the application - there is no need to add code in ethdev api to do this - if the application does not want to use callbacks (I suppose most applications), it won't have any performance impact Regards, Olivier