On 8/26/2021 1:37 PM, Jerin Jacob wrote: > On Fri, Aug 20, 2021 at 9:59 PM Konstantin Ananyev > <konstantin.anan...@intel.com> wrote: >> >> NOTE: This is just an RFC to start further discussion and collect the >> feedback. >> Due to significant amount of work, changes required are applied only to two >> PMDs so far: net/i40e and net/ice. >> So to build it you'll need to add: >> -Denable_drivers='common/*,mempool/*,net/ice,net/i40e' >> to your config options. > >> >> That approach was selected to avoid(/minimize) possible performance losses. >> >> So far I done only limited amount functional and performance testing. >> Didn't spot any functional problems, and performance numbers >> remains the same before and after the patch on my box (testpmd, macswap fwd). > > > Based on testing on octeonxt2. We see some regression in testpmd and > bit on l3fwd too. > > Without patch: 73.5mpps/core in testpmd iofwd > With out patch: 72 5mpps/core in testpmd iofwd >
So roughly 1.3% drop. > Based on my understanding it is due to additional indirection. > What is the additional indirection? I can see all dereferences area same. > My suggestion to fix the problem by: > Removing the additional `data` redirection and pull callback function > pointers back > and keep rest as opaque as done in the existing patch like [1] > > I don't believe this has any real implication on future ABI stability > as we will not be adding > any new item in rte_eth_fp in any way as new features can be added in slowpath > rte_eth_dev as mentioned in the patch. > > [2] is the patch of doing the same as I don't see any performance > regression after [2]. > Only there is an additional check after Konstantin's patch (in both 'rte_eth_rx_burst()' & 'rte_eth_tx_burst()'): " if (port_id >= RTE_MAX_ETHPORTS) return -EINVAL; " Which I can see removed again in your patch [2] which fixes the regression. I wonder if this can be reason of restoring the performance drop, can you please test original patch by just removing the 'RTE_MAX_ETHPORTS' check? Thanks, ferruh > > [1] > - struct rte_eth_burst_api { > - struct rte_eth_fp { > + void *data; > rte_eth_rx_burst_t rx_pkt_burst; > /**< PMD receive function. */ > rte_eth_tx_burst_t tx_pkt_burst; > @@ -85,8 +100,19 @@ struct rte_eth_burst_api { > /**< Check the status of a Rx descriptor. */ > rte_eth_tx_descriptor_status_t tx_descriptor_status; > /**< Check the status of a Tx descriptor. */ > + /** > + * User-supplied functions called from rx_burst to post-process > + * received packets before passing them to the user > + */ > + struct rte_eth_rxtx_callback > + *post_rx_burst_cbs[RTE_MAX_QUEUES_PER_PORT]; > + /** > + * User-supplied functions called from tx_burst to pre-process > + * received packets before passing them to the driver for transmission. > + */ > + struct rte_eth_rxtx_callback *pre_tx_burst_cbs[RTE_MAX_QUEUES_PER_PORT]; > uintptr_t reserved[2]; > -} __rte_cache_min_aligned; > +} __rte_cache_aligned; > > [2] > https://pastebin.com/CuqkrCW4 >