On Sat, Nov 11, 2017 at 09:18:45PM +0400, Ilya Matveychikov wrote: > Folks, > > Are you serious with it: > > typedef uint16_t (*eth_rx_burst_t)(void *rxq, > struct rte_mbuf **rx_pkts, > uint16_t nb_pkts); > typedef uint16_t (*eth_tx_burst_t)(void *txq, > struct rte_mbuf **tx_pkts, > uint16_t nb_pkts); > > I’m not surprised that every PMD stores port_id in every and each queue as > having just the queue as an argument doesn’t allow to get the device. So the > question is - why not to use something like: > > typedef uint16_t (*eth_rx_burst_t)(void *dev, uint16_t queue_id, > struct rte_mbuf **rx_pkts, > uint16_t nb_pkts); > typedef uint16_t (*eth_tx_burst_t)(void *dev, uint16_t queue_id, > struct rte_mbuf **tx_pkts, > uint16_t nb_pkts);
I assume it's since the rte_eth_[rt]x_burst() wrappers already pay the price for that indirection, doing it twice would be redundant. Basically the cost of storing a back-pointer to dev or a queue index in each Rx/Tx queue structure is minor compared to saving a couple of CPU cycles wherever we can. I'm not saying its the only solution nor the right approach, it's only one possible explanation for this API. -- Adrien Mazarguil 6WIND