[dpdk-dev] drivers/net/i40e/i40e_fdir.c: Improved i40e FDIR programming times
Checks
Commit Message
Hi, Lijia
Thanks for the patch? Are you using git send-email.
The mail is html format, not friendly to discuss by mail thread.
About the change, just one comments:
>+ uint32_t w;
Could you move it above?
Thanks
From: Michael Lilja [mailto:ml@napatech.com]
Sent: Wednesday, April 26, 2017 7:15 PM
To: elin.zhang@intel.com; Wu, Jingjing <jingjing.wu@intel.com>
Cc: dev@dpdk.org
Subject: [PATCH] drivers/net/i40e/i40e_fdir.c: Improved i40e FDIR programming times
During my work (https://www.napatech.com/hw-acceleration-via-rte_flow/)on a flowtable application example that use rte_flow I discovered that the rte_flow programming times on a i40e was +11ms. The patch below result in an average programming time of 22usec with a max of 60usec instead of +11ms.
Could the following patch be useful? There might be a good reason for the original code, I'm unable to tell, so I will let it up to the maintainer to decide.
Signed-off-by: Michael Lilja <ml@napatech.com>
---
drivers/net/i40e/i40e_fdir.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
@@ -1296,23 +1296,29 @@ i40e_fdir_filter_programming(struct i40e_pf *pf,
rte_wmb();
I40E_PCI_REG_WRITE(txq->qtx_tail, txq->tx_tail);
- for (i = 0; i < I40E_FDIR_WAIT_COUNT; i++) {
- rte_delay_us(I40E_FDIR_WAIT_INTERVAL_US);
+ for (i = 0; i < (I40E_FDIR_WAIT_COUNT * I40E_FDIR_WAIT_INTERVAL_US); i++) {
if ((txdp->cmd_type_offset_bsz &
rte_cpu_to_le_64(I40E_TXD_QW1_DTYPE_MASK)) ==
rte_cpu_to_le_64(I40E_TX_DESC_DTYPE_DESC_DONE))
break;
+ rte_delay_us(1);
}
- if (i >= I40E_FDIR_WAIT_COUNT) {
+ if (i >= (I40E_FDIR_WAIT_COUNT * I40E_FDIR_WAIT_INTERVAL_US)) {
PMD_DRV_LOG(ERR, "Failed to program FDIR filter:"
" time out to get DD on tx queue.");
return -ETIMEDOUT;
}
/* totally delay 10 ms to check programming status*/
- rte_delay_us((I40E_FDIR_WAIT_COUNT - i) * I40E_FDIR_WAIT_INTERVAL_US);
+ uint32_t w;
+ for (w = 0; w < (I40E_FDIR_WAIT_COUNT * I40E_FDIR_WAIT_INTERVAL_US); w++) {
+ if (i40e_check_fdir_programming_status(rxq) >= 0) {
+ break;
+ }
+ rte_delay_us(1);
+ }
if (i40e_check_fdir_programming_status(rxq) < 0) {
PMD_DRV_LOG(ERR, "Failed to program FDIR filter:"
- " programming status reported.");
+ " programming status reported.");
return -ENOSYS;
}