[v3,1/4] ethdev: add trace points

Message ID 20221006151844.23483-2-adwivedi@marvell.com (mailing list archive)
State Changes Requested, archived
Delegated to: Ferruh Yigit
Headers
Series add trace points in ethdev library |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/iol-testing warning apply patch failure

Commit Message

Ankur Dwivedi Oct. 6, 2022, 3:18 p.m. UTC
  Add trace points for ethdev functions.

Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>
---
 lib/ethdev/ethdev_private.c      |    3 +
 lib/ethdev/ethdev_trace_points.c |  435 +++++++++++
 lib/ethdev/rte_ethdev.c          |  152 ++++
 lib/ethdev/rte_ethdev_trace.h    | 1194 ++++++++++++++++++++++++++++++
 lib/ethdev/rte_ethdev_trace_fp.h |   19 +
 lib/ethdev/version.map           |  144 ++++
 6 files changed, 1947 insertions(+)
  

Comments

Morten Brørup Oct. 6, 2022, 4:03 p.m. UTC | #1
> From: Ankur Dwivedi [mailto:adwivedi@marvell.com]
> Sent: Thursday, 6 October 2022 17.19
> 
> Add trace points for ethdev functions.
> 
> Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>
> ---

I did my best, but this series needs review by people with direct knowledge about the affected functions.

rte_eth_call_rx/tx_callbacks() are treated as fast path functions, but I think more functions should be too:


rte_eth_tx_buffer_drop_callback() and rte_eth_tx_buffer_count_callback() are certainly fast path functions.

rte_eth_tx_done_cleanup()probably is too.

rte_eth_macaddr_get() could be, but probably isn't. If treated as slow path, it could be noted in its documentation.

I don't know about rte_eth_timesync_read_rx/tx_timestamp(), rte_eth_timesync_adjust/read/write_time() and rte_eth_read_clock().
  
Ankur Dwivedi Oct. 7, 2022, 4:23 p.m. UTC | #2
Hi Morten,

>-----Original Message-----
>From: Ankur Dwivedi <adwivedi@marvell.com>
>Sent: Thursday, October 6, 2022 8:49 PM
>To: dev@dpdk.org
>Cc: thomas@monjalon.net; mdr@ashroe.eu; orika@nvidia.com;
>ferruh.yigit@xilinx.com; chas3@att.com; humin29@huawei.com;
>linville@tuxdriver.com; ciara.loftus@intel.com; qi.z.zhang@intel.com;
>mw@semihalf.com; mk@semihalf.com; shaibran@amazon.com;
>evgenys@amazon.com; igorch@amazon.com; chandu@amd.com; Igor
>Russkikh <irusskikh@marvell.com>; shepard.siegel@atomicrules.com;
>ed.czeck@atomicrules.com; john.miller@atomicrules.com;
>ajit.khaparde@broadcom.com; somnath.kotur@broadcom.com; Jerin Jacob
>Kollanukkaran <jerinj@marvell.com>; Maciej Czekaj [C]
><mczekaj@marvell.com>; Shijith Thotton <sthotton@marvell.com>;
>Srisivasubramanian Srinivasan <srinivasan@marvell.com>; Harman Kalra
><hkalra@marvell.com>; rahul.lakkireddy@chelsio.com; johndale@cisco.com;
>hyonkim@cisco.com; liudongdong3@huawei.com;
>yisen.zhuang@huawei.com; xuanziyang2@huawei.com;
>cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com;
>simei.su@intel.com; wenjun1.wu@intel.com; qiming.yang@intel.com;
>Yuying.Zhang@intel.com; beilei.xing@intel.com; xiao.w.wang@intel.com;
>jingjing.wu@intel.com; junfeng.guo@intel.com; rosen.xu@intel.com; Nithin
>Kumar Dabilpuram <ndabilpuram@marvell.com>; Kiran Kumar Kokkilagadda
><kirankumark@marvell.com>; Sunil Kumar Kori <skori@marvell.com>; Satha
>Koteswara Rao Kottidi <skoteshwar@marvell.com>; Liron Himi
><lironh@marvell.com>; zr@semihalf.com; Radha Chintakuntla
><radhac@marvell.com>; Veerasenareddy Burru <vburru@marvell.com>;
>Sathesh B Edara <sedara@marvell.com>; matan@nvidia.com;
>viacheslavo@nvidia.com; sthemmin@microsoft.com; longli@microsoft.com;
>spinler@cesnet.cz; chaoyong.he@corigine.com;
>niklas.soderlund@corigine.com; hemant.agrawal@nxp.com;
>sachin.saxena@oss.nxp.com; g.singh@nxp.com; apeksha.gupta@nxp.com;
>sachin.saxena@nxp.com; aboyer@pensando.io; Rasesh Mody
><rmody@marvell.com>; Shahed Shaikh <shshaikh@marvell.com>; Devendra
>Singh Rawat <dsinghrawat@marvell.com>; andrew.rybchenko@oktetlabs.ru;
>jiawenwu@trustnetic.com; jianwang@trustnetic.com;
>jbehrens@vmware.com; maxime.coquelin@redhat.com;
>chenbo.xia@intel.com; steven.webster@windriver.com;
>matt.peters@windriver.com; bruce.richardson@intel.com;
>mtetsuyah@gmail.com; grive@u256.net; jasvinder.singh@intel.com;
>cristian.dumitrescu@intel.com; jgrajcia@cisco.com; Ankur Dwivedi
><adwivedi@marvell.com>
>Subject: [PATCH v3 1/4] ethdev: add trace points
>
>Add trace points for ethdev functions.
>
>Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>
>---
Yes the functions you mentioned in previous comment are called in while loop in worker core. So I think they are fastpath.
rte_eth_stats_get() is called in fastpath. Similar to rte_eth_macaddr_get(), I think functions like
rte_eth_pro miscuous_get(), rte_eth_allmulticast_get() can also be called in fastpath.  
I am not sure which other functions can be fastpath. Is there a guideline/theme which can be used to determine this?

> lib/ethdev/ethdev_private.c      |    3 +
> lib/ethdev/ethdev_trace_points.c |  435 +++++++++++
> lib/ethdev/rte_ethdev.c          |  152 ++++
> lib/ethdev/rte_ethdev_trace.h    | 1194 ++++++++++++++++++++++++++++++
> lib/ethdev/rte_ethdev_trace_fp.h |   19 +
> lib/ethdev/version.map           |  144 ++++
> 6 files changed, 1947 insertions(+)
>
>diff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c
>index 48090c879a..08e7f49fd8 100644
>--- a/lib/ethdev/ethdev_private.c
>+++ b/lib/ethdev/ethdev_private.c
>@@ -5,6 +5,7 @@
> #include <rte_debug.h>
>
> #include "rte_ethdev.h"
>+#include "rte_ethdev_trace.h"
> #include "ethdev_driver.h"
> #include "ethdev_private.h"
>
>@@ -297,6 +298,7 @@ rte_eth_call_rx_callbacks(uint16_t port_id, uint16_t
>queue_id,
> 		cb = cb->next;
> 	}
>
>+	rte_eth_trace_call_rx_callbacks(port_id, queue_id, nb_rx, nb_pkts);
> 	return nb_rx;
> }
>
>@@ -312,6 +314,7 @@ rte_eth_call_tx_callbacks(uint16_t port_id, uint16_t
>queue_id,
> 		cb = cb->next;
> 	}
>
>+	rte_eth_trace_call_tx_callbacks(port_id, queue_id, nb_pkts);
> 	return nb_pkts;
> }
>
>diff --git a/lib/ethdev/ethdev_trace_points.c
>b/lib/ethdev/ethdev_trace_points.c
>index 2919409a15..2c06b47b7f 100644
>--- a/lib/ethdev/ethdev_trace_points.c
>+++ b/lib/ethdev/ethdev_trace_points.c
>@@ -29,3 +29,438 @@
>RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_burst,
>
> RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_burst,
> 	lib.ethdev.tx.burst)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_add_first_rx_callback,
>+	lib.ethdev.add_first_rx_callback)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_add_rx_callback,
>+	lib.ethdev.add_rx_callback)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_add_tx_callback,
>+	lib.ethdev.add_tx_callback)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_allmulticast_disable,
>+	lib.ethdev.allmulticast_disable)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_allmulticast_enable,
>+	lib.ethdev.allmulticast_enable)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_allmulticast_get,
>+	lib.ethdev.allmulticast_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_call_rx_callbacks,
>+	lib.ethdev.call_rx_callbacks)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_call_tx_callbacks,
>+	lib.ethdev.call_tx_callbacks)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_mtu,
>+	lib.ethdev.set_mtu)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_adjust_nb_rx_tx_desc,
>+	lib.ethdev.adjust_nb_rx_tx_desc)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_callback_register,
>+	lib.ethdev.callback_register)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_callback_unregister,
>+	lib.ethdev.callback_unregister)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_default_mac_addr_set,
>+	lib.ethdev.default_mac_addr_set)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_flow_ctrl_get,
>+	lib.ethdev.flow_ctrl_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_flow_ctrl_set,
>+	lib.ethdev.flow_ctrl_set)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_fw_version_get,
>+	lib.ethdev.fw_version_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_dcb_info,
>+	lib.ethdev.get_dcb_info)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_eeprom,
>+	lib.ethdev.get_eeprom)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_eeprom_length,
>+	lib.ethdev.get_eeprom_length)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_mtu,
>+	lib.ethdev.get_mtu)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_count_avail,
>+	lib.ethdev.count_avail)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_count_total,
>+	lib.ethdev.count_total)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_name_by_port,
>+	lib.ethdev.get_name_by_port)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_port_by_name,
>+	lib.ethdev.get_port_by_name)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_reg_info,
>+	lib.ethdev.get_reg_info)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_sec_ctx,
>+	lib.ethdev.get_sec_ctx)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_supported_ptypes,
>+	lib.ethdev.get_supported_ptypes)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_vlan_offload,
>+	lib.ethdev.get_vlan_offload)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_info_get,
>+	lib.ethdev.info_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_is_removed,
>+	lib.ethdev.is_removed)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_is_valid_port,
>+	lib.ethdev.is_valid_port)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_mac_addr_add,
>+	lib.ethdev.mac_addr_add)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_mac_addr_remove,
>+	lib.ethdev.mac_addr_remove)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_pool_ops_supported,
>+	lib.ethdev.pool_ops_supported)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priority_flow_ctrl_set,
>+	lib.ethdev.priority_flow_ctrl_set)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_reset,
>+	lib.ethdev.reset)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_hash_conf_get,
>+	lib.ethdev.rss_hash_conf_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_hash_update,
>+	lib.ethdev.rss_hash_update)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_reta_query,
>+	lib.ethdev.rss_reta_query)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_reta_update,
>+	lib.ethdev.rss_reta_update)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_ctl,
>+	lib.ethdev.rx_intr_ctl)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_ctl_q,
>+	lib.ethdev.rx_intr_ctl_q)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_ctl_q_get_fd,
>+	lib.ethdev.rx_intr_ctl_q_get_fd)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_disable,
>+	lib.ethdev.rx_intr_disable)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_enable,
>+	lib.ethdev.rx_intr_enable)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_offload_name,
>+	lib.ethdev.rx_offload_name)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_queue_start,
>+	lib.ethdev.rx_queue_start)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_queue_stop,
>+	lib.ethdev.rx_queue_stop)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_eeprom,
>+	lib.ethdev.set_eeprom)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_link_down,
>+	lib.ethdev.set_link_down)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_link_up,
>+	lib.ethdev.set_link_up)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_mc_addr_list,
>+	lib.ethdev.set_mc_addr_list)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_ptypes,
>+	lib.ethdev.set_ptypes)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_rx_queue_stats_mappi
>ng,
>+	lib.ethdev.set_rx_queue_stats_mapping)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_tx_queue_stats_mappin
>g,
>+	lib.ethdev.set_tx_queue_stats_mapping)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_ether_type,
>+	lib.ethdev.set_vlan_ether_type)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_offload,
>+	lib.ethdev.set_vlan_offload)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_pvid,
>+	lib.ethdev.set_vlan_pvid)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_strip_on_queue,
>+	lib.ethdev.set_vlan_strip_on_queue)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_socket_id,
>+	lib.ethdev.socket_id)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_offload_name,
>+	lib.ethdev.tx_offload_name)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_queue_start,
>+	lib.ethdev.tx_queue_start)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_queue_stop,
>+	lib.ethdev.tx_queue_stop)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_uc_all_hash_table_set,
>+	lib.ethdev.uc_all_hash_table_set)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_uc_hash_table_set,
>+	lib.ethdev.uc_hash_table_set)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_udp_tunnel_port_add,
>+	lib.ethdev.udp_tunnel_port_add)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_udp_tunnel_port_delete,
>+	lib.ethdev.udp_tunnel_port_delete)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_vlan_filter,
>+	lib.ethdev.vlan_filter)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next,
>+	lib.ethdev.find_next)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next_of,
>+	lib.ethdev.find_next_of)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next_owned_by,
>+	lib.ethdev.find_next_owned_by)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next_sibling,
>+	lib.ethdev.find_next_sibling)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_iterator_cleanup,
>+	lib.ethdev.iterator_cleanup)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_iterator_init,
>+	lib.ethdev.iterator_init)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_iterator_next,
>+	lib.ethdev.iterator_next)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_led_off,
>+	lib.ethdev.led_off)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_led_on,
>+	lib.ethdev.led_on)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_get,
>+	lib.ethdev.link_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_get_nowait,
>+	lib.ethdev.link_get_nowait)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_macaddr_get,
>+	lib.ethdev.macaddr_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_promiscuous_disable,
>+	lib.ethdev.promiscuous_disable)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_promiscuous_enable,
>+	lib.ethdev.promiscuous_enable)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_promiscuous_get,
>+	lib.ethdev.promiscuous_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_remove_rx_callback,
>+	lib.ethdev.remove_rx_callback)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_remove_tx_callback,
>+	lib.ethdev.remove_tx_callback)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_burst_mode_get,
>+	lib.ethdev.rx_burst_mode_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_queue_info_get,
>+	lib.ethdev.rx_queue_info_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_queue_setup,
>+	lib.ethdev.rx_queue_setup)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_set_queue_rate_limit,
>+	lib.ethdev.set_queue_rate_limit)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_speed_bitflag,
>+	lib.ethdev.speed_bitflag)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_get,
>+	lib.ethdev.stats_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_reset,
>+	lib.ethdev.stats_reset)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_adjust_time,
>+	lib.ethdev.timesync_adjust_time)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_disable,
>+	lib.ethdev.timesync_disable)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_enable,
>+	lib.ethdev.timesync_enable)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_read_rx_timestamp,
>+	lib.ethdev.timesync_read_rx_timestamp)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_read_time,
>+	lib.ethdev.timesync_read_time)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_read_tx_timestamp,
>+	lib.ethdev.timesync_read_tx_timestamp)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_write_time,
>+	lib.ethdev.timesync_write_time)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_count_callback,
>+	lib.ethdev.tx_buffer_count_callback)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_drop_callback,
>+	lib.ethdev.tx_buffer_drop_callback)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_init,
>+	lib.ethdev.tx_buffer_init)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_set_err_callback,
>+	lib.ethdev.tx_buffer_set_err_callback)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_burst_mode_get,
>+	lib.ethdev.tx_burst_mode_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_done_cleanup,
>+	lib.ethdev.tx_done_cleanup)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_queue_info_get,
>+	lib.ethdev.tx_queue_info_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get,
>+	lib.ethdev.xstats_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_by_id,
>+	lib.ethdev.xstats_get_by_id)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_id_by_name,
>+	lib.ethdev.xstats_get_id_by_name)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_names,
>+	lib.ethdev.xstats_get_names)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_names_by_id,
>+	lib.ethdev.xstats_get_names_by_id)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_reset,
>+	lib.ethdev.xstats_reset)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_delete,
>+	lib.ethdev.owner_delete)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_get,
>+	lib.ethdev.owner_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_new,
>+	lib.ethdev.owner_new)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_set,
>+	lib.ethdev.owner_set)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_unset,
>+	lib.ethdev.owner_unset)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_module_eeprom,
>+	lib.ethdev.get_module_eeprom)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_module_info,
>+	lib.ethdev.get_module_info)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_read_clock,
>+	lib.ethdev.read_clock)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_hairpin_capability_get,
>+	lib.ethdev.hairpin_capability_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_hairpin_queue_setup,
>+	lib.ethdev.rx.hairpin_queue_setup)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_hairpin_queue_setup,
>+	lib.ethdev.tx.hairpin_queue_setup)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_hairpin_bind,
>+	lib.ethdev.hairpin_bind)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_hairpin_get_peer_ports,
>+	lib.ethdev.hairpin_get_peer_ports)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_hairpin_unbind,
>+	lib.ethdev.hairpin_unbind)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_speed_to_str,
>+	lib.ethdev.link_speed_to_str)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_to_str,
>+	lib.ethdev.link_to_str)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_fec_get_capability,
>+	lib.ethdev.fec_get_capability)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_fec_get,
>+	lib.ethdev.fec_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_fec_set,
>+	lib.ethdev.fec_set)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_get_monitor_addr,
>+	lib.ethdev.get_monitor_addr)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_representor_info_get,
>+	lib.ethdev.representor_info_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_capability_name,
>+	lib.ethdev.capability_name)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_conf_get,
>+	lib.ethdev.conf_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_macaddrs_get,
>+	lib.ethdev.macaddrs_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_metadata_negotiate,
>+	lib.ethdev.rx_metadata_negotiate)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priority_flow_ctrl_queue_co
>nfigure,
>+	lib.ethdev.priority_flow_ctrl_queue_configure)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priority_flow_ctrl_queue_in
>fo_get,
>+	lib.ethdev.priority_flow_ctrl_queue_info_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priv_dump,
>+	lib.ethdev.priv_dump)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_ip_reassembly_capability_get,
>+	lib.ethdev.ip_reassembly_capability_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_ip_reassembly_conf_get,
>+	lib.ethdev.ip_reassembly_conf_get)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_ip_reassembly_conf_set,
>+	lib.ethdev.ip_reassembly_conf_set)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_avail_thresh_query,
>+	lib.ethdev.rx_avail_thresh_query)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_avail_thresh_set,
>+	lib.ethdev.rx_avail_thresh_set)
>diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
>index 01c141a039..f66d3ecd0a 100644
>--- a/lib/ethdev/rte_ethdev.c
>+++ b/lib/ethdev/rte_ethdev.c
>@@ -182,6 +182,8 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter,
>const char *devargs_str)
> 	memset(iter, 0, sizeof(*iter));
> 	memset(&devargs, 0, sizeof(devargs));
>
>+	rte_eth_trace_iterator_init(iter, devargs_str);
>+
> 	/*
> 	 * The devargs string may use various syntaxes:
> 	 *   - 0000:08:00.0,representor=[1-3]
>@@ -283,6 +285,8 @@ rte_eth_iterator_next(struct rte_dev_iterator *iter)
> 	if (iter->cls == NULL) /* invalid ethdev iterator */
> 		return RTE_MAX_ETHPORTS;
>
>+	rte_eth_trace_iterator_next(iter);
>+
> 	do { /* loop to try all matching rte_device */
> 		/* If not pure ethdev filter and */
> 		if (iter->bus != NULL &&
>@@ -316,6 +320,7 @@ rte_eth_iterator_cleanup(struct rte_dev_iterator
>*iter)
>
> 	if (iter->bus_str == NULL)
> 		return; /* nothing to free in pure class filter */
>+	rte_eth_trace_iterator_cleanup(iter);
> 	free(RTE_CAST_FIELD(iter, bus_str, char *)); /* workaround const */
> 	free(RTE_CAST_FIELD(iter, cls_str, char *)); /* workaround const */
> 	memset(iter, 0, sizeof(*iter));
>@@ -331,6 +336,7 @@ rte_eth_find_next(uint16_t port_id)
> 	if (port_id >= RTE_MAX_ETHPORTS)
> 		return RTE_MAX_ETHPORTS;
>
>+	rte_eth_trace_find_next(port_id);
> 	return port_id;
> }
>
>@@ -351,6 +357,7 @@ rte_eth_find_next_of(uint16_t port_id, const struct
>rte_device *parent)
> 			rte_eth_devices[port_id].device != parent)
> 		port_id = rte_eth_find_next(port_id + 1);
>
>+	rte_eth_trace_find_next_of(port_id, parent);
> 	return port_id;
> }
>
>@@ -358,6 +365,7 @@ uint16_t
> rte_eth_find_next_sibling(uint16_t port_id, uint16_t ref_port_id)
> {
> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(ref_port_id,
>RTE_MAX_ETHPORTS);
>+	rte_eth_trace_find_next_sibling(port_id, ref_port_id);
> 	return rte_eth_find_next_of(port_id,
> 			rte_eth_devices[ref_port_id].device);
> }
>@@ -371,6 +379,7 @@ eth_dev_is_allocated(const struct rte_eth_dev
>*ethdev)
> int
> rte_eth_dev_is_valid_port(uint16_t port_id)
> {
>+	rte_ethdev_trace_is_valid_port(port_id);
> 	if (port_id >= RTE_MAX_ETHPORTS ||
> 	    (rte_eth_devices[port_id].state == RTE_ETH_DEV_UNUSED))
> 		return 0;
>@@ -395,6 +404,7 @@ rte_eth_find_next_owned_by(uint16_t port_id, const
>uint64_t owner_id)
> 			rte_eth_devices[port_id].data->owner.id != owner_id)
> 		port_id = rte_eth_find_next(port_id + 1);
>
>+	rte_eth_trace_find_next_owned_by(port_id, owner_id);
> 	return port_id;
> }
>
>@@ -413,6 +423,7 @@ rte_eth_dev_owner_new(uint64_t *owner_id)
> 	*owner_id = eth_dev_shared_data->next_owner_id++;
>
> 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
>+	rte_ethdev_trace_owner_new(*owner_id);
> 	return 0;
> }
>
>@@ -476,6 +487,7 @@ rte_eth_dev_owner_set(const uint16_t port_id,
> 	ret = eth_dev_owner_set(port_id, RTE_ETH_DEV_NO_OWNER,
>owner);
>
> 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
>+	rte_ethdev_trace_owner_set(port_id, owner, ret);
> 	return ret;
> }
>
>@@ -493,6 +505,7 @@ rte_eth_dev_owner_unset(const uint16_t port_id,
>const uint64_t owner_id)
> 	ret = eth_dev_owner_set(port_id, owner_id, &new_owner);
>
> 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
>+	rte_ethdev_trace_owner_unset(port_id, owner_id, ret);
> 	return ret;
> }
>
>@@ -526,6 +539,7 @@ rte_eth_dev_owner_delete(const uint64_t owner_id)
>
> 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
>
>+	rte_ethdev_trace_owner_delete(owner_id, ret);
> 	return ret;
> }
>
>@@ -555,6 +569,7 @@ rte_eth_dev_owner_get(const uint16_t port_id, struct
>rte_eth_dev_owner *owner)
> 	rte_memcpy(owner, &ethdev->data->owner, sizeof(*owner));
> 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
>
>+	rte_ethdev_trace_owner_get(port_id, owner);
> 	return 0;
> }
>
>@@ -562,6 +577,7 @@ int
> rte_eth_dev_socket_id(uint16_t port_id)
> {
> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
>+	rte_ethdev_trace_socket_id(port_id);
> 	return rte_eth_devices[port_id].data->numa_node;
> }
>
>@@ -569,6 +585,7 @@ void *
> rte_eth_dev_get_sec_ctx(uint16_t port_id)
> {
> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, NULL);
>+	rte_ethdev_trace_get_sec_ctx(port_id);
> 	return rte_eth_devices[port_id].security_ctx;
> }
>
>@@ -583,6 +600,7 @@ rte_eth_dev_count_avail(void)
> 	RTE_ETH_FOREACH_DEV(p)
> 		count++;
>
>+	rte_ethdev_trace_count_avail(count);
> 	return count;
> }
>
>@@ -594,6 +612,7 @@ rte_eth_dev_count_total(void)
> 	RTE_ETH_FOREACH_VALID_DEV(port)
> 		count++;
>
>+	rte_ethdev_trace_count_total(count);
> 	return count;
> }
>
>@@ -614,6 +633,7 @@ rte_eth_dev_get_name_by_port(uint16_t port_id,
>char *name)
> 	 * because it might be overwritten by VDEV PMD */
> 	tmp = eth_dev_shared_data->data[port_id].name;
> 	strcpy(name, tmp);
>+	rte_ethdev_trace_get_name_by_port(port_id, name);
> 	return 0;
> }
>
>@@ -636,6 +656,7 @@ rte_eth_dev_get_port_by_name(const char *name,
>uint16_t *port_id)
> 	RTE_ETH_FOREACH_VALID_DEV(pid)
> 		if (!strcmp(name, eth_dev_shared_data->data[pid].name)) {
> 			*port_id = pid;
>+			rte_ethdev_trace_get_port_by_name(name,
>*port_id);
> 			return 0;
> 		}
>
>@@ -737,6 +758,7 @@ rte_eth_dev_rx_queue_start(uint16_t port_id,
>uint16_t rx_queue_id)
> 		return 0;
> 	}
>
>+	rte_ethdev_trace_rx_queue_start(port_id, rx_queue_id);
> 	return eth_err(port_id, dev->dev_ops->rx_queue_start(dev,
>rx_queue_id));
> }
>
>@@ -770,6 +792,7 @@ rte_eth_dev_rx_queue_stop(uint16_t port_id,
>uint16_t rx_queue_id)
> 		return 0;
> 	}
>
>+	rte_ethdev_trace_rx_queue_stop(port_id, rx_queue_id);
> 	return eth_err(port_id, dev->dev_ops->rx_queue_stop(dev,
>rx_queue_id));
> }
>
>@@ -810,6 +833,7 @@ rte_eth_dev_tx_queue_start(uint16_t port_id,
>uint16_t tx_queue_id)
> 		return 0;
> 	}
>
>+	rte_ethdev_trace_tx_queue_start(port_id, tx_queue_id);
> 	return eth_err(port_id, dev->dev_ops->tx_queue_start(dev,
>tx_queue_id));
> }
>
>@@ -843,12 +867,14 @@ rte_eth_dev_tx_queue_stop(uint16_t port_id,
>uint16_t tx_queue_id)
> 		return 0;
> 	}
>
>+	rte_ethdev_trace_tx_queue_stop(port_id, tx_queue_id);
> 	return eth_err(port_id, dev->dev_ops->tx_queue_stop(dev,
>tx_queue_id));
> }
>
> uint32_t
> rte_eth_speed_bitflag(uint32_t speed, int duplex)
> {
>+	rte_eth_trace_speed_bitflag(speed, duplex);
> 	switch (speed) {
> 	case RTE_ETH_SPEED_NUM_10M:
> 		return duplex ? RTE_ETH_LINK_SPEED_10M :
>RTE_ETH_LINK_SPEED_10M_HD;
>@@ -894,6 +920,7 @@ rte_eth_dev_rx_offload_name(uint64_t offload)
> 		}
> 	}
>
>+	rte_ethdev_trace_rx_offload_name(offload, name);
> 	return name;
> }
>
>@@ -910,6 +937,7 @@ rte_eth_dev_tx_offload_name(uint64_t offload)
> 		}
> 	}
>
>+	rte_ethdev_trace_tx_offload_name(offload, name);
> 	return name;
> }
>
>@@ -926,6 +954,7 @@ rte_eth_dev_capability_name(uint64_t capability)
> 		}
> 	}
>
>+	rte_ethdev_trace_capability_name(capability, name);
> 	return name;
> }
>
>@@ -1552,6 +1581,7 @@ rte_eth_dev_set_link_up(uint16_t port_id)
>
> 	if (*dev->dev_ops->dev_set_link_up == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_set_link_up(port_id);
> 	return eth_err(port_id, (*dev->dev_ops->dev_set_link_up)(dev));
> }
>
>@@ -1565,6 +1595,7 @@ rte_eth_dev_set_link_down(uint16_t port_id)
>
> 	if (*dev->dev_ops->dev_set_link_down == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_set_link_down(port_id);
> 	return eth_err(port_id, (*dev->dev_ops->dev_set_link_down)(dev));
> }
>
>@@ -1621,6 +1652,7 @@ rte_eth_dev_reset(uint16_t port_id)
> 			port_id, rte_strerror(-ret));
> 	}
> 	ret = dev->dev_ops->dev_reset(dev);
>+	rte_ethdev_trace_reset(port_id, ret);
>
> 	return eth_err(port_id, ret);
> }
>@@ -1645,6 +1677,7 @@ rte_eth_dev_is_removed(uint16_t port_id)
> 		/* Device is physically removed. */
> 		dev->state = RTE_ETH_DEV_REMOVED;
>
>+	rte_ethdev_trace_is_removed(port_id, ret);
> 	return ret;
> }
>
>@@ -1984,6 +2017,8 @@ rte_eth_rx_hairpin_queue_setup(uint16_t port_id,
>uint16_t rx_queue_id,
> 	if (ret == 0)
> 		dev->data->rx_queue_state[rx_queue_id] =
> 			RTE_ETH_QUEUE_STATE_HAIRPIN;
>+	rte_eth_trace_rx_hairpin_queue_setup(port_id, rx_queue_id,
>nb_rx_desc,
>+					     conf, ret);
> 	return eth_err(port_id, ret);
> }
>
>@@ -2151,6 +2186,7 @@ rte_eth_tx_hairpin_queue_setup(uint16_t port_id,
>uint16_t tx_queue_id,
> 	if (ret == 0)
> 		dev->data->tx_queue_state[tx_queue_id] =
> 			RTE_ETH_QUEUE_STATE_HAIRPIN;
>+	rte_eth_trace_tx_hairpin_queue_setup(port_id, tx_queue_id,
>nb_tx_desc, conf, ret);
> 	return eth_err(port_id, ret);
> }
>
>@@ -2176,6 +2212,7 @@ rte_eth_hairpin_bind(uint16_t tx_port, uint16_t
>rx_port)
> 			       " to Rx %d (%d - all ports)\n",
> 			       tx_port, rx_port, RTE_MAX_ETHPORTS);
>
>+	rte_eth_trace_hairpin_bind(tx_port, rx_port, ret);
> 	return ret;
> }
>
>@@ -2201,6 +2238,7 @@ rte_eth_hairpin_unbind(uint16_t tx_port, uint16_t
>rx_port)
> 			       " from Rx %d (%d - all ports)\n",
> 			       tx_port, rx_port, RTE_MAX_ETHPORTS);
>
>+	rte_eth_trace_hairpin_unbind(tx_port, rx_port, ret);
> 	return ret;
> }
>
>@@ -2237,6 +2275,7 @@ rte_eth_hairpin_get_peer_ports(uint16_t port_id,
>uint16_t *peer_ports,
> 		RTE_ETHDEV_LOG(ERR, "Failed to get %d hairpin peer %s
>ports\n",
> 			       port_id, direction ? "Rx" : "Tx");
>
>+	rte_eth_trace_hairpin_get_peer_ports(port_id, peer_ports, len,
>direction, ret);
> 	return ret;
> }
>
>@@ -2244,6 +2283,7 @@ void
> rte_eth_tx_buffer_drop_callback(struct rte_mbuf **pkts, uint16_t unsent,
> 		void *userdata __rte_unused)
> {
>+	rte_eth_trace_tx_buffer_drop_callback(pkts, unsent);
> 	rte_pktmbuf_free_bulk(pkts, unsent);
> }
>
>@@ -2255,6 +2295,7 @@ rte_eth_tx_buffer_count_callback(struct rte_mbuf
>**pkts, uint16_t unsent,
>
> 	rte_pktmbuf_free_bulk(pkts, unsent);
> 	*count += unsent;
>+	rte_eth_trace_tx_buffer_count_callback(pkts, unsent, *count);
> }
>
> int
>@@ -2267,6 +2308,7 @@ rte_eth_tx_buffer_set_err_callback(struct
>rte_eth_dev_tx_buffer *buffer,
> 		return -EINVAL;
> 	}
>
>+	rte_eth_trace_tx_buffer_set_err_callback(buffer, cbfn, userdata);
> 	buffer->error_callback = cbfn;
> 	buffer->error_userdata = userdata;
> 	return 0;
>@@ -2288,6 +2330,7 @@ rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer
>*buffer, uint16_t size)
> 			buffer, rte_eth_tx_buffer_drop_callback, NULL);
> 	}
>
>+	rte_eth_trace_tx_buffer_init(buffer, size, ret);
> 	return ret;
> }
>
>@@ -2306,6 +2349,7 @@ rte_eth_tx_done_cleanup(uint16_t port_id,
>uint16_t queue_id, uint32_t free_cnt)
> 	/* Call driver to free pending mbufs. */
> 	ret = (*dev->dev_ops->tx_done_cleanup)(dev->data-
>>tx_queues[queue_id],
> 					       free_cnt);
>+	rte_eth_trace_tx_done_cleanup(port_id, queue_id, free_cnt, ret);
> 	return eth_err(port_id, ret);
> }
>
>@@ -2327,6 +2371,7 @@ rte_eth_promiscuous_enable(uint16_t port_id)
> 	diag = (*dev->dev_ops->promiscuous_enable)(dev);
> 	dev->data->promiscuous = (diag == 0) ? 1 : 0;
>
>+	rte_eth_trace_promiscuous_enable(port_id, dev->data-
>>promiscuous);
> 	return eth_err(port_id, diag);
> }
>
>@@ -2350,6 +2395,7 @@ rte_eth_promiscuous_disable(uint16_t port_id)
> 	if (diag != 0)
> 		dev->data->promiscuous = 1;
>
>+	rte_eth_trace_promiscuous_disable(port_id, dev->data-
>>promiscuous);
> 	return eth_err(port_id, diag);
> }
>
>@@ -2361,6 +2407,7 @@ rte_eth_promiscuous_get(uint16_t port_id)
> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> 	dev = &rte_eth_devices[port_id];
>
>+	rte_eth_trace_promiscuous_get(port_id, dev->data->promiscuous);
> 	return dev->data->promiscuous;
> }
>
>@@ -2381,6 +2428,7 @@ rte_eth_allmulticast_enable(uint16_t port_id)
> 	diag = (*dev->dev_ops->allmulticast_enable)(dev);
> 	dev->data->all_multicast = (diag == 0) ? 1 : 0;
>
>+	rte_eth_trace_allmulticast_enable(port_id, dev->data->all_multicast);
> 	return eth_err(port_id, diag);
> }
>
>@@ -2403,6 +2451,7 @@ rte_eth_allmulticast_disable(uint16_t port_id)
> 	if (diag != 0)
> 		dev->data->all_multicast = 1;
>
>+	rte_eth_trace_allmulticast_disable(port_id, dev->data->all_multicast);
> 	return eth_err(port_id, diag);
> }
>
>@@ -2414,6 +2463,7 @@ rte_eth_allmulticast_get(uint16_t port_id)
> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> 	dev = &rte_eth_devices[port_id];
>
>+	rte_eth_trace_allmulticast_get(port_id, dev->data->all_multicast);
> 	return dev->data->all_multicast;
> }
>
>@@ -2440,6 +2490,7 @@ rte_eth_link_get(uint16_t port_id, struct
>rte_eth_link *eth_link)
> 		*eth_link = dev->data->dev_link;
> 	}
>
>+	rte_eth_trace_link_get(port_id, eth_link);
> 	return 0;
> }
>
>@@ -2466,12 +2517,14 @@ rte_eth_link_get_nowait(uint16_t port_id, struct
>rte_eth_link *eth_link)
> 		*eth_link = dev->data->dev_link;
> 	}
>
>+	rte_eth_trace_link_get_nowait(port_id, eth_link);
> 	return 0;
> }
>
> const char *
> rte_eth_link_speed_to_str(uint32_t link_speed)
> {
>+	rte_eth_trace_link_speed_to_str(link_speed);
> 	switch (link_speed) {
> 	case RTE_ETH_SPEED_NUM_NONE: return "None";
> 	case RTE_ETH_SPEED_NUM_10M:  return "10 Mbps";
>@@ -2511,6 +2564,7 @@ rte_eth_link_to_str(char *str, size_t len, const struct
>rte_eth_link *eth_link)
> 		return -EINVAL;
> 	}
>
>+	rte_eth_trace_link_to_str(str, len, eth_link);
> 	if (eth_link->link_status == RTE_ETH_LINK_DOWN)
> 		return snprintf(str, len, "Link down");
> 	else
>@@ -2541,6 +2595,7 @@ rte_eth_stats_get(uint16_t port_id, struct
>rte_eth_stats *stats)
> 	if (*dev->dev_ops->stats_get == NULL)
> 		return -ENOTSUP;
> 	stats->rx_nombuf = dev->data->rx_mbuf_alloc_failed;
>+	rte_eth_trace_stats_get(port_id, stats);
> 	return eth_err(port_id, (*dev->dev_ops->stats_get)(dev, stats));
> }
>
>@@ -2561,6 +2616,7 @@ rte_eth_stats_reset(uint16_t port_id)
>
> 	dev->data->rx_mbuf_alloc_failed = 0;
>
>+	rte_eth_trace_stats_reset(port_id);
> 	return 0;
> }
>
>@@ -2625,6 +2681,7 @@ rte_eth_xstats_get_id_by_name(uint16_t port_id,
>const char *xstat_name,
> 		return -ENOMEM;
> 	}
>
>+	rte_eth_trace_xstats_get_id_by_name(port_id, xstat_name, id);
> 	/* Get count */
> 	cnt_xstats = rte_eth_xstats_get_names_by_id(port_id, NULL, 0, NULL);
> 	if (cnt_xstats  < 0) {
>@@ -2797,6 +2854,8 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
> 			return -1;
> 		}
> 		xstats_names[i] = xstats_names_copy[ids[i]];
>+		rte_eth_trace_xstats_get_names_by_id(port_id,
>&xstats_names[i],
>+						     ids[i]);
> 	}
>
> 	free(xstats_names_copy);
>@@ -2836,6 +2895,7 @@ rte_eth_xstats_get_names(uint16_t port_id,
> 		cnt_used_entries += cnt_driver_entries;
> 	}
>
>+	rte_eth_trace_xstats_get_names(port_id, xstats_names, size,
>cnt_used_entries);
> 	return cnt_used_entries;
> }
>
>@@ -2985,6 +3045,7 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const
>uint64_t *ids,
> 		}
> 		values[i] = xstats[ids[i]].value;
> 	}
>+	rte_eth_trace_xstats_get_by_id(port_id, ids, values, size);
> 	return size;
> }
>
>@@ -3032,6 +3093,8 @@ rte_eth_xstats_get(uint16_t port_id, struct
>rte_eth_xstat *xstats,
> 	for ( ; i < count + xcount; i++)
> 		xstats[i].id += count;
>
>+	for (i = 0; i < n; i++)
>+		rte_eth_trace_xstats_get(port_id, xstats[i], i);
> 	return count + xcount;
> }
>
>@@ -3044,6 +3107,7 @@ rte_eth_xstats_reset(uint16_t port_id)
> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> 	dev = &rte_eth_devices[port_id];
>
>+	rte_eth_trace_xstats_reset(port_id);
> 	/* implemented by the driver */
> 	if (dev->dev_ops->xstats_reset != NULL)
> 		return eth_err(port_id, (*dev->dev_ops->xstats_reset)(dev));
>@@ -3079,6 +3143,8 @@ int
> rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id, uint16_t
>tx_queue_id,
> 		uint8_t stat_idx)
> {
>+	rte_ethdev_trace_set_tx_queue_stats_mapping(port_id, tx_queue_id,
>+						    stat_idx);
> 	return eth_err(port_id, eth_dev_set_queue_stats_mapping(port_id,
> 						tx_queue_id,
> 						stat_idx, STAT_QMAP_TX));
>@@ -3088,6 +3154,8 @@ int
> rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id, uint16_t
>rx_queue_id,
> 		uint8_t stat_idx)
> {
>+	rte_ethdev_trace_set_rx_queue_stats_mapping(port_id,
>rx_queue_id,
>+						    stat_idx);
> 	return eth_err(port_id, eth_dev_set_queue_stats_mapping(port_id,
> 						rx_queue_id,
> 						stat_idx, STAT_QMAP_RX));
>@@ -3110,6 +3178,7 @@ rte_eth_dev_fw_version_get(uint16_t port_id, char
>*fw_version, size_t fw_size)
>
> 	if (*dev->dev_ops->fw_version_get == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_fw_version_get(port_id, fw_version, fw_size);
> 	return eth_err(port_id, (*dev->dev_ops->fw_version_get)(dev,
> 							fw_version, fw_size));
> }
>@@ -3171,6 +3240,7 @@ rte_eth_dev_info_get(uint16_t port_id, struct
>rte_eth_dev_info *dev_info)
>
> 	dev_info->dev_flags = &dev->data->dev_flags;
>
>+	rte_ethdev_trace_info_get(port_id, dev_info);
> 	return 0;
> }
>
>@@ -3191,6 +3261,7 @@ rte_eth_dev_conf_get(uint16_t port_id, struct
>rte_eth_conf *dev_conf)
>
> 	memcpy(dev_conf, &dev->data->dev_conf, sizeof(struct
>rte_eth_conf));
>
>+	rte_ethdev_trace_conf_get(port_id, dev_conf);
> 	return 0;
> }
>
>@@ -3226,6 +3297,7 @@ rte_eth_dev_get_supported_ptypes(uint16_t
>port_id, uint32_t ptype_mask,
> 			j++;
> 		}
>
>+	rte_ethdev_trace_get_supported_ptypes(port_id, ptype_mask,
>ptypes, num, j);
> 	return j;
> }
>
>@@ -3310,6 +3382,7 @@ rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t
>ptype_mask,
> 	if (set_ptypes != NULL && j < num)
> 		set_ptypes[j] = RTE_PTYPE_UNKNOWN;
>
>+	rte_ethdev_trace_set_ptypes(port_id, ptype_mask, set_ptypes, num);
> 	return (*dev->dev_ops->dev_ptypes_set)(dev, ptype_mask);
>
> ptype_unknown:
>@@ -3341,6 +3414,7 @@ rte_eth_macaddrs_get(uint16_t port_id, struct
>rte_ether_addr *ma,
> 	num = RTE_MIN(dev_info.max_mac_addrs, num);
> 	memcpy(ma, dev->data->mac_addrs, num * sizeof(ma[0]));
>
>+	rte_eth_trace_macaddrs_get(port_id, ma, num);
> 	return num;
> }
>
>@@ -3359,6 +3433,7 @@ rte_eth_macaddr_get(uint16_t port_id, struct
>rte_ether_addr *mac_addr)
> 		return -EINVAL;
> 	}
>
>+	rte_eth_trace_macaddr_get(port_id, mac_addr);
> 	rte_ether_addr_copy(&dev->data->mac_addrs[0], mac_addr);
>
> 	return 0;
>@@ -3379,6 +3454,7 @@ rte_eth_dev_get_mtu(uint16_t port_id, uint16_t
>*mtu)
> 	}
>
> 	*mtu = dev->data->mtu;
>+	rte_ethdev_trace_get_mtu(port_id, *mtu);
> 	return 0;
> }
>
>@@ -3421,6 +3497,7 @@ rte_eth_dev_set_mtu(uint16_t port_id, uint16_t
>mtu)
> 	if (ret == 0)
> 		dev->data->mtu = mtu;
>
>+	rte_ethdev_trace_set_mtu(port_id, mtu, ret);
> 	return eth_err(port_id, ret);
> }
>
>@@ -3464,6 +3541,7 @@ rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t
>vlan_id, int on)
> 			vfc->ids[vidx] &= ~RTE_BIT64(vbit);
> 	}
>
>+	rte_ethdev_trace_vlan_filter(port_id, vlan_id, on, ret);
> 	return eth_err(port_id, ret);
> }
>
>@@ -3483,6 +3561,7 @@ rte_eth_dev_set_vlan_strip_on_queue(uint16_t
>port_id, uint16_t rx_queue_id,
>
> 	if (*dev->dev_ops->vlan_strip_queue_set == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_set_vlan_strip_on_queue(port_id, rx_queue_id,
>on);
> 	(*dev->dev_ops->vlan_strip_queue_set)(dev, rx_queue_id, on);
>
> 	return 0;
>@@ -3500,6 +3579,7 @@ rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
>
> 	if (*dev->dev_ops->vlan_tpid_set == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_set_vlan_ether_type(port_id, vlan_type, tpid);
> 	return eth_err(port_id, (*dev->dev_ops->vlan_tpid_set)(dev,
>vlan_type,
> 							       tpid));
> }
>@@ -3593,6 +3673,7 @@ rte_eth_dev_set_vlan_offload(uint16_t port_id, int
>offload_mask)
> 		dev->data->dev_conf.rxmode.offloads = orig_offloads;
> 	}
>
>+	rte_ethdev_trace_set_vlan_offload(port_id, offload_mask, ret);
> 	return eth_err(port_id, ret);
> }
>
>@@ -3619,6 +3700,7 @@ rte_eth_dev_get_vlan_offload(uint16_t port_id)
> 	if (*dev_offloads & RTE_ETH_RX_OFFLOAD_QINQ_STRIP)
> 		ret |= RTE_ETH_QINQ_STRIP_OFFLOAD;
>
>+	rte_ethdev_trace_get_vlan_offload(port_id, ret);
> 	return ret;
> }
>
>@@ -3632,6 +3714,7 @@ rte_eth_dev_set_vlan_pvid(uint16_t port_id,
>uint16_t pvid, int on)
>
> 	if (*dev->dev_ops->vlan_pvid_set == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_set_vlan_pvid(port_id, pvid, on);
> 	return eth_err(port_id, (*dev->dev_ops->vlan_pvid_set)(dev, pvid,
>on));
> }
>
>@@ -3653,6 +3736,7 @@ rte_eth_dev_flow_ctrl_get(uint16_t port_id, struct
>rte_eth_fc_conf *fc_conf)
> 	if (*dev->dev_ops->flow_ctrl_get == NULL)
> 		return -ENOTSUP;
> 	memset(fc_conf, 0, sizeof(*fc_conf));
>+	rte_ethdev_trace_flow_ctrl_get(port_id, fc_conf);
> 	return eth_err(port_id, (*dev->dev_ops->flow_ctrl_get)(dev,
>fc_conf));
> }
>
>@@ -3678,6 +3762,7 @@ rte_eth_dev_flow_ctrl_set(uint16_t port_id, struct
>rte_eth_fc_conf *fc_conf)
>
> 	if (*dev->dev_ops->flow_ctrl_set == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_flow_ctrl_set(port_id, fc_conf);
> 	return eth_err(port_id, (*dev->dev_ops->flow_ctrl_set)(dev, fc_conf));
> }
>
>@@ -3702,6 +3787,7 @@ rte_eth_dev_priority_flow_ctrl_set(uint16_t
>port_id,
> 		return -EINVAL;
> 	}
>
>+	rte_ethdev_trace_priority_flow_ctrl_set(port_id, pfc_conf);
> 	/* High water, low water validation are device specific */
> 	if  (*dev->dev_ops->priority_flow_ctrl_set)
> 		return eth_err(port_id, (*dev->dev_ops-
>>priority_flow_ctrl_set)
>@@ -3774,6 +3860,7 @@
>rte_eth_dev_priority_flow_ctrl_queue_info_get(uint16_t port_id,
> 		return -EINVAL;
> 	}
>
>+	rte_ethdev_trace_priority_flow_ctrl_queue_info_get(port_id,
>pfc_queue_info);
> 	if (*dev->dev_ops->priority_flow_ctrl_queue_info_get)
> 		return eth_err(port_id, (*dev->dev_ops-
>>priority_flow_ctrl_queue_info_get)
> 			(dev, pfc_queue_info));
>@@ -3845,6 +3932,8 @@
>rte_eth_dev_priority_flow_ctrl_queue_configure(uint16_t port_id,
> 			return ret;
> 	}
>
>+	rte_ethdev_trace_priority_flow_ctrl_queue_configure(port_id,
>+							     pfc_queue_conf);
> 	if (*dev->dev_ops->priority_flow_ctrl_queue_config)
> 		return eth_err(port_id,
> 			       (*dev->dev_ops-
>>priority_flow_ctrl_queue_config)(
>@@ -3940,6 +4029,7 @@ rte_eth_dev_rss_reta_update(uint16_t port_id,
>
> 	if (*dev->dev_ops->reta_update == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_rss_reta_update(port_id, reta_conf, reta_size);
> 	return eth_err(port_id, (*dev->dev_ops->reta_update)(dev,
>reta_conf,
> 							     reta_size));
> }
>@@ -3969,6 +4059,7 @@ rte_eth_dev_rss_reta_query(uint16_t port_id,
>
> 	if (*dev->dev_ops->reta_query == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_rss_reta_query(port_id, reta_conf, reta_size);
> 	return eth_err(port_id, (*dev->dev_ops->reta_query)(dev, reta_conf,
> 							    reta_size));
> }
>@@ -4014,6 +4105,7 @@ rte_eth_dev_rss_hash_update(uint16_t port_id,
>
> 	if (*dev->dev_ops->rss_hash_update == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_rss_hash_update(port_id, rss_conf);
> 	return eth_err(port_id, (*dev->dev_ops->rss_hash_update)(dev,
> 								 rss_conf));
> }
>@@ -4036,6 +4128,7 @@ rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
>
> 	if (*dev->dev_ops->rss_hash_conf_get == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_rss_hash_conf_get(port_id, rss_conf);
> 	return eth_err(port_id, (*dev->dev_ops->rss_hash_conf_get)(dev,
> 								   rss_conf));
> }
>@@ -4063,6 +4156,7 @@ rte_eth_dev_udp_tunnel_port_add(uint16_t
>port_id,
>
> 	if (*dev->dev_ops->udp_tunnel_port_add == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_udp_tunnel_port_add(port_id, udp_tunnel);
> 	return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_add)(dev,
> 								udp_tunnel));
> }
>@@ -4090,6 +4184,7 @@ rte_eth_dev_udp_tunnel_port_delete(uint16_t
>port_id,
>
> 	if (*dev->dev_ops->udp_tunnel_port_del == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_udp_tunnel_port_delete(port_id, udp_tunnel);
> 	return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_del)(dev,
> 								udp_tunnel));
> }
>@@ -4104,6 +4199,7 @@ rte_eth_led_on(uint16_t port_id)
>
> 	if (*dev->dev_ops->dev_led_on == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_led_on(port_id);
> 	return eth_err(port_id, (*dev->dev_ops->dev_led_on)(dev));
> }
>
>@@ -4117,6 +4213,7 @@ rte_eth_led_off(uint16_t port_id)
>
> 	if (*dev->dev_ops->dev_led_off == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_led_off(port_id);
> 	return eth_err(port_id, (*dev->dev_ops->dev_led_off)(dev));
> }
>
>@@ -4142,6 +4239,7 @@ rte_eth_fec_get_capability(uint16_t port_id,
> 		return -ENOTSUP;
> 	ret = (*dev->dev_ops->fec_get_capability)(dev, speed_fec_capa,
>num);
>
>+	rte_eth_trace_fec_get_capability(port_id, speed_fec_capa, num, ret);
> 	return ret;
> }
>
>@@ -4162,6 +4260,7 @@ rte_eth_fec_get(uint16_t port_id, uint32_t
>*fec_capa)
>
> 	if (*dev->dev_ops->fec_get == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_fec_get(port_id, fec_capa);
> 	return eth_err(port_id, (*dev->dev_ops->fec_get)(dev, fec_capa));
> }
>
>@@ -4175,6 +4274,7 @@ rte_eth_fec_set(uint16_t port_id, uint32_t
>fec_capa)
>
> 	if (*dev->dev_ops->fec_set == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_fec_set(port_id, fec_capa);
> 	return eth_err(port_id, (*dev->dev_ops->fec_set)(dev, fec_capa));
> }
>
>@@ -4252,6 +4352,7 @@ rte_eth_dev_mac_addr_add(uint16_t port_id,
>struct rte_ether_addr *addr,
> 			return 0;
> 	}
>
>+	rte_ethdev_trace_mac_addr_add(port_id, addr, pool);
> 	/* Update NIC */
> 	ret = (*dev->dev_ops->mac_addr_add)(dev, addr, index, pool);
>
>@@ -4294,6 +4395,7 @@ rte_eth_dev_mac_addr_remove(uint16_t port_id,
>struct rte_ether_addr *addr)
> 	} else if (index < 0)
> 		return 0;  /* Do nothing if address wasn't found */
>
>+	rte_ethdev_trace_mac_addr_remove(port_id, addr);
> 	/* Update NIC */
> 	(*dev->dev_ops->mac_addr_remove)(dev, index);
>
>@@ -4329,6 +4431,7 @@ rte_eth_dev_default_mac_addr_set(uint16_t
>port_id, struct rte_ether_addr *addr)
> 		return -ENOTSUP;
>
> 	ret = (*dev->dev_ops->mac_addr_set)(dev, addr);
>+	rte_ethdev_trace_default_mac_addr_set(port_id, addr, ret);
> 	if (ret < 0)
> 		return ret;
>
>@@ -4415,6 +4518,7 @@ rte_eth_dev_uc_hash_table_set(uint16_t port_id,
>struct rte_ether_addr *addr,
> 	if (*dev->dev_ops->uc_hash_table_set == NULL)
> 		return -ENOTSUP;
> 	ret = (*dev->dev_ops->uc_hash_table_set)(dev, addr, on);
>+	rte_ethdev_trace_uc_hash_table_set(port_id, addr, on, ret);
> 	if (ret == 0) {
> 		/* Update address in NIC data structure */
> 		if (on)
>@@ -4438,6 +4542,7 @@ rte_eth_dev_uc_all_hash_table_set(uint16_t
>port_id, uint8_t on)
>
> 	if (*dev->dev_ops->uc_all_hash_table_set == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_uc_all_hash_table_set(port_id, on);
> 	return eth_err(port_id, (*dev->dev_ops->uc_all_hash_table_set)(dev,
> 								       on));
> }
>@@ -4475,6 +4580,7 @@ int rte_eth_set_queue_rate_limit(uint16_t port_id,
>uint16_t queue_idx,
>
> 	if (*dev->dev_ops->set_queue_rate_limit == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_set_queue_rate_limit(port_id, queue_idx, tx_rate);
> 	return eth_err(port_id, (*dev->dev_ops->set_queue_rate_limit)(dev,
> 							queue_idx, tx_rate));
> }
>@@ -4502,6 +4608,7 @@ int rte_eth_rx_avail_thresh_set(uint16_t port_id,
>uint16_t queue_id,
> 	}
> 	if (*dev->dev_ops->rx_queue_avail_thresh_set == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_rx_avail_thresh_set(port_id, queue_id, avail_thresh);
> 	return eth_err(port_id, (*dev->dev_ops-
>>rx_queue_avail_thresh_set)(dev,
> 							     queue_id,
>avail_thresh));
> }
>@@ -4521,6 +4628,7 @@ int rte_eth_rx_avail_thresh_query(uint16_t port_id,
>uint16_t *queue_id,
>
> 	if (*dev->dev_ops->rx_queue_avail_thresh_query == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_rx_avail_thresh_query(port_id, *queue_id);
> 	return eth_err(port_id, (*dev->dev_ops-
>>rx_queue_avail_thresh_query)(dev,
> 							     queue_id,
>avail_thresh));
> }
>@@ -4570,6 +4678,9 @@ rte_eth_dev_callback_register(uint16_t port_id,
> 		next_port = last_port = port_id;
> 	}
>
>+	rte_ethdev_trace_callback_register(port_id, event, cb_fn, cb_arg,
>next_port,
>+					   last_port);
>+
> 	rte_spinlock_lock(&eth_dev_cb_lock);
>
> 	do {
>@@ -4665,6 +4776,7 @@ rte_eth_dev_callback_unregister(uint16_t port_id,
> 	} while (++next_port <= last_port);
>
> 	rte_spinlock_unlock(&eth_dev_cb_lock);
>+	rte_ethdev_trace_callback_unregister(port_id, event, cb_fn, cb_arg,
>ret);
> 	return ret;
> }
>
>@@ -4694,6 +4806,7 @@ rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd,
>int op, void *data)
> 	for (qid = 0; qid < dev->data->nb_rx_queues; qid++) {
> 		vec = rte_intr_vec_list_index_get(intr_handle, qid);
> 		rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
>+		rte_ethdev_trace_rx_intr_ctl(port_id, epfd, op, data, rc);
> 		if (rc && rc != -EEXIST) {
> 			RTE_ETHDEV_LOG(ERR,
> 				"p %u q %u Rx ctl error op %d epfd %d vec
>%u\n",
>@@ -4737,6 +4850,7 @@ rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id,
>uint16_t queue_id)
> 		(vec - RTE_INTR_VEC_RXTX_OFFSET) : vec;
> 	fd = rte_intr_efds_index_get(intr_handle, efd_idx);
>
>+	rte_ethdev_trace_rx_intr_ctl_q_get_fd(port_id, queue_id, fd);
> 	return fd;
> }
>
>@@ -4770,6 +4884,7 @@ rte_eth_dev_rx_intr_ctl_q(uint16_t port_id,
>uint16_t queue_id,
>
> 	vec = rte_intr_vec_list_index_get(intr_handle, queue_id);
> 	rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
>+	rte_ethdev_trace_rx_intr_ctl_q(port_id, queue_id, epfd, op, data, rc);
> 	if (rc && rc != -EEXIST) {
> 		RTE_ETHDEV_LOG(ERR,
> 			"p %u q %u Rx ctl error op %d epfd %d vec %u\n",
>@@ -4796,6 +4911,7 @@ rte_eth_dev_rx_intr_enable(uint16_t port_id,
>
> 	if (*dev->dev_ops->rx_queue_intr_enable == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_rx_intr_enable(port_id, queue_id);
> 	return eth_err(port_id, (*dev->dev_ops->rx_queue_intr_enable)(dev,
>queue_id));
> }
>
>@@ -4815,6 +4931,7 @@ rte_eth_dev_rx_intr_disable(uint16_t port_id,
>
> 	if (*dev->dev_ops->rx_queue_intr_disable == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_rx_intr_disable(port_id, queue_id);
> 	return eth_err(port_id, (*dev->dev_ops->rx_queue_intr_disable)(dev,
>queue_id));
> }
>
>@@ -4873,6 +4990,7 @@ rte_eth_add_rx_callback(uint16_t port_id, uint16_t
>queue_id,
> 	}
> 	rte_spinlock_unlock(&eth_dev_rx_cb_lock);
>
>+	rte_eth_trace_add_rx_callback(port_id, queue_id, fn, user_param,
>cb);
> 	return cb;
> }
>
>@@ -4912,6 +5030,7 @@ rte_eth_add_first_rx_callback(uint16_t port_id,
>uint16_t queue_id,
> 		cb, __ATOMIC_RELEASE);
> 	rte_spinlock_unlock(&eth_dev_rx_cb_lock);
>
>+	rte_eth_trace_add_first_rx_callback(port_id, queue_id, fn,
>user_param, cb);
> 	return cb;
> }
>
>@@ -4971,6 +5090,7 @@ rte_eth_add_tx_callback(uint16_t port_id, uint16_t
>queue_id,
> 	}
> 	rte_spinlock_unlock(&eth_dev_tx_cb_lock);
>
>+	rte_eth_trace_add_tx_callback(port_id, queue_id, fn, user_param,
>cb);
> 	return cb;
> }
>
>@@ -5005,6 +5125,7 @@ rte_eth_remove_rx_callback(uint16_t port_id,
>uint16_t queue_id,
> 	}
> 	rte_spinlock_unlock(&eth_dev_rx_cb_lock);
>
>+	rte_eth_trace_remove_rx_callback(port_id, queue_id, user_cb, ret);
> 	return ret;
> }
>
>@@ -5039,6 +5160,7 @@ rte_eth_remove_tx_callback(uint16_t port_id,
>uint16_t queue_id,
> 	}
> 	rte_spinlock_unlock(&eth_dev_tx_cb_lock);
>
>+	rte_eth_trace_remove_tx_callback(port_id, queue_id, user_cb, ret);
> 	return ret;
> }
>
>@@ -5085,6 +5207,7 @@ rte_eth_rx_queue_info_get(uint16_t port_id,
>uint16_t queue_id,
> 	dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
> 	qinfo->queue_state = dev->data->rx_queue_state[queue_id];
>
>+	rte_eth_trace_rx_queue_info_get(port_id, queue_id, qinfo);
> 	return 0;
> }
>
>@@ -5131,6 +5254,7 @@ rte_eth_tx_queue_info_get(uint16_t port_id,
>uint16_t queue_id,
> 	dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
> 	qinfo->queue_state = dev->data->tx_queue_state[queue_id];
>
>+	rte_eth_trace_tx_queue_info_get(port_id, queue_id, qinfo);
> 	return 0;
> }
>
>@@ -5158,6 +5282,7 @@ rte_eth_rx_burst_mode_get(uint16_t port_id,
>uint16_t queue_id,
> 	if (*dev->dev_ops->rx_burst_mode_get == NULL)
> 		return -ENOTSUP;
> 	memset(mode, 0, sizeof(*mode));
>+	rte_eth_trace_rx_burst_mode_get(port_id, queue_id, mode);
> 	return eth_err(port_id,
> 		       dev->dev_ops->rx_burst_mode_get(dev, queue_id,
>mode));
> }
>@@ -5186,6 +5311,7 @@ rte_eth_tx_burst_mode_get(uint16_t port_id,
>uint16_t queue_id,
> 	if (*dev->dev_ops->tx_burst_mode_get == NULL)
> 		return -ENOTSUP;
> 	memset(mode, 0, sizeof(*mode));
>+	rte_eth_trace_tx_burst_mode_get(port_id, queue_id, mode);
> 	return eth_err(port_id,
> 		       dev->dev_ops->tx_burst_mode_get(dev, queue_id,
>mode));
> }
>@@ -5213,6 +5339,7 @@ rte_eth_get_monitor_addr(uint16_t port_id,
>uint16_t queue_id,
>
> 	if (*dev->dev_ops->get_monitor_addr == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_get_monitor_addr(port_id, queue_id, pmc);
> 	return eth_err(port_id,
> 		dev->dev_ops->get_monitor_addr(dev->data-
>>rx_queues[queue_id], pmc));
> }
>@@ -5229,6 +5356,7 @@ rte_eth_dev_set_mc_addr_list(uint16_t port_id,
>
> 	if (*dev->dev_ops->set_mc_addr_list == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_set_mc_addr_list(port_id, mc_addr_set,
>nb_mc_addr);
> 	return eth_err(port_id, dev->dev_ops->set_mc_addr_list(dev,
> 						mc_addr_set, nb_mc_addr));
> }
>@@ -5243,6 +5371,7 @@ rte_eth_timesync_enable(uint16_t port_id)
>
> 	if (*dev->dev_ops->timesync_enable == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_timesync_enable(port_id);
> 	return eth_err(port_id, (*dev->dev_ops->timesync_enable)(dev));
> }
>
>@@ -5256,6 +5385,7 @@ rte_eth_timesync_disable(uint16_t port_id)
>
> 	if (*dev->dev_ops->timesync_disable == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_timesync_disable(port_id);
> 	return eth_err(port_id, (*dev->dev_ops->timesync_disable)(dev));
> }
>
>@@ -5277,6 +5407,7 @@ rte_eth_timesync_read_rx_timestamp(uint16_t
>port_id, struct timespec *timestamp,
>
> 	if (*dev->dev_ops->timesync_read_rx_timestamp == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_timesync_read_rx_timestamp(port_id, timestamp,
>flags);
> 	return eth_err(port_id, (*dev->dev_ops-
>>timesync_read_rx_timestamp)
> 				(dev, timestamp, flags));
> }
>@@ -5299,6 +5430,7 @@ rte_eth_timesync_read_tx_timestamp(uint16_t
>port_id,
>
> 	if (*dev->dev_ops->timesync_read_tx_timestamp == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_timesync_read_tx_timestamp(port_id, timestamp);
> 	return eth_err(port_id, (*dev->dev_ops-
>>timesync_read_tx_timestamp)
> 				(dev, timestamp));
> }
>@@ -5313,6 +5445,7 @@ rte_eth_timesync_adjust_time(uint16_t port_id,
>int64_t delta)
>
> 	if (*dev->dev_ops->timesync_adjust_time == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_timesync_adjust_time(port_id, delta);
> 	return eth_err(port_id, (*dev->dev_ops->timesync_adjust_time)(dev,
>delta));
> }
>
>@@ -5333,6 +5466,7 @@ rte_eth_timesync_read_time(uint16_t port_id,
>struct timespec *timestamp)
>
> 	if (*dev->dev_ops->timesync_read_time == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_timesync_read_time(port_id, timestamp);
> 	return eth_err(port_id, (*dev->dev_ops->timesync_read_time)(dev,
> 								timestamp));
> }
>@@ -5354,6 +5488,7 @@ rte_eth_timesync_write_time(uint16_t port_id,
>const struct timespec *timestamp)
>
> 	if (*dev->dev_ops->timesync_write_time == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_timesync_write_time(port_id, timestamp);
> 	return eth_err(port_id, (*dev->dev_ops->timesync_write_time)(dev,
> 								timestamp));
> }
>@@ -5374,6 +5509,7 @@ rte_eth_read_clock(uint16_t port_id, uint64_t
>*clock)
>
> 	if (*dev->dev_ops->read_clock == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_read_clock(port_id, clock);
> 	return eth_err(port_id, (*dev->dev_ops->read_clock)(dev, clock));
> }
>
>@@ -5394,6 +5530,7 @@ rte_eth_dev_get_reg_info(uint16_t port_id, struct
>rte_dev_reg_info *info)
>
> 	if (*dev->dev_ops->get_reg == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_get_reg_info(port_id, info);
> 	return eth_err(port_id, (*dev->dev_ops->get_reg)(dev, info));
> }
>
>@@ -5407,6 +5544,7 @@ rte_eth_dev_get_eeprom_length(uint16_t port_id)
>
> 	if (*dev->dev_ops->get_eeprom_length == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_get_eeprom_length(port_id);
> 	return eth_err(port_id, (*dev->dev_ops->get_eeprom_length)(dev));
> }
>
>@@ -5427,6 +5565,7 @@ rte_eth_dev_get_eeprom(uint16_t port_id, struct
>rte_dev_eeprom_info *info)
>
> 	if (*dev->dev_ops->get_eeprom == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_get_eeprom(port_id, info);
> 	return eth_err(port_id, (*dev->dev_ops->get_eeprom)(dev, info));
> }
>
>@@ -5447,6 +5586,7 @@ rte_eth_dev_set_eeprom(uint16_t port_id, struct
>rte_dev_eeprom_info *info)
>
> 	if (*dev->dev_ops->set_eeprom == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_set_eeprom(port_id, info);
> 	return eth_err(port_id, (*dev->dev_ops->set_eeprom)(dev, info));
> }
>
>@@ -5468,6 +5608,7 @@ rte_eth_dev_get_module_info(uint16_t port_id,
>
> 	if (*dev->dev_ops->get_module_info == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_get_module_info(port_id, modinfo);
> 	return (*dev->dev_ops->get_module_info)(dev, modinfo);
> }
>
>@@ -5503,6 +5644,7 @@ rte_eth_dev_get_module_eeprom(uint16_t port_id,
>
> 	if (*dev->dev_ops->get_module_eeprom == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_get_module_eeprom(port_id, info);
> 	return (*dev->dev_ops->get_module_eeprom)(dev, info);
> }
>
>@@ -5526,6 +5668,7 @@ rte_eth_dev_get_dcb_info(uint16_t port_id,
>
> 	if (*dev->dev_ops->get_dcb_info == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_get_dcb_info(port_id, dcb_info);
> 	return eth_err(port_id, (*dev->dev_ops->get_dcb_info)(dev,
>dcb_info));
> }
>
>@@ -5562,6 +5705,7 @@ rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t
>port_id,
> 	if (nb_tx_desc != NULL)
> 		eth_dev_adjust_nb_desc(nb_tx_desc,
>&dev_info.tx_desc_lim);
>
>+	rte_ethdev_trace_adjust_nb_rx_tx_desc(port_id, *nb_rx_desc,
>*nb_tx_desc);
> 	return 0;
> }
>
>@@ -5584,6 +5728,7 @@ rte_eth_dev_hairpin_capability_get(uint16_t
>port_id,
> 	if (*dev->dev_ops->hairpin_cap_get == NULL)
> 		return -ENOTSUP;
> 	memset(cap, 0, sizeof(*cap));
>+	rte_ethdev_trace_hairpin_capability_get(port_id, cap);
> 	return eth_err(port_id, (*dev->dev_ops->hairpin_cap_get)(dev, cap));
> }
>
>@@ -5605,6 +5750,7 @@ rte_eth_dev_pool_ops_supported(uint16_t port_id,
>const char *pool)
> 	if (*dev->dev_ops->pool_ops_supported == NULL)
> 		return 1; /* all pools are supported */
>
>+	rte_ethdev_trace_pool_ops_supported(port_id, pool);
> 	return (*dev->dev_ops->pool_ops_supported)(dev, pool);
> }
>
>@@ -5901,6 +6047,7 @@ rte_eth_representor_info_get(uint16_t port_id,
>
> 	if (*dev->dev_ops->representor_info_get == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_representor_info_get(port_id, info);
> 	return eth_err(port_id, (*dev->dev_ops->representor_info_get)(dev,
>info));
> }
>
>@@ -5924,6 +6071,7 @@ rte_eth_rx_metadata_negotiate(uint16_t port_id,
>uint64_t *features)
> 		return -EINVAL;
> 	}
>
>+	rte_eth_trace_rx_metadata_negotiate(port_id, features, *features);
> 	if (*dev->dev_ops->rx_metadata_negotiate == NULL)
> 		return -ENOTSUP;
> 	return eth_err(port_id,
>@@ -5956,6 +6104,7 @@ rte_eth_ip_reassembly_capability_get(uint16_t
>port_id,
> 		return -ENOTSUP;
> 	memset(reassembly_capa, 0, sizeof(struct
>rte_eth_ip_reassembly_params));
>
>+	rte_eth_trace_ip_reassembly_capability_get(port_id,
>reassembly_capa);
> 	return eth_err(port_id, (*dev->dev_ops-
>>ip_reassembly_capability_get)
> 					(dev, reassembly_capa));
> }
>@@ -5985,6 +6134,7 @@ rte_eth_ip_reassembly_conf_get(uint16_t port_id,
> 	if (*dev->dev_ops->ip_reassembly_conf_get == NULL)
> 		return -ENOTSUP;
> 	memset(conf, 0, sizeof(struct rte_eth_ip_reassembly_params));
>+	rte_eth_trace_ip_reassembly_conf_get(port_id, conf);
> 	return eth_err(port_id,
> 		       (*dev->dev_ops->ip_reassembly_conf_get)(dev, conf));
> }
>@@ -6022,6 +6172,7 @@ rte_eth_ip_reassembly_conf_set(uint16_t port_id,
>
> 	if (*dev->dev_ops->ip_reassembly_conf_set == NULL)
> 		return -ENOTSUP;
>+	rte_eth_trace_ip_reassembly_conf_set(port_id, conf);
> 	return eth_err(port_id,
> 		       (*dev->dev_ops->ip_reassembly_conf_set)(dev, conf));
> }
>@@ -6041,6 +6192,7 @@ rte_eth_dev_priv_dump(uint16_t port_id, FILE *file)
>
> 	if (*dev->dev_ops->eth_dev_priv_dump == NULL)
> 		return -ENOTSUP;
>+	rte_ethdev_trace_priv_dump(port_id);
> 	return eth_err(port_id, (*dev->dev_ops->eth_dev_priv_dump)(dev,
>file));
> }
>
>diff --git a/lib/ethdev/rte_ethdev_trace.h b/lib/ethdev/rte_ethdev_trace.h
>index 1491c815c3..802f2c1ae1 100644
>--- a/lib/ethdev/rte_ethdev_trace.h
>+++ b/lib/ethdev/rte_ethdev_trace.h
>@@ -88,6 +88,1200 @@ RTE_TRACE_POINT(
> 	rte_trace_point_emit_u16(port_id);
> )
>
>+RTE_TRACE_POINT(
>+	rte_eth_trace_add_first_rx_callback,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		rte_rx_callback_fn fn, void *user_param,
>+		struct rte_eth_rxtx_callback *cb),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_ptr(fn);
>+	rte_trace_point_emit_ptr(user_param);
>+	rte_trace_point_emit_ptr(cb);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_add_rx_callback,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		rte_rx_callback_fn fn, void *user_param,
>+		struct rte_eth_rxtx_callback *cb),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_ptr(fn);
>+	rte_trace_point_emit_ptr(user_param);
>+	rte_trace_point_emit_ptr(cb);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_add_tx_callback,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		rte_tx_callback_fn fn, void *user_param,
>+		struct rte_eth_rxtx_callback *cb),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_ptr(fn);
>+	rte_trace_point_emit_ptr(user_param);
>+	rte_trace_point_emit_ptr(cb);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_allmulticast_disable,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int all_multicast),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(all_multicast);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_allmulticast_enable,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int all_multicast),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(all_multicast);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_allmulticast_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int all_multicast),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(all_multicast);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_mtu,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t mtu, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(mtu);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_adjust_nb_rx_tx_desc,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t nb_rx_desc,
>+		uint16_t nb_tx_desc),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(nb_rx_desc);
>+	rte_trace_point_emit_u16(nb_tx_desc);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_callback_register,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, enum rte_eth_event_type
>event,
>+		rte_eth_dev_cb_fn cb_fn, void *cb_arg, uint16_t next_port,
>+		uint16_t last_port),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(event);
>+	rte_trace_point_emit_ptr(cb_fn);
>+	rte_trace_point_emit_ptr(cb_arg);
>+	rte_trace_point_emit_u16(next_port);
>+	rte_trace_point_emit_u16(last_port);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_callback_unregister,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, enum rte_eth_event_type
>event,
>+		rte_eth_dev_cb_fn cb_fn, void *cb_arg, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(event);
>+	rte_trace_point_emit_ptr(cb_fn);
>+	rte_trace_point_emit_ptr(cb_arg);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_default_mac_addr_set,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>*addr, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(addr);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_flow_ctrl_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_fc_conf
>*fc_conf),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(fc_conf);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_flow_ctrl_set,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_fc_conf
>*fc_conf),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u32(fc_conf->high_water);
>+	rte_trace_point_emit_u32(fc_conf->low_water);
>+	rte_trace_point_emit_u16(fc_conf->pause_time);
>+	rte_trace_point_emit_u16(fc_conf->send_xon);
>+	rte_trace_point_emit_int(fc_conf->mode);
>+	rte_trace_point_emit_u8(fc_conf->mac_ctrl_frame_fwd);
>+	rte_trace_point_emit_u8(fc_conf->autoneg);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_fw_version_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, char *fw_version, size_t
>fw_size),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(fw_version);
>+	rte_trace_point_emit_size_t(fw_size);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_dcb_info,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_dcb_info
>*dcb_info),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(dcb_info);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_eeprom,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct
>rte_dev_eeprom_info *info),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(info);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_eeprom_length,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_mtu,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t mtu),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(mtu);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_count_avail,
>+	RTE_TRACE_POINT_ARGS(uint16_t count),
>+	rte_trace_point_emit_u16(count);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_count_total,
>+	RTE_TRACE_POINT_ARGS(uint16_t count),
>+	rte_trace_point_emit_u16(count);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_name_by_port,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, char *name),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_string(name);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_port_by_name,
>+	RTE_TRACE_POINT_ARGS(const char *name, uint16_t port_id),
>+	rte_trace_point_emit_string(name);
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_reg_info,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_dev_reg_info
>*info),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(info);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_sec_ctx,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_supported_ptypes,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t ptype_mask,
>+		uint32_t *ptypes, int num, int j),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u32(ptype_mask);
>+	rte_trace_point_emit_ptr(ptypes);
>+	rte_trace_point_emit_int(num);
>+	rte_trace_point_emit_int(j);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_vlan_offload,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_info_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_dev_info *dev_info),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_string(dev_info->driver_name);
>+	rte_trace_point_emit_u32(dev_info->if_index);
>+	rte_trace_point_emit_u16(dev_info->min_mtu);
>+	rte_trace_point_emit_u16(dev_info->max_mtu);
>+	rte_trace_point_emit_u32(dev_info->min_rx_bufsize);
>+	rte_trace_point_emit_u32(dev_info->max_rx_pktlen);
>+	rte_trace_point_emit_u64(dev_info->rx_offload_capa);
>+	rte_trace_point_emit_u64(dev_info->tx_offload_capa);
>+	rte_trace_point_emit_u64(dev_info->rx_queue_offload_capa);
>+	rte_trace_point_emit_u64(dev_info->tx_queue_offload_capa);
>+	rte_trace_point_emit_u16(dev_info->reta_size);
>+	rte_trace_point_emit_u8(dev_info->hash_key_size);
>+	rte_trace_point_emit_u16(dev_info->nb_rx_queues);
>+	rte_trace_point_emit_u16(dev_info->nb_tx_queues);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_is_removed,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_is_valid_port,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_mac_addr_add,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>*addr,
>+		uint32_t pool),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(addr);
>+	rte_trace_point_emit_u32(pool);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_mac_addr_remove,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>*addr),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(addr);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_pool_ops_supported,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const char *pool),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(pool);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_priority_flow_ctrl_set,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_pfc_conf
>*pfc_conf),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u32(pfc_conf->fc.high_water);
>+	rte_trace_point_emit_u32(pfc_conf->fc.low_water);
>+	rte_trace_point_emit_u16(pfc_conf->fc.pause_time);
>+	rte_trace_point_emit_u16(pfc_conf->fc.send_xon);
>+	rte_trace_point_emit_int(pfc_conf->fc.mode);
>+	rte_trace_point_emit_u8(pfc_conf->fc.mac_ctrl_frame_fwd);
>+	rte_trace_point_emit_u8(pfc_conf->fc.autoneg);
>+	rte_trace_point_emit_u8(pfc_conf->priority);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_reset,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rss_hash_conf_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_rss_conf
>*rss_conf),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(rss_conf);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rss_hash_update,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_rss_conf
>*rss_conf),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(rss_conf->rss_key);
>+	rte_trace_point_emit_u8(rss_conf->rss_key_len);
>+	rte_trace_point_emit_u64(rss_conf->rss_hf);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rss_reta_query,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t
>reta_size),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(reta_conf);
>+	rte_trace_point_emit_u16(reta_size);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rss_reta_update,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t
>reta_size),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u64(reta_conf->mask);
>+	rte_trace_point_emit_u16(reta_size);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rx_intr_ctl,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int epfd, int op, void
>*data, int rc),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(epfd);
>+	rte_trace_point_emit_int(op);
>+	rte_trace_point_emit_ptr(data);
>+	rte_trace_point_emit_int(rc);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rx_intr_ctl_q,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id, int
>epfd,
>+		int op, void *data, int rc),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_int(epfd);
>+	rte_trace_point_emit_int(op);
>+	rte_trace_point_emit_ptr(data);
>+	rte_trace_point_emit_int(rc);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rx_intr_ctl_q_get_fd,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id, int fd),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_int(fd);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rx_intr_disable,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rx_intr_enable,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rx_offload_name,
>+	RTE_TRACE_POINT_ARGS(uint64_t offload, const char *name),
>+	rte_trace_point_emit_u64(offload);
>+	rte_trace_point_emit_string(name);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rx_queue_start,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(rx_queue_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_rx_queue_stop,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(rx_queue_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_eeprom,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct
>rte_dev_eeprom_info *info),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(info->data);
>+	rte_trace_point_emit_u32(info->offset);
>+	rte_trace_point_emit_u32(info->length);
>+	rte_trace_point_emit_u32(info->magic);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_link_down,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_link_up,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_mc_addr_list,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_ether_addr *mc_addr_set,
>+		uint32_t nb_mc_addr),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(mc_addr_set);
>+	rte_trace_point_emit_u32(nb_mc_addr);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_ptypes,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t ptype_mask,
>+		uint32_t *set_ptypes, unsigned int num),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u32(ptype_mask);
>+	rte_trace_point_emit_ptr(set_ptypes);
>+	rte_trace_point_emit_u32(num);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_rx_queue_stats_mapping,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
>+		uint8_t stat_idx),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(rx_queue_id);
>+	rte_trace_point_emit_u8(stat_idx);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_tx_queue_stats_mapping,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
>+		uint8_t stat_idx),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(tx_queue_id);
>+	rte_trace_point_emit_u8(stat_idx);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_vlan_ether_type,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, enum rte_vlan_type
>vlan_type,
>+		uint16_t tag_type),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(vlan_type);
>+	rte_trace_point_emit_u16(tag_type);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_vlan_offload,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int offload_mask, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(offload_mask);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_vlan_pvid,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t pvid, int on),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(pvid);
>+	rte_trace_point_emit_int(on);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_set_vlan_strip_on_queue,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
>+		int on),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(rx_queue_id);
>+	rte_trace_point_emit_int(on);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_socket_id,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_tx_offload_name,
>+	RTE_TRACE_POINT_ARGS(uint64_t offload, const char *name),
>+	rte_trace_point_emit_u64(offload);
>+	rte_trace_point_emit_string(name);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_tx_queue_start,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(tx_queue_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_tx_queue_stop,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(tx_queue_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_uc_all_hash_table_set,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint8_t on),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u8(on);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_uc_hash_table_set,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>*addr,
>+		uint8_t on, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(addr);
>+	rte_trace_point_emit_u8(on);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_udp_tunnel_port_add,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_udp_tunnel
>*tunnel_udp),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(tunnel_udp->udp_port);
>+	rte_trace_point_emit_u8(tunnel_udp->prot_type);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_udp_tunnel_port_delete,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_udp_tunnel
>*tunnel_udp),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(tunnel_udp->udp_port);
>+	rte_trace_point_emit_u8(tunnel_udp->prot_type);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_vlan_filter,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t vlan_id, int on,
>int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(vlan_id);
>+	rte_trace_point_emit_int(on);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_find_next,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_find_next_of,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id_start,
>+		const struct rte_device *parent),
>+	rte_trace_point_emit_u16(port_id_start);
>+	rte_trace_point_emit_ptr(parent);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_find_next_owned_by,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		const uint64_t owner_id),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u64(owner_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_find_next_sibling,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id_start, uint16_t
>ref_port_id),
>+	rte_trace_point_emit_u16(port_id_start);
>+	rte_trace_point_emit_u16(ref_port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_iterator_cleanup,
>+	RTE_TRACE_POINT_ARGS(struct rte_dev_iterator *iter),
>+	rte_trace_point_emit_ptr(iter);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_iterator_init,
>+	RTE_TRACE_POINT_ARGS(struct rte_dev_iterator *iter, const char
>*devargs),
>+	rte_trace_point_emit_ptr(iter);
>+	rte_trace_point_emit_ptr(devargs);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_iterator_next,
>+	RTE_TRACE_POINT_ARGS(struct rte_dev_iterator *iter),
>+	rte_trace_point_emit_ptr(iter);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_led_off,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_led_on,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_link_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_link *link),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u32(link->link_speed);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_link_get_nowait,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_link *link),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u32(link->link_speed);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_macaddr_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>*mac_addr),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(mac_addr);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_promiscuous_disable,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int promiscuous),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(promiscuous);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_promiscuous_enable,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int promiscuous),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(promiscuous);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_promiscuous_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int promiscuous),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_int(promiscuous);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_remove_rx_callback,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		const struct rte_eth_rxtx_callback *user_cb, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_ptr(user_cb);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_remove_tx_callback,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		const struct rte_eth_rxtx_callback *user_cb, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_ptr(user_cb);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_rx_burst_mode_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		struct rte_eth_burst_mode *mode),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_ptr(mode);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_rx_queue_info_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		struct rte_eth_rxq_info *qinfo),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_ptr(qinfo->mp);
>+	rte_trace_point_emit_u8(qinfo->scattered_rx);
>+	rte_trace_point_emit_u8(qinfo->queue_state);
>+	rte_trace_point_emit_u16(qinfo->nb_desc);
>+	rte_trace_point_emit_u16(qinfo->rx_buf_size);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_rx_queue_setup,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
>+		uint16_t nb_rx_desc, unsigned int socket_id,
>+		const struct rte_eth_rxconf *rx_conf,
>+		struct rte_mempool *mb_pool),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(rx_queue_id);
>+	rte_trace_point_emit_u16(nb_rx_desc);
>+	rte_trace_point_emit_u32(socket_id);
>+	rte_trace_point_emit_ptr(rx_conf);
>+	rte_trace_point_emit_ptr(mb_pool);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_set_queue_rate_limit,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_idx,
>+		uint16_t tx_rate),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_idx);
>+	rte_trace_point_emit_u16(tx_rate);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_speed_bitflag,
>+	RTE_TRACE_POINT_ARGS(uint32_t speed, int duplex),
>+	rte_trace_point_emit_u32(speed);
>+	rte_trace_point_emit_int(duplex);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_stats_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_stats
>*stats),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(stats);
>+	rte_trace_point_emit_u64(stats->rx_nombuf);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_stats_reset,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_timesync_adjust_time,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int64_t delta),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_i64(delta);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_timesync_disable,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_timesync_enable,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_timesync_read_rx_timestamp,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct timespec
>*timestamp,
>+		uint32_t flags),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(timestamp);
>+	rte_trace_point_emit_u32(flags);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_timesync_read_time,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct timespec *time),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(time);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_timesync_read_tx_timestamp,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct timespec
>*timestamp),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(timestamp);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_timesync_write_time,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const struct timespec
>*time),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(time);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_tx_buffer_count_callback,
>+	RTE_TRACE_POINT_ARGS(struct rte_mbuf **pkts, uint16_t unsent,
>+		uint64_t count),
>+	rte_trace_point_emit_ptr(pkts);
>+	rte_trace_point_emit_u16(unsent);
>+	rte_trace_point_emit_u64(count);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_tx_buffer_drop_callback,
>+	RTE_TRACE_POINT_ARGS(struct rte_mbuf **pkts, uint16_t unsent),
>+	rte_trace_point_emit_ptr(pkts);
>+	rte_trace_point_emit_u16(unsent);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_tx_buffer_init,
>+	RTE_TRACE_POINT_ARGS(struct rte_eth_dev_tx_buffer *buffer,
>uint16_t size,
>+		int ret),
>+	rte_trace_point_emit_ptr(buffer);
>+	rte_trace_point_emit_u16(size);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_tx_buffer_set_err_callback,
>+	RTE_TRACE_POINT_ARGS(struct rte_eth_dev_tx_buffer *buffer,
>+		buffer_tx_error_fn callback, void *userdata),
>+	rte_trace_point_emit_ptr(buffer);
>+	rte_trace_point_emit_ptr(callback);
>+	rte_trace_point_emit_ptr(userdata);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_tx_burst_mode_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		struct rte_eth_burst_mode *mode),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_ptr(mode);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_tx_done_cleanup,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>uint32_t free_cnt,
>+		int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_u32(free_cnt);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_tx_queue_info_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		struct rte_eth_txq_info *qinfo),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_u16(qinfo->nb_desc);
>+	rte_trace_point_emit_u8(qinfo->queue_state);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_xstats_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_xstat xstats,
>+		int i),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u64(xstats.id);
>+	rte_trace_point_emit_u64(xstats.value);
>+	rte_trace_point_emit_u32(i);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_xstats_get_by_id,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const uint64_t *ids,
>+		uint64_t *values, unsigned int size),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(ids);
>+	rte_trace_point_emit_ptr(values);
>+	rte_trace_point_emit_u32(size);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_xstats_get_id_by_name,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const char *xstat_name,
>+		uint64_t *id),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_string(xstat_name);
>+	rte_trace_point_emit_ptr(id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_xstats_get_names,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_xstat_name *xstats_names,
>+		unsigned int size, int cnt_used_entries),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_string(xstats_names->name);
>+	rte_trace_point_emit_u32(size);
>+	rte_trace_point_emit_int(cnt_used_entries);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_xstats_get_names_by_id,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_xstat_name *xstats_names, uint64_t ids),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_string(xstats_names->name);
>+	rte_trace_point_emit_u64(ids);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_xstats_reset,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_owner_delete,
>+	RTE_TRACE_POINT_ARGS(const uint64_t owner_id, int ret),
>+	rte_trace_point_emit_u64(owner_id);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_owner_get,
>+	RTE_TRACE_POINT_ARGS(const uint16_t port_id,
>+		struct rte_eth_dev_owner *owner),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u64(owner->id);
>+	rte_trace_point_emit_string(owner->name);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_owner_new,
>+	RTE_TRACE_POINT_ARGS(uint64_t owner_id),
>+	rte_trace_point_emit_u64(owner_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_owner_set,
>+	RTE_TRACE_POINT_ARGS(const uint16_t port_id,
>+		const struct rte_eth_dev_owner *owner, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u64(owner->id);
>+	rte_trace_point_emit_string(owner->name);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_owner_unset,
>+	RTE_TRACE_POINT_ARGS(const uint16_t port_id,
>+		const uint64_t owner_id, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u64(owner_id);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_module_eeprom,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_dev_eeprom_info *info),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(info);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_get_module_info,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_dev_module_info *modinfo),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(modinfo);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_read_clock,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint64_t *clk),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(clk);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_hairpin_capability_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_hairpin_cap *cap),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(cap);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_rx_hairpin_queue_setup,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
>+		uint16_t nb_rx_desc, const struct rte_eth_hairpin_conf *conf,
>+		int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(rx_queue_id);
>+	rte_trace_point_emit_u16(nb_rx_desc);
>+	rte_trace_point_emit_ptr(conf);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_tx_hairpin_queue_setup,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
>+		uint16_t nb_tx_desc, const struct rte_eth_hairpin_conf *conf,
>+		int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(tx_queue_id);
>+	rte_trace_point_emit_u16(nb_tx_desc);
>+	rte_trace_point_emit_ptr(conf);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_hairpin_bind,
>+	RTE_TRACE_POINT_ARGS(uint16_t tx_port, uint16_t rx_port, int ret),
>+	rte_trace_point_emit_u16(tx_port);
>+	rte_trace_point_emit_u16(rx_port);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_hairpin_get_peer_ports,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t *peer_ports,
>+		size_t len, uint32_t direction, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(peer_ports);
>+	rte_trace_point_emit_size_t(len);
>+	rte_trace_point_emit_u32(direction);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_hairpin_unbind,
>+	RTE_TRACE_POINT_ARGS(uint16_t tx_port, uint16_t rx_port, int ret),
>+	rte_trace_point_emit_u16(tx_port);
>+	rte_trace_point_emit_u16(rx_port);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_link_speed_to_str,
>+	RTE_TRACE_POINT_ARGS(uint32_t link_speed),
>+	rte_trace_point_emit_u32(link_speed);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_link_to_str,
>+	RTE_TRACE_POINT_ARGS(char *str, size_t len,
>+		const struct rte_eth_link *eth_link),
>+	rte_trace_point_emit_ptr(str);
>+	rte_trace_point_emit_size_t(len);
>+	rte_trace_point_emit_ptr(eth_link);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_fec_get_capability,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_fec_capa *speed_fec_capa,
>+		unsigned int num, int ret),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(speed_fec_capa);
>+	rte_trace_point_emit_u32(num);
>+	rte_trace_point_emit_int(ret);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_fec_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t *fec_capa),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(fec_capa);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_fec_set,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t fec_capa),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u32(fec_capa);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_get_monitor_addr,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		struct rte_power_monitor_cond *pmc),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_ptr(pmc);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_representor_info_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_representor_info *info),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(info);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_capability_name,
>+	RTE_TRACE_POINT_ARGS(uint64_t capability, const char *name),
>+	rte_trace_point_emit_u64(capability);
>+	rte_trace_point_emit_string(name);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_conf_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_conf
>*dev_conf),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(dev_conf);
>+	rte_trace_point_emit_u32(dev_conf->link_speeds);
>+	rte_trace_point_emit_u64(dev_conf->rxmode.offloads);
>+	rte_trace_point_emit_u64(dev_conf->txmode.offloads);
>+	rte_trace_point_emit_u32(dev_conf->lpbk_mode);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_macaddrs_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>*ma,
>+		unsigned int num),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(ma);
>+	rte_trace_point_emit_u32(num);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_rx_metadata_negotiate,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint64_t *features,
>+		uint64_t features_val),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(features);
>+	rte_trace_point_emit_u64(features_val);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_priority_flow_ctrl_queue_configure,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_pfc_queue_conf *pfc_queue_conf),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(pfc_queue_conf);
>+	rte_trace_point_emit_int(pfc_queue_conf->mode);
>+	rte_trace_point_emit_u16(pfc_queue_conf->rx_pause.tx_qid);
>+	rte_trace_point_emit_u16(pfc_queue_conf->tx_pause.rx_qid);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_priority_flow_ctrl_queue_info_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_pfc_queue_info *pfc_queue_info),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(pfc_queue_info);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_ethdev_trace_priv_dump,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>+	rte_trace_point_emit_u16(port_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_ip_reassembly_capability_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_ip_reassembly_params *capa),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(capa);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_ip_reassembly_conf_get,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		struct rte_eth_ip_reassembly_params *conf),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(conf);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_ip_reassembly_conf_set,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>+		const struct rte_eth_ip_reassembly_params *conf),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_ptr(conf);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_rx_avail_thresh_query,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+)
>+
>+RTE_TRACE_POINT(
>+	rte_eth_trace_rx_avail_thresh_set,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		uint8_t avail_thresh),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_u8(avail_thresh);
>+)
>+
> #ifdef __cplusplus
> }
> #endif
>diff --git a/lib/ethdev/rte_ethdev_trace_fp.h
>b/lib/ethdev/rte_ethdev_trace_fp.h
>index 40084d1929..ba3fdd04a2 100644
>--- a/lib/ethdev/rte_ethdev_trace_fp.h
>+++ b/lib/ethdev/rte_ethdev_trace_fp.h
>@@ -37,6 +37,25 @@ RTE_TRACE_POINT_FP(
> 	rte_trace_point_emit_u16(nb_pkts);
> )
>
>+RTE_TRACE_POINT_FP(
>+	rte_eth_trace_call_rx_callbacks,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		uint16_t nb_rx, uint16_t nb_pkts),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_u16(nb_rx);
>+	rte_trace_point_emit_u16(nb_pkts);
>+)
>+
>+RTE_TRACE_POINT_FP(
>+	rte_eth_trace_call_tx_callbacks,
>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>+		uint16_t nb_pkts),
>+	rte_trace_point_emit_u16(port_id);
>+	rte_trace_point_emit_u16(queue_id);
>+	rte_trace_point_emit_u16(nb_pkts);
>+)
>+
> #ifdef __cplusplus
> }
> #endif
>diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
>index 3651ceb234..79d0b2ee1f 100644
>--- a/lib/ethdev/version.map
>+++ b/lib/ethdev/version.map
>@@ -319,4 +319,148 @@ INTERNAL {
> 	rte_eth_representor_id_get;
> 	rte_eth_switch_domain_alloc;
> 	rte_eth_switch_domain_free;
>+	__rte_eth_trace_add_first_rx_callback;
>+	__rte_eth_trace_add_rx_callback;
>+	__rte_eth_trace_add_tx_callback;
>+	__rte_eth_trace_allmulticast_disable;
>+	__rte_eth_trace_allmulticast_enable;
>+	__rte_eth_trace_allmulticast_get;
>+	__rte_eth_trace_call_rx_callbacks;
>+	__rte_eth_trace_call_tx_callbacks;
>+	__rte_ethdev_trace_count_avail;
>+	__rte_ethdev_trace_count_total;
>+	__rte_ethdev_trace_set_mtu;
>+	__rte_ethdev_trace_adjust_nb_rx_tx_desc;
>+	__rte_ethdev_trace_callback_register;
>+	__rte_ethdev_trace_callback_unregister;
>+	__rte_ethdev_trace_default_mac_addr_set;
>+	__rte_ethdev_trace_flow_ctrl_get;
>+	__rte_ethdev_trace_flow_ctrl_set;
>+	__rte_ethdev_trace_fw_version_get;
>+	__rte_ethdev_trace_get_dcb_info;
>+	__rte_ethdev_trace_get_eeprom;
>+	__rte_ethdev_trace_get_eeprom_length;
>+	__rte_ethdev_trace_get_mtu;
>+	__rte_ethdev_trace_get_name_by_port;
>+	__rte_ethdev_trace_get_port_by_name;
>+	__rte_ethdev_trace_get_reg_info;
>+	__rte_ethdev_trace_get_sec_ctx;
>+	__rte_ethdev_trace_get_supported_ptypes;
>+	__rte_ethdev_trace_get_vlan_offload;
>+	__rte_ethdev_trace_info_get;
>+	__rte_ethdev_trace_is_removed;
>+	__rte_ethdev_trace_is_valid_port;
>+	__rte_ethdev_trace_mac_addr_add;
>+	__rte_ethdev_trace_mac_addr_remove;
>+	__rte_ethdev_trace_pool_ops_supported;
>+	__rte_ethdev_trace_priority_flow_ctrl_set;
>+	__rte_ethdev_trace_reset;
>+	__rte_ethdev_trace_rss_hash_conf_get;
>+	__rte_ethdev_trace_rss_hash_update;
>+	__rte_ethdev_trace_rss_reta_query;
>+	__rte_ethdev_trace_rss_reta_update;
>+	__rte_ethdev_trace_rx_intr_ctl;
>+	__rte_ethdev_trace_rx_intr_ctl_q;
>+	__rte_ethdev_trace_rx_intr_ctl_q_get_fd;
>+	__rte_ethdev_trace_rx_intr_disable;
>+	__rte_ethdev_trace_rx_intr_enable;
>+	__rte_ethdev_trace_rx_offload_name;
>+	__rte_ethdev_trace_rx_queue_start;
>+	__rte_ethdev_trace_rx_queue_stop;
>+	__rte_ethdev_trace_set_eeprom;
>+	__rte_ethdev_trace_set_link_down;
>+	__rte_ethdev_trace_set_link_up;
>+	__rte_ethdev_trace_set_mc_addr_list;
>+	__rte_ethdev_trace_set_ptypes;
>+	__rte_ethdev_trace_set_rx_queue_stats_mapping;
>+	__rte_ethdev_trace_set_tx_queue_stats_mapping;
>+	__rte_ethdev_trace_set_vlan_ether_type;
>+	__rte_ethdev_trace_set_vlan_offload;
>+	__rte_ethdev_trace_set_vlan_pvid;
>+	__rte_ethdev_trace_set_vlan_strip_on_queue;
>+	__rte_ethdev_trace_socket_id;
>+	__rte_ethdev_trace_tx_offload_name;
>+	__rte_ethdev_trace_tx_queue_start;
>+	__rte_ethdev_trace_tx_queue_stop;
>+	__rte_ethdev_trace_uc_all_hash_table_set;
>+	__rte_ethdev_trace_uc_hash_table_set;
>+	__rte_ethdev_trace_udp_tunnel_port_add;
>+	__rte_ethdev_trace_udp_tunnel_port_delete;
>+	__rte_ethdev_trace_vlan_filter;
>+	__rte_eth_trace_find_next;
>+	__rte_eth_trace_find_next_of;
>+	__rte_eth_trace_find_next_owned_by;
>+	__rte_eth_trace_find_next_sibling;
>+	__rte_eth_trace_iterator_cleanup;
>+	__rte_eth_trace_iterator_init;
>+	__rte_eth_trace_iterator_next;
>+	__rte_eth_trace_led_off;
>+	__rte_eth_trace_led_on;
>+	__rte_eth_trace_link_get;
>+	__rte_eth_trace_link_get_nowait;
>+	__rte_eth_trace_macaddr_get;
>+	__rte_eth_trace_promiscuous_disable;
>+	__rte_eth_trace_promiscuous_enable;
>+	__rte_eth_trace_promiscuous_get;
>+	__rte_eth_trace_remove_rx_callback;
>+	__rte_eth_trace_remove_tx_callback;
>+	__rte_eth_trace_rx_burst_mode_get;
>+	__rte_eth_trace_rx_queue_info_get;
>+	__rte_eth_trace_rx_queue_setup;
>+	__rte_eth_trace_set_queue_rate_limit;
>+	__rte_eth_trace_speed_bitflag;
>+	__rte_eth_trace_stats_get;
>+	__rte_eth_trace_stats_reset;
>+	__rte_eth_trace_timesync_adjust_time;
>+	__rte_eth_trace_timesync_disable;
>+	__rte_eth_trace_timesync_enable;
>+	__rte_eth_trace_timesync_read_rx_timestamp;
>+	__rte_eth_trace_timesync_read_time;
>+	__rte_eth_trace_timesync_read_tx_timestamp;
>+	__rte_eth_trace_timesync_write_time;
>+	__rte_eth_trace_tx_buffer_count_callback;
>+	__rte_eth_trace_tx_buffer_drop_callback;
>+	__rte_eth_trace_tx_buffer_init;
>+	__rte_eth_trace_tx_buffer_set_err_callback;
>+	__rte_eth_trace_tx_burst_mode_get;
>+	__rte_eth_trace_tx_done_cleanup;
>+	__rte_eth_trace_tx_queue_info_get;
>+	__rte_eth_trace_xstats_get;
>+	__rte_eth_trace_xstats_get_by_id;
>+	__rte_eth_trace_xstats_get_id_by_name;
>+	__rte_eth_trace_xstats_get_names;
>+	__rte_eth_trace_xstats_get_names_by_id;
>+	__rte_eth_trace_xstats_reset;
>+	__rte_ethdev_trace_owner_delete;
>+	__rte_ethdev_trace_owner_get;
>+	__rte_ethdev_trace_owner_new;
>+	__rte_ethdev_trace_owner_set;
>+	__rte_ethdev_trace_owner_unset;
>+	__rte_ethdev_trace_get_module_eeprom;
>+	__rte_ethdev_trace_get_module_info;
>+	__rte_ethdev_trace_hairpin_capability_get;
>+	__rte_eth_trace_rx_hairpin_queue_setup;
>+	__rte_eth_trace_tx_hairpin_queue_setup;
>+	__rte_eth_trace_hairpin_bind;
>+	__rte_eth_trace_hairpin_get_peer_ports;
>+	__rte_eth_trace_hairpin_unbind;
>+	__rte_eth_trace_link_speed_to_str;
>+	__rte_eth_trace_link_to_str;
>+	__rte_eth_trace_fec_get_capability;
>+	__rte_eth_trace_fec_get;
>+	__rte_eth_trace_fec_set;
>+	__rte_eth_trace_get_monitor_addr;
>+	__rte_eth_trace_representor_info_get;
>+	__rte_ethdev_trace_capability_name;
>+	__rte_ethdev_trace_conf_get;
>+	__rte_eth_trace_macaddrs_get;
>+	__rte_eth_trace_rx_metadata_negotiate;
>+	__rte_ethdev_trace_priority_flow_ctrl_queue_configure;
>+	__rte_ethdev_trace_priority_flow_ctrl_queue_info_get;
>+	__rte_ethdev_trace_priv_dump;
>+	__rte_eth_trace_ip_reassembly_capability_get;
>+	__rte_eth_trace_ip_reassembly_conf_get;
>+	__rte_eth_trace_ip_reassembly_conf_set;
>+	__rte_eth_trace_rx_avail_thresh_query;
>+	__rte_eth_trace_rx_avail_thresh_set;
> };
>--
>2.28.0
  
Ankur Dwivedi Oct. 10, 2022, 6:39 a.m. UTC | #3
Hi All,

>-----Original Message-----
>From: Ankur Dwivedi
>Sent: Friday, October 7, 2022 9:54 PM
>To: dev@dpdk.org; Morten Brørup <mb@smartsharesystems.com>
>Cc: thomas@monjalon.net; mdr@ashroe.eu; orika@nvidia.com;
>ferruh.yigit@xilinx.com; chas3@att.com; humin29@huawei.com;
>linville@tuxdriver.com; ciara.loftus@intel.com; qi.z.zhang@intel.com;
>mw@semihalf.com; mk@semihalf.com; shaibran@amazon.com;
>evgenys@amazon.com; igorch@amazon.com; chandu@amd.com; Igor Russkikh
><irusskikh@marvell.com>; shepard.siegel@atomicrules.com;
>ed.czeck@atomicrules.com; john.miller@atomicrules.com;
>ajit.khaparde@broadcom.com; somnath.kotur@broadcom.com; Jerin Jacob
>Kollanukkaran <jerinj@marvell.com>; Maciej Czekaj [C]
><mczekaj@marvell.com>; Shijith Thotton <sthotton@marvell.com>;
>Srisivasubramanian Srinivasan <srinivasan@marvell.com>; Harman Kalra
><hkalra@marvell.com>; rahul.lakkireddy@chelsio.com; johndale@cisco.com;
>hyonkim@cisco.com; liudongdong3@huawei.com; yisen.zhuang@huawei.com;
>xuanziyang2@huawei.com; cloud.wangxiaoyun@huawei.com;
>zhouguoyang@huawei.com; simei.su@intel.com; wenjun1.wu@intel.com;
>qiming.yang@intel.com; Yuying.Zhang@intel.com; beilei.xing@intel.com;
>xiao.w.wang@intel.com; jingjing.wu@intel.com; junfeng.guo@intel.com;
>rosen.xu@intel.com; Nithin Kumar Dabilpuram <ndabilpuram@marvell.com>;
>Kiran Kumar Kokkilagadda <kirankumark@marvell.com>; Sunil Kumar Kori
><skori@marvell.com>; Satha Koteswara Rao Kottidi
><skoteshwar@marvell.com>; Liron Himi <lironh@marvell.com>;
>zr@semihalf.com; Radha Chintakuntla <radhac@marvell.com>;
>Veerasenareddy Burru <vburru@marvell.com>; Sathesh B Edara
><sedara@marvell.com>; matan@nvidia.com; viacheslavo@nvidia.com;
>sthemmin@microsoft.com; longli@microsoft.com; spinler@cesnet.cz;
>chaoyong.he@corigine.com; niklas.soderlund@corigine.com;
>hemant.agrawal@nxp.com; sachin.saxena@oss.nxp.com; g.singh@nxp.com;
>apeksha.gupta@nxp.com; sachin.saxena@nxp.com; aboyer@pensando.io;
>Rasesh Mody <rmody@marvell.com>; Shahed Shaikh
><shshaikh@marvell.com>; Devendra Singh Rawat
><dsinghrawat@marvell.com>; andrew.rybchenko@oktetlabs.ru;
>jiawenwu@trustnetic.com; jianwang@trustnetic.com; jbehrens@vmware.com;
>maxime.coquelin@redhat.com; chenbo.xia@intel.com;
>steven.webster@windriver.com; matt.peters@windriver.com;
>bruce.richardson@intel.com; mtetsuyah@gmail.com; grive@u256.net;
>jasvinder.singh@intel.com; cristian.dumitrescu@intel.com; jgrajcia@cisco.com
>Subject: RE: [PATCH v3 1/4] ethdev: add trace points
>
>Hi Morten,
>
>>-----Original Message-----
>>From: Ankur Dwivedi <adwivedi@marvell.com>
>>Sent: Thursday, October 6, 2022 8:49 PM
>>To: dev@dpdk.org
>>Cc: thomas@monjalon.net; mdr@ashroe.eu; orika@nvidia.com;
>>ferruh.yigit@xilinx.com; chas3@att.com; humin29@huawei.com;
>>linville@tuxdriver.com; ciara.loftus@intel.com; qi.z.zhang@intel.com;
>>mw@semihalf.com; mk@semihalf.com; shaibran@amazon.com;
>>evgenys@amazon.com; igorch@amazon.com; chandu@amd.com; Igor
>>Russkikh <irusskikh@marvell.com>; shepard.siegel@atomicrules.com;
>>ed.czeck@atomicrules.com; john.miller@atomicrules.com;
>>ajit.khaparde@broadcom.com; somnath.kotur@broadcom.com; Jerin Jacob
>>Kollanukkaran <jerinj@marvell.com>; Maciej Czekaj [C]
>><mczekaj@marvell.com>; Shijith Thotton <sthotton@marvell.com>;
>>Srisivasubramanian Srinivasan <srinivasan@marvell.com>; Harman Kalra
>><hkalra@marvell.com>; rahul.lakkireddy@chelsio.com; johndale@cisco.com;
>>hyonkim@cisco.com; liudongdong3@huawei.com;
>>yisen.zhuang@huawei.com; xuanziyang2@huawei.com;
>>cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com;
>>simei.su@intel.com; wenjun1.wu@intel.com; qiming.yang@intel.com;
>>Yuying.Zhang@intel.com; beilei.xing@intel.com; xiao.w.wang@intel.com;
>>jingjing.wu@intel.com; junfeng.guo@intel.com; rosen.xu@intel.com; Nithin
>>Kumar Dabilpuram <ndabilpuram@marvell.com>; Kiran Kumar Kokkilagadda
>><kirankumark@marvell.com>; Sunil Kumar Kori <skori@marvell.com>; Satha
>>Koteswara Rao Kottidi <skoteshwar@marvell.com>; Liron Himi
>><lironh@marvell.com>; zr@semihalf.com; Radha Chintakuntla
>><radhac@marvell.com>; Veerasenareddy Burru <vburru@marvell.com>;
>>Sathesh B Edara <sedara@marvell.com>; matan@nvidia.com;
>>viacheslavo@nvidia.com; sthemmin@microsoft.com; longli@microsoft.com;
>>spinler@cesnet.cz; chaoyong.he@corigine.com;
>>niklas.soderlund@corigine.com; hemant.agrawal@nxp.com;
>>sachin.saxena@oss.nxp.com; g.singh@nxp.com; apeksha.gupta@nxp.com;
>>sachin.saxena@nxp.com; aboyer@pensando.io; Rasesh Mody
>><rmody@marvell.com>; Shahed Shaikh <shshaikh@marvell.com>; Devendra
>>Singh Rawat <dsinghrawat@marvell.com>; andrew.rybchenko@oktetlabs.ru;
>>jiawenwu@trustnetic.com; jianwang@trustnetic.com;
>>jbehrens@vmware.com; maxime.coquelin@redhat.com;
>>chenbo.xia@intel.com; steven.webster@windriver.com;
>>matt.peters@windriver.com; bruce.richardson@intel.com;
>>mtetsuyah@gmail.com; grive@u256.net; jasvinder.singh@intel.com;
>>cristian.dumitrescu@intel.com; jgrajcia@cisco.com; Ankur Dwivedi
>><adwivedi@marvell.com>
>>Subject: [PATCH v3 1/4] ethdev: add trace points
>>
>>Add trace points for ethdev functions.
>>
>>Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>
>>---
>Yes the functions you mentioned in previous comment are called in while loop
>in worker core. So I think they are fastpath.
>rte_eth_stats_get() is called in fastpath. Similar to rte_eth_macaddr_get(), I
>think functions like
>rte_eth_pro miscuous_get(), rte_eth_allmulticast_get() can also be called in
>fastpath.
>I am not sure which other functions can be fastpath. Is there a guideline/theme
>which can be used to determine this?
[Ankur] I will make the trace call in following functions as fast path trace, considering they are used in while loop in worker core or as rx/tx callback in examples applications.
rte_eth_tx_buffer_drop_callback
rte_eth_tx_buffer_count_callback
rte_eth_tx_done_cleanup
rte_eth_macaddr_get
rte_eth_timesync_read_rx_timestamp
rte_eth_timesync_read_tx_timestamp
rte_eth_timesync_adjust_time
rte_eth_timesync_read_time
rte_eth_timesync_write_time
rte_eth_stats_get
rte_flow_get_restore_info
rte_eth_read_clock

Please let me know your comments on the patch series.
>
>> lib/ethdev/ethdev_private.c      |    3 +
>> lib/ethdev/ethdev_trace_points.c |  435 +++++++++++
>> lib/ethdev/rte_ethdev.c          |  152 ++++
>> lib/ethdev/rte_ethdev_trace.h    | 1194 ++++++++++++++++++++++++++++++
>> lib/ethdev/rte_ethdev_trace_fp.h |   19 +
>> lib/ethdev/version.map           |  144 ++++
>> 6 files changed, 1947 insertions(+)
>>
>>diff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c
>>index 48090c879a..08e7f49fd8 100644
>>--- a/lib/ethdev/ethdev_private.c
>>+++ b/lib/ethdev/ethdev_private.c
>>@@ -5,6 +5,7 @@
>> #include <rte_debug.h>
>>
>> #include "rte_ethdev.h"
>>+#include "rte_ethdev_trace.h"
>> #include "ethdev_driver.h"
>> #include "ethdev_private.h"
>>
>>@@ -297,6 +298,7 @@ rte_eth_call_rx_callbacks(uint16_t port_id, uint16_t
>>queue_id,
>> 		cb = cb->next;
>> 	}
>>
>>+	rte_eth_trace_call_rx_callbacks(port_id, queue_id, nb_rx, nb_pkts);
>> 	return nb_rx;
>> }
>>
>>@@ -312,6 +314,7 @@ rte_eth_call_tx_callbacks(uint16_t port_id, uint16_t
>>queue_id,
>> 		cb = cb->next;
>> 	}
>>
>>+	rte_eth_trace_call_tx_callbacks(port_id, queue_id, nb_pkts);
>> 	return nb_pkts;
>> }
>>
>>diff --git a/lib/ethdev/ethdev_trace_points.c
>>b/lib/ethdev/ethdev_trace_points.c
>>index 2919409a15..2c06b47b7f 100644
>>--- a/lib/ethdev/ethdev_trace_points.c
>>+++ b/lib/ethdev/ethdev_trace_points.c
>>@@ -29,3 +29,438 @@
>>RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_burst,
>>
>> RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_burst,
>> 	lib.ethdev.tx.burst)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_add_first_rx_callback,
>>+	lib.ethdev.add_first_rx_callback)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_add_rx_callback,
>>+	lib.ethdev.add_rx_callback)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_add_tx_callback,
>>+	lib.ethdev.add_tx_callback)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_allmulticast_disable,
>>+	lib.ethdev.allmulticast_disable)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_allmulticast_enable,
>>+	lib.ethdev.allmulticast_enable)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_allmulticast_get,
>>+	lib.ethdev.allmulticast_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_call_rx_callbacks,
>>+	lib.ethdev.call_rx_callbacks)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_call_tx_callbacks,
>>+	lib.ethdev.call_tx_callbacks)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_mtu,
>>+	lib.ethdev.set_mtu)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_adjust_nb_rx_tx_desc,
>>+	lib.ethdev.adjust_nb_rx_tx_desc)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_callback_register,
>>+	lib.ethdev.callback_register)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_callback_unregister,
>>+	lib.ethdev.callback_unregister)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_default_mac_addr_set,
>>+	lib.ethdev.default_mac_addr_set)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_flow_ctrl_get,
>>+	lib.ethdev.flow_ctrl_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_flow_ctrl_set,
>>+	lib.ethdev.flow_ctrl_set)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_fw_version_get,
>>+	lib.ethdev.fw_version_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_dcb_info,
>>+	lib.ethdev.get_dcb_info)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_eeprom,
>>+	lib.ethdev.get_eeprom)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_eeprom_length,
>>+	lib.ethdev.get_eeprom_length)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_mtu,
>>+	lib.ethdev.get_mtu)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_count_avail,
>>+	lib.ethdev.count_avail)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_count_total,
>>+	lib.ethdev.count_total)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_name_by_port,
>>+	lib.ethdev.get_name_by_port)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_port_by_name,
>>+	lib.ethdev.get_port_by_name)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_reg_info,
>>+	lib.ethdev.get_reg_info)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_sec_ctx,
>>+	lib.ethdev.get_sec_ctx)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_supported_ptypes,
>>+	lib.ethdev.get_supported_ptypes)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_vlan_offload,
>>+	lib.ethdev.get_vlan_offload)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_info_get,
>>+	lib.ethdev.info_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_is_removed,
>>+	lib.ethdev.is_removed)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_is_valid_port,
>>+	lib.ethdev.is_valid_port)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_mac_addr_add,
>>+	lib.ethdev.mac_addr_add)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_mac_addr_remove,
>>+	lib.ethdev.mac_addr_remove)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_pool_ops_supported,
>>+	lib.ethdev.pool_ops_supported)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priority_flow_ctrl_set,
>>+	lib.ethdev.priority_flow_ctrl_set)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_reset,
>>+	lib.ethdev.reset)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_hash_conf_get,
>>+	lib.ethdev.rss_hash_conf_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_hash_update,
>>+	lib.ethdev.rss_hash_update)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_reta_query,
>>+	lib.ethdev.rss_reta_query)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_reta_update,
>>+	lib.ethdev.rss_reta_update)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_ctl,
>>+	lib.ethdev.rx_intr_ctl)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_ctl_q,
>>+	lib.ethdev.rx_intr_ctl_q)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_ctl_q_get_fd,
>>+	lib.ethdev.rx_intr_ctl_q_get_fd)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_disable,
>>+	lib.ethdev.rx_intr_disable)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_enable,
>>+	lib.ethdev.rx_intr_enable)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_offload_name,
>>+	lib.ethdev.rx_offload_name)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_queue_start,
>>+	lib.ethdev.rx_queue_start)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_queue_stop,
>>+	lib.ethdev.rx_queue_stop)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_eeprom,
>>+	lib.ethdev.set_eeprom)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_link_down,
>>+	lib.ethdev.set_link_down)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_link_up,
>>+	lib.ethdev.set_link_up)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_mc_addr_list,
>>+	lib.ethdev.set_mc_addr_list)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_ptypes,
>>+	lib.ethdev.set_ptypes)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_rx_queue_stats_mappi
>>ng,
>>+	lib.ethdev.set_rx_queue_stats_mapping)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_tx_queue_stats_mappi
>n
>>g,
>>+	lib.ethdev.set_tx_queue_stats_mapping)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_ether_type,
>>+	lib.ethdev.set_vlan_ether_type)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_offload,
>>+	lib.ethdev.set_vlan_offload)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_pvid,
>>+	lib.ethdev.set_vlan_pvid)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_strip_on_queue,
>>+	lib.ethdev.set_vlan_strip_on_queue)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_socket_id,
>>+	lib.ethdev.socket_id)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_offload_name,
>>+	lib.ethdev.tx_offload_name)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_queue_start,
>>+	lib.ethdev.tx_queue_start)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_queue_stop,
>>+	lib.ethdev.tx_queue_stop)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_uc_all_hash_table_set,
>>+	lib.ethdev.uc_all_hash_table_set)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_uc_hash_table_set,
>>+	lib.ethdev.uc_hash_table_set)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_udp_tunnel_port_add,
>>+	lib.ethdev.udp_tunnel_port_add)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_udp_tunnel_port_delete,
>>+	lib.ethdev.udp_tunnel_port_delete)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_vlan_filter,
>>+	lib.ethdev.vlan_filter)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next,
>>+	lib.ethdev.find_next)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next_of,
>>+	lib.ethdev.find_next_of)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next_owned_by,
>>+	lib.ethdev.find_next_owned_by)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next_sibling,
>>+	lib.ethdev.find_next_sibling)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_iterator_cleanup,
>>+	lib.ethdev.iterator_cleanup)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_iterator_init,
>>+	lib.ethdev.iterator_init)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_iterator_next,
>>+	lib.ethdev.iterator_next)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_led_off,
>>+	lib.ethdev.led_off)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_led_on,
>>+	lib.ethdev.led_on)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_get,
>>+	lib.ethdev.link_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_get_nowait,
>>+	lib.ethdev.link_get_nowait)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_macaddr_get,
>>+	lib.ethdev.macaddr_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_promiscuous_disable,
>>+	lib.ethdev.promiscuous_disable)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_promiscuous_enable,
>>+	lib.ethdev.promiscuous_enable)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_promiscuous_get,
>>+	lib.ethdev.promiscuous_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_remove_rx_callback,
>>+	lib.ethdev.remove_rx_callback)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_remove_tx_callback,
>>+	lib.ethdev.remove_tx_callback)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_burst_mode_get,
>>+	lib.ethdev.rx_burst_mode_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_queue_info_get,
>>+	lib.ethdev.rx_queue_info_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_queue_setup,
>>+	lib.ethdev.rx_queue_setup)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_set_queue_rate_limit,
>>+	lib.ethdev.set_queue_rate_limit)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_speed_bitflag,
>>+	lib.ethdev.speed_bitflag)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_get,
>>+	lib.ethdev.stats_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_reset,
>>+	lib.ethdev.stats_reset)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_adjust_time,
>>+	lib.ethdev.timesync_adjust_time)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_disable,
>>+	lib.ethdev.timesync_disable)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_enable,
>>+	lib.ethdev.timesync_enable)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_read_rx_timestamp,
>>+	lib.ethdev.timesync_read_rx_timestamp)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_read_time,
>>+	lib.ethdev.timesync_read_time)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_read_tx_timestamp,
>>+	lib.ethdev.timesync_read_tx_timestamp)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_write_time,
>>+	lib.ethdev.timesync_write_time)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_count_callback,
>>+	lib.ethdev.tx_buffer_count_callback)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_drop_callback,
>>+	lib.ethdev.tx_buffer_drop_callback)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_init,
>>+	lib.ethdev.tx_buffer_init)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_set_err_callback,
>>+	lib.ethdev.tx_buffer_set_err_callback)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_burst_mode_get,
>>+	lib.ethdev.tx_burst_mode_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_done_cleanup,
>>+	lib.ethdev.tx_done_cleanup)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_queue_info_get,
>>+	lib.ethdev.tx_queue_info_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get,
>>+	lib.ethdev.xstats_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_by_id,
>>+	lib.ethdev.xstats_get_by_id)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_id_by_name,
>>+	lib.ethdev.xstats_get_id_by_name)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_names,
>>+	lib.ethdev.xstats_get_names)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_names_by_id,
>>+	lib.ethdev.xstats_get_names_by_id)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_reset,
>>+	lib.ethdev.xstats_reset)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_delete,
>>+	lib.ethdev.owner_delete)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_get,
>>+	lib.ethdev.owner_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_new,
>>+	lib.ethdev.owner_new)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_set,
>>+	lib.ethdev.owner_set)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_unset,
>>+	lib.ethdev.owner_unset)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_module_eeprom,
>>+	lib.ethdev.get_module_eeprom)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_module_info,
>>+	lib.ethdev.get_module_info)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_read_clock,
>>+	lib.ethdev.read_clock)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_hairpin_capability_get,
>>+	lib.ethdev.hairpin_capability_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_hairpin_queue_setup,
>>+	lib.ethdev.rx.hairpin_queue_setup)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_hairpin_queue_setup,
>>+	lib.ethdev.tx.hairpin_queue_setup)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_hairpin_bind,
>>+	lib.ethdev.hairpin_bind)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_hairpin_get_peer_ports,
>>+	lib.ethdev.hairpin_get_peer_ports)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_hairpin_unbind,
>>+	lib.ethdev.hairpin_unbind)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_speed_to_str,
>>+	lib.ethdev.link_speed_to_str)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_to_str,
>>+	lib.ethdev.link_to_str)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_fec_get_capability,
>>+	lib.ethdev.fec_get_capability)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_fec_get,
>>+	lib.ethdev.fec_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_fec_set,
>>+	lib.ethdev.fec_set)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_get_monitor_addr,
>>+	lib.ethdev.get_monitor_addr)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_representor_info_get,
>>+	lib.ethdev.representor_info_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_capability_name,
>>+	lib.ethdev.capability_name)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_conf_get,
>>+	lib.ethdev.conf_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_macaddrs_get,
>>+	lib.ethdev.macaddrs_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_metadata_negotiate,
>>+	lib.ethdev.rx_metadata_negotiate)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priority_flow_ctrl_queue_c
>o
>>nfigure,
>>+	lib.ethdev.priority_flow_ctrl_queue_configure)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priority_flow_ctrl_queue_i
>n
>>fo_get,
>>+	lib.ethdev.priority_flow_ctrl_queue_info_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priv_dump,
>>+	lib.ethdev.priv_dump)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_ip_reassembly_capability_get,
>>+	lib.ethdev.ip_reassembly_capability_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_ip_reassembly_conf_get,
>>+	lib.ethdev.ip_reassembly_conf_get)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_ip_reassembly_conf_set,
>>+	lib.ethdev.ip_reassembly_conf_set)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_avail_thresh_query,
>>+	lib.ethdev.rx_avail_thresh_query)
>>+
>>+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_avail_thresh_set,
>>+	lib.ethdev.rx_avail_thresh_set)
>>diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
>>index 01c141a039..f66d3ecd0a 100644
>>--- a/lib/ethdev/rte_ethdev.c
>>+++ b/lib/ethdev/rte_ethdev.c
>>@@ -182,6 +182,8 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter,
>>const char *devargs_str)
>> 	memset(iter, 0, sizeof(*iter));
>> 	memset(&devargs, 0, sizeof(devargs));
>>
>>+	rte_eth_trace_iterator_init(iter, devargs_str);
>>+
>> 	/*
>> 	 * The devargs string may use various syntaxes:
>> 	 *   - 0000:08:00.0,representor=[1-3]
>>@@ -283,6 +285,8 @@ rte_eth_iterator_next(struct rte_dev_iterator *iter)
>> 	if (iter->cls == NULL) /* invalid ethdev iterator */
>> 		return RTE_MAX_ETHPORTS;
>>
>>+	rte_eth_trace_iterator_next(iter);
>>+
>> 	do { /* loop to try all matching rte_device */
>> 		/* If not pure ethdev filter and */
>> 		if (iter->bus != NULL &&
>>@@ -316,6 +320,7 @@ rte_eth_iterator_cleanup(struct rte_dev_iterator
>>*iter)
>>
>> 	if (iter->bus_str == NULL)
>> 		return; /* nothing to free in pure class filter */
>>+	rte_eth_trace_iterator_cleanup(iter);
>> 	free(RTE_CAST_FIELD(iter, bus_str, char *)); /* workaround const */
>> 	free(RTE_CAST_FIELD(iter, cls_str, char *)); /* workaround const */
>> 	memset(iter, 0, sizeof(*iter));
>>@@ -331,6 +336,7 @@ rte_eth_find_next(uint16_t port_id)
>> 	if (port_id >= RTE_MAX_ETHPORTS)
>> 		return RTE_MAX_ETHPORTS;
>>
>>+	rte_eth_trace_find_next(port_id);
>> 	return port_id;
>> }
>>
>>@@ -351,6 +357,7 @@ rte_eth_find_next_of(uint16_t port_id, const struct
>>rte_device *parent)
>> 			rte_eth_devices[port_id].device != parent)
>> 		port_id = rte_eth_find_next(port_id + 1);
>>
>>+	rte_eth_trace_find_next_of(port_id, parent);
>> 	return port_id;
>> }
>>
>>@@ -358,6 +365,7 @@ uint16_t
>> rte_eth_find_next_sibling(uint16_t port_id, uint16_t ref_port_id)
>> {
>> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(ref_port_id,
>>RTE_MAX_ETHPORTS);
>>+	rte_eth_trace_find_next_sibling(port_id, ref_port_id);
>> 	return rte_eth_find_next_of(port_id,
>> 			rte_eth_devices[ref_port_id].device);
>> }
>>@@ -371,6 +379,7 @@ eth_dev_is_allocated(const struct rte_eth_dev
>>*ethdev)
>> int
>> rte_eth_dev_is_valid_port(uint16_t port_id)
>> {
>>+	rte_ethdev_trace_is_valid_port(port_id);
>> 	if (port_id >= RTE_MAX_ETHPORTS ||
>> 	    (rte_eth_devices[port_id].state == RTE_ETH_DEV_UNUSED))
>> 		return 0;
>>@@ -395,6 +404,7 @@ rte_eth_find_next_owned_by(uint16_t port_id, const
>>uint64_t owner_id)
>> 			rte_eth_devices[port_id].data->owner.id != owner_id)
>> 		port_id = rte_eth_find_next(port_id + 1);
>>
>>+	rte_eth_trace_find_next_owned_by(port_id, owner_id);
>> 	return port_id;
>> }
>>
>>@@ -413,6 +423,7 @@ rte_eth_dev_owner_new(uint64_t *owner_id)
>> 	*owner_id = eth_dev_shared_data->next_owner_id++;
>>
>> 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
>>+	rte_ethdev_trace_owner_new(*owner_id);
>> 	return 0;
>> }
>>
>>@@ -476,6 +487,7 @@ rte_eth_dev_owner_set(const uint16_t port_id,
>> 	ret = eth_dev_owner_set(port_id, RTE_ETH_DEV_NO_OWNER,
>>owner);
>>
>> 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
>>+	rte_ethdev_trace_owner_set(port_id, owner, ret);
>> 	return ret;
>> }
>>
>>@@ -493,6 +505,7 @@ rte_eth_dev_owner_unset(const uint16_t port_id,
>>const uint64_t owner_id)
>> 	ret = eth_dev_owner_set(port_id, owner_id, &new_owner);
>>
>> 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
>>+	rte_ethdev_trace_owner_unset(port_id, owner_id, ret);
>> 	return ret;
>> }
>>
>>@@ -526,6 +539,7 @@ rte_eth_dev_owner_delete(const uint64_t owner_id)
>>
>> 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
>>
>>+	rte_ethdev_trace_owner_delete(owner_id, ret);
>> 	return ret;
>> }
>>
>>@@ -555,6 +569,7 @@ rte_eth_dev_owner_get(const uint16_t port_id, struct
>>rte_eth_dev_owner *owner)
>> 	rte_memcpy(owner, &ethdev->data->owner, sizeof(*owner));
>> 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
>>
>>+	rte_ethdev_trace_owner_get(port_id, owner);
>> 	return 0;
>> }
>>
>>@@ -562,6 +577,7 @@ int
>> rte_eth_dev_socket_id(uint16_t port_id)
>> {
>> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
>>+	rte_ethdev_trace_socket_id(port_id);
>> 	return rte_eth_devices[port_id].data->numa_node;
>> }
>>
>>@@ -569,6 +585,7 @@ void *
>> rte_eth_dev_get_sec_ctx(uint16_t port_id)
>> {
>> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, NULL);
>>+	rte_ethdev_trace_get_sec_ctx(port_id);
>> 	return rte_eth_devices[port_id].security_ctx;
>> }
>>
>>@@ -583,6 +600,7 @@ rte_eth_dev_count_avail(void)
>> 	RTE_ETH_FOREACH_DEV(p)
>> 		count++;
>>
>>+	rte_ethdev_trace_count_avail(count);
>> 	return count;
>> }
>>
>>@@ -594,6 +612,7 @@ rte_eth_dev_count_total(void)
>> 	RTE_ETH_FOREACH_VALID_DEV(port)
>> 		count++;
>>
>>+	rte_ethdev_trace_count_total(count);
>> 	return count;
>> }
>>
>>@@ -614,6 +633,7 @@ rte_eth_dev_get_name_by_port(uint16_t port_id,
>>char *name)
>> 	 * because it might be overwritten by VDEV PMD */
>> 	tmp = eth_dev_shared_data->data[port_id].name;
>> 	strcpy(name, tmp);
>>+	rte_ethdev_trace_get_name_by_port(port_id, name);
>> 	return 0;
>> }
>>
>>@@ -636,6 +656,7 @@ rte_eth_dev_get_port_by_name(const char *name,
>>uint16_t *port_id)
>> 	RTE_ETH_FOREACH_VALID_DEV(pid)
>> 		if (!strcmp(name, eth_dev_shared_data->data[pid].name)) {
>> 			*port_id = pid;
>>+			rte_ethdev_trace_get_port_by_name(name,
>>*port_id);
>> 			return 0;
>> 		}
>>
>>@@ -737,6 +758,7 @@ rte_eth_dev_rx_queue_start(uint16_t port_id,
>>uint16_t rx_queue_id)
>> 		return 0;
>> 	}
>>
>>+	rte_ethdev_trace_rx_queue_start(port_id, rx_queue_id);
>> 	return eth_err(port_id, dev->dev_ops->rx_queue_start(dev,
>>rx_queue_id));
>> }
>>
>>@@ -770,6 +792,7 @@ rte_eth_dev_rx_queue_stop(uint16_t port_id,
>>uint16_t rx_queue_id)
>> 		return 0;
>> 	}
>>
>>+	rte_ethdev_trace_rx_queue_stop(port_id, rx_queue_id);
>> 	return eth_err(port_id, dev->dev_ops->rx_queue_stop(dev,
>>rx_queue_id));
>> }
>>
>>@@ -810,6 +833,7 @@ rte_eth_dev_tx_queue_start(uint16_t port_id,
>>uint16_t tx_queue_id)
>> 		return 0;
>> 	}
>>
>>+	rte_ethdev_trace_tx_queue_start(port_id, tx_queue_id);
>> 	return eth_err(port_id, dev->dev_ops->tx_queue_start(dev,
>>tx_queue_id));
>> }
>>
>>@@ -843,12 +867,14 @@ rte_eth_dev_tx_queue_stop(uint16_t port_id,
>>uint16_t tx_queue_id)
>> 		return 0;
>> 	}
>>
>>+	rte_ethdev_trace_tx_queue_stop(port_id, tx_queue_id);
>> 	return eth_err(port_id, dev->dev_ops->tx_queue_stop(dev,
>>tx_queue_id));
>> }
>>
>> uint32_t
>> rte_eth_speed_bitflag(uint32_t speed, int duplex)
>> {
>>+	rte_eth_trace_speed_bitflag(speed, duplex);
>> 	switch (speed) {
>> 	case RTE_ETH_SPEED_NUM_10M:
>> 		return duplex ? RTE_ETH_LINK_SPEED_10M :
>>RTE_ETH_LINK_SPEED_10M_HD;
>>@@ -894,6 +920,7 @@ rte_eth_dev_rx_offload_name(uint64_t offload)
>> 		}
>> 	}
>>
>>+	rte_ethdev_trace_rx_offload_name(offload, name);
>> 	return name;
>> }
>>
>>@@ -910,6 +937,7 @@ rte_eth_dev_tx_offload_name(uint64_t offload)
>> 		}
>> 	}
>>
>>+	rte_ethdev_trace_tx_offload_name(offload, name);
>> 	return name;
>> }
>>
>>@@ -926,6 +954,7 @@ rte_eth_dev_capability_name(uint64_t capability)
>> 		}
>> 	}
>>
>>+	rte_ethdev_trace_capability_name(capability, name);
>> 	return name;
>> }
>>
>>@@ -1552,6 +1581,7 @@ rte_eth_dev_set_link_up(uint16_t port_id)
>>
>> 	if (*dev->dev_ops->dev_set_link_up == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_set_link_up(port_id);
>> 	return eth_err(port_id, (*dev->dev_ops->dev_set_link_up)(dev));
>> }
>>
>>@@ -1565,6 +1595,7 @@ rte_eth_dev_set_link_down(uint16_t port_id)
>>
>> 	if (*dev->dev_ops->dev_set_link_down == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_set_link_down(port_id);
>> 	return eth_err(port_id, (*dev->dev_ops->dev_set_link_down)(dev));
>> }
>>
>>@@ -1621,6 +1652,7 @@ rte_eth_dev_reset(uint16_t port_id)
>> 			port_id, rte_strerror(-ret));
>> 	}
>> 	ret = dev->dev_ops->dev_reset(dev);
>>+	rte_ethdev_trace_reset(port_id, ret);
>>
>> 	return eth_err(port_id, ret);
>> }
>>@@ -1645,6 +1677,7 @@ rte_eth_dev_is_removed(uint16_t port_id)
>> 		/* Device is physically removed. */
>> 		dev->state = RTE_ETH_DEV_REMOVED;
>>
>>+	rte_ethdev_trace_is_removed(port_id, ret);
>> 	return ret;
>> }
>>
>>@@ -1984,6 +2017,8 @@ rte_eth_rx_hairpin_queue_setup(uint16_t port_id,
>>uint16_t rx_queue_id,
>> 	if (ret == 0)
>> 		dev->data->rx_queue_state[rx_queue_id] =
>> 			RTE_ETH_QUEUE_STATE_HAIRPIN;
>>+	rte_eth_trace_rx_hairpin_queue_setup(port_id, rx_queue_id,
>>nb_rx_desc,
>>+					     conf, ret);
>> 	return eth_err(port_id, ret);
>> }
>>
>>@@ -2151,6 +2186,7 @@ rte_eth_tx_hairpin_queue_setup(uint16_t port_id,
>>uint16_t tx_queue_id,
>> 	if (ret == 0)
>> 		dev->data->tx_queue_state[tx_queue_id] =
>> 			RTE_ETH_QUEUE_STATE_HAIRPIN;
>>+	rte_eth_trace_tx_hairpin_queue_setup(port_id, tx_queue_id,
>>nb_tx_desc, conf, ret);
>> 	return eth_err(port_id, ret);
>> }
>>
>>@@ -2176,6 +2212,7 @@ rte_eth_hairpin_bind(uint16_t tx_port, uint16_t
>>rx_port)
>> 			       " to Rx %d (%d - all ports)\n",
>> 			       tx_port, rx_port, RTE_MAX_ETHPORTS);
>>
>>+	rte_eth_trace_hairpin_bind(tx_port, rx_port, ret);
>> 	return ret;
>> }
>>
>>@@ -2201,6 +2238,7 @@ rte_eth_hairpin_unbind(uint16_t tx_port, uint16_t
>>rx_port)
>> 			       " from Rx %d (%d - all ports)\n",
>> 			       tx_port, rx_port, RTE_MAX_ETHPORTS);
>>
>>+	rte_eth_trace_hairpin_unbind(tx_port, rx_port, ret);
>> 	return ret;
>> }
>>
>>@@ -2237,6 +2275,7 @@ rte_eth_hairpin_get_peer_ports(uint16_t port_id,
>>uint16_t *peer_ports,
>> 		RTE_ETHDEV_LOG(ERR, "Failed to get %d hairpin peer %s
>>ports\n",
>> 			       port_id, direction ? "Rx" : "Tx");
>>
>>+	rte_eth_trace_hairpin_get_peer_ports(port_id, peer_ports, len,
>>direction, ret);
>> 	return ret;
>> }
>>
>>@@ -2244,6 +2283,7 @@ void
>> rte_eth_tx_buffer_drop_callback(struct rte_mbuf **pkts, uint16_t unsent,
>> 		void *userdata __rte_unused)
>> {
>>+	rte_eth_trace_tx_buffer_drop_callback(pkts, unsent);
>> 	rte_pktmbuf_free_bulk(pkts, unsent);
>> }
>>
>>@@ -2255,6 +2295,7 @@ rte_eth_tx_buffer_count_callback(struct rte_mbuf
>>**pkts, uint16_t unsent,
>>
>> 	rte_pktmbuf_free_bulk(pkts, unsent);
>> 	*count += unsent;
>>+	rte_eth_trace_tx_buffer_count_callback(pkts, unsent, *count);
>> }
>>
>> int
>>@@ -2267,6 +2308,7 @@ rte_eth_tx_buffer_set_err_callback(struct
>>rte_eth_dev_tx_buffer *buffer,
>> 		return -EINVAL;
>> 	}
>>
>>+	rte_eth_trace_tx_buffer_set_err_callback(buffer, cbfn, userdata);
>> 	buffer->error_callback = cbfn;
>> 	buffer->error_userdata = userdata;
>> 	return 0;
>>@@ -2288,6 +2330,7 @@ rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer
>>*buffer, uint16_t size)
>> 			buffer, rte_eth_tx_buffer_drop_callback, NULL);
>> 	}
>>
>>+	rte_eth_trace_tx_buffer_init(buffer, size, ret);
>> 	return ret;
>> }
>>
>>@@ -2306,6 +2349,7 @@ rte_eth_tx_done_cleanup(uint16_t port_id,
>>uint16_t queue_id, uint32_t free_cnt)
>> 	/* Call driver to free pending mbufs. */
>> 	ret = (*dev->dev_ops->tx_done_cleanup)(dev->data-
>>>tx_queues[queue_id],
>> 					       free_cnt);
>>+	rte_eth_trace_tx_done_cleanup(port_id, queue_id, free_cnt, ret);
>> 	return eth_err(port_id, ret);
>> }
>>
>>@@ -2327,6 +2371,7 @@ rte_eth_promiscuous_enable(uint16_t port_id)
>> 	diag = (*dev->dev_ops->promiscuous_enable)(dev);
>> 	dev->data->promiscuous = (diag == 0) ? 1 : 0;
>>
>>+	rte_eth_trace_promiscuous_enable(port_id, dev->data-
>>>promiscuous);
>> 	return eth_err(port_id, diag);
>> }
>>
>>@@ -2350,6 +2395,7 @@ rte_eth_promiscuous_disable(uint16_t port_id)
>> 	if (diag != 0)
>> 		dev->data->promiscuous = 1;
>>
>>+	rte_eth_trace_promiscuous_disable(port_id, dev->data-
>>>promiscuous);
>> 	return eth_err(port_id, diag);
>> }
>>
>>@@ -2361,6 +2407,7 @@ rte_eth_promiscuous_get(uint16_t port_id)
>> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
>> 	dev = &rte_eth_devices[port_id];
>>
>>+	rte_eth_trace_promiscuous_get(port_id, dev->data->promiscuous);
>> 	return dev->data->promiscuous;
>> }
>>
>>@@ -2381,6 +2428,7 @@ rte_eth_allmulticast_enable(uint16_t port_id)
>> 	diag = (*dev->dev_ops->allmulticast_enable)(dev);
>> 	dev->data->all_multicast = (diag == 0) ? 1 : 0;
>>
>>+	rte_eth_trace_allmulticast_enable(port_id, dev->data->all_multicast);
>> 	return eth_err(port_id, diag);
>> }
>>
>>@@ -2403,6 +2451,7 @@ rte_eth_allmulticast_disable(uint16_t port_id)
>> 	if (diag != 0)
>> 		dev->data->all_multicast = 1;
>>
>>+	rte_eth_trace_allmulticast_disable(port_id, dev->data->all_multicast);
>> 	return eth_err(port_id, diag);
>> }
>>
>>@@ -2414,6 +2463,7 @@ rte_eth_allmulticast_get(uint16_t port_id)
>> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
>> 	dev = &rte_eth_devices[port_id];
>>
>>+	rte_eth_trace_allmulticast_get(port_id, dev->data->all_multicast);
>> 	return dev->data->all_multicast;
>> }
>>
>>@@ -2440,6 +2490,7 @@ rte_eth_link_get(uint16_t port_id, struct
>>rte_eth_link *eth_link)
>> 		*eth_link = dev->data->dev_link;
>> 	}
>>
>>+	rte_eth_trace_link_get(port_id, eth_link);
>> 	return 0;
>> }
>>
>>@@ -2466,12 +2517,14 @@ rte_eth_link_get_nowait(uint16_t port_id, struct
>>rte_eth_link *eth_link)
>> 		*eth_link = dev->data->dev_link;
>> 	}
>>
>>+	rte_eth_trace_link_get_nowait(port_id, eth_link);
>> 	return 0;
>> }
>>
>> const char *
>> rte_eth_link_speed_to_str(uint32_t link_speed)
>> {
>>+	rte_eth_trace_link_speed_to_str(link_speed);
>> 	switch (link_speed) {
>> 	case RTE_ETH_SPEED_NUM_NONE: return "None";
>> 	case RTE_ETH_SPEED_NUM_10M:  return "10 Mbps";
>>@@ -2511,6 +2564,7 @@ rte_eth_link_to_str(char *str, size_t len, const struct
>>rte_eth_link *eth_link)
>> 		return -EINVAL;
>> 	}
>>
>>+	rte_eth_trace_link_to_str(str, len, eth_link);
>> 	if (eth_link->link_status == RTE_ETH_LINK_DOWN)
>> 		return snprintf(str, len, "Link down");
>> 	else
>>@@ -2541,6 +2595,7 @@ rte_eth_stats_get(uint16_t port_id, struct
>>rte_eth_stats *stats)
>> 	if (*dev->dev_ops->stats_get == NULL)
>> 		return -ENOTSUP;
>> 	stats->rx_nombuf = dev->data->rx_mbuf_alloc_failed;
>>+	rte_eth_trace_stats_get(port_id, stats);
>> 	return eth_err(port_id, (*dev->dev_ops->stats_get)(dev, stats));
>> }
>>
>>@@ -2561,6 +2616,7 @@ rte_eth_stats_reset(uint16_t port_id)
>>
>> 	dev->data->rx_mbuf_alloc_failed = 0;
>>
>>+	rte_eth_trace_stats_reset(port_id);
>> 	return 0;
>> }
>>
>>@@ -2625,6 +2681,7 @@ rte_eth_xstats_get_id_by_name(uint16_t port_id,
>>const char *xstat_name,
>> 		return -ENOMEM;
>> 	}
>>
>>+	rte_eth_trace_xstats_get_id_by_name(port_id, xstat_name, id);
>> 	/* Get count */
>> 	cnt_xstats = rte_eth_xstats_get_names_by_id(port_id, NULL, 0, NULL);
>> 	if (cnt_xstats  < 0) {
>>@@ -2797,6 +2854,8 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
>> 			return -1;
>> 		}
>> 		xstats_names[i] = xstats_names_copy[ids[i]];
>>+		rte_eth_trace_xstats_get_names_by_id(port_id,
>>&xstats_names[i],
>>+						     ids[i]);
>> 	}
>>
>> 	free(xstats_names_copy);
>>@@ -2836,6 +2895,7 @@ rte_eth_xstats_get_names(uint16_t port_id,
>> 		cnt_used_entries += cnt_driver_entries;
>> 	}
>>
>>+	rte_eth_trace_xstats_get_names(port_id, xstats_names, size,
>>cnt_used_entries);
>> 	return cnt_used_entries;
>> }
>>
>>@@ -2985,6 +3045,7 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const
>>uint64_t *ids,
>> 		}
>> 		values[i] = xstats[ids[i]].value;
>> 	}
>>+	rte_eth_trace_xstats_get_by_id(port_id, ids, values, size);
>> 	return size;
>> }
>>
>>@@ -3032,6 +3093,8 @@ rte_eth_xstats_get(uint16_t port_id, struct
>>rte_eth_xstat *xstats,
>> 	for ( ; i < count + xcount; i++)
>> 		xstats[i].id += count;
>>
>>+	for (i = 0; i < n; i++)
>>+		rte_eth_trace_xstats_get(port_id, xstats[i], i);
>> 	return count + xcount;
>> }
>>
>>@@ -3044,6 +3107,7 @@ rte_eth_xstats_reset(uint16_t port_id)
>> 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
>> 	dev = &rte_eth_devices[port_id];
>>
>>+	rte_eth_trace_xstats_reset(port_id);
>> 	/* implemented by the driver */
>> 	if (dev->dev_ops->xstats_reset != NULL)
>> 		return eth_err(port_id, (*dev->dev_ops->xstats_reset)(dev));
>>@@ -3079,6 +3143,8 @@ int
>> rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id, uint16_t
>>tx_queue_id,
>> 		uint8_t stat_idx)
>> {
>>+	rte_ethdev_trace_set_tx_queue_stats_mapping(port_id, tx_queue_id,
>>+						    stat_idx);
>> 	return eth_err(port_id, eth_dev_set_queue_stats_mapping(port_id,
>> 						tx_queue_id,
>> 						stat_idx, STAT_QMAP_TX));
>>@@ -3088,6 +3154,8 @@ int
>> rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id, uint16_t
>>rx_queue_id,
>> 		uint8_t stat_idx)
>> {
>>+	rte_ethdev_trace_set_rx_queue_stats_mapping(port_id,
>>rx_queue_id,
>>+						    stat_idx);
>> 	return eth_err(port_id, eth_dev_set_queue_stats_mapping(port_id,
>> 						rx_queue_id,
>> 						stat_idx, STAT_QMAP_RX));
>>@@ -3110,6 +3178,7 @@ rte_eth_dev_fw_version_get(uint16_t port_id, char
>>*fw_version, size_t fw_size)
>>
>> 	if (*dev->dev_ops->fw_version_get == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_fw_version_get(port_id, fw_version, fw_size);
>> 	return eth_err(port_id, (*dev->dev_ops->fw_version_get)(dev,
>> 							fw_version, fw_size));
>> }
>>@@ -3171,6 +3240,7 @@ rte_eth_dev_info_get(uint16_t port_id, struct
>>rte_eth_dev_info *dev_info)
>>
>> 	dev_info->dev_flags = &dev->data->dev_flags;
>>
>>+	rte_ethdev_trace_info_get(port_id, dev_info);
>> 	return 0;
>> }
>>
>>@@ -3191,6 +3261,7 @@ rte_eth_dev_conf_get(uint16_t port_id, struct
>>rte_eth_conf *dev_conf)
>>
>> 	memcpy(dev_conf, &dev->data->dev_conf, sizeof(struct
>>rte_eth_conf));
>>
>>+	rte_ethdev_trace_conf_get(port_id, dev_conf);
>> 	return 0;
>> }
>>
>>@@ -3226,6 +3297,7 @@ rte_eth_dev_get_supported_ptypes(uint16_t
>>port_id, uint32_t ptype_mask,
>> 			j++;
>> 		}
>>
>>+	rte_ethdev_trace_get_supported_ptypes(port_id, ptype_mask,
>>ptypes, num, j);
>> 	return j;
>> }
>>
>>@@ -3310,6 +3382,7 @@ rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t
>>ptype_mask,
>> 	if (set_ptypes != NULL && j < num)
>> 		set_ptypes[j] = RTE_PTYPE_UNKNOWN;
>>
>>+	rte_ethdev_trace_set_ptypes(port_id, ptype_mask, set_ptypes, num);
>> 	return (*dev->dev_ops->dev_ptypes_set)(dev, ptype_mask);
>>
>> ptype_unknown:
>>@@ -3341,6 +3414,7 @@ rte_eth_macaddrs_get(uint16_t port_id, struct
>>rte_ether_addr *ma,
>> 	num = RTE_MIN(dev_info.max_mac_addrs, num);
>> 	memcpy(ma, dev->data->mac_addrs, num * sizeof(ma[0]));
>>
>>+	rte_eth_trace_macaddrs_get(port_id, ma, num);
>> 	return num;
>> }
>>
>>@@ -3359,6 +3433,7 @@ rte_eth_macaddr_get(uint16_t port_id, struct
>>rte_ether_addr *mac_addr)
>> 		return -EINVAL;
>> 	}
>>
>>+	rte_eth_trace_macaddr_get(port_id, mac_addr);
>> 	rte_ether_addr_copy(&dev->data->mac_addrs[0], mac_addr);
>>
>> 	return 0;
>>@@ -3379,6 +3454,7 @@ rte_eth_dev_get_mtu(uint16_t port_id, uint16_t
>>*mtu)
>> 	}
>>
>> 	*mtu = dev->data->mtu;
>>+	rte_ethdev_trace_get_mtu(port_id, *mtu);
>> 	return 0;
>> }
>>
>>@@ -3421,6 +3497,7 @@ rte_eth_dev_set_mtu(uint16_t port_id, uint16_t
>>mtu)
>> 	if (ret == 0)
>> 		dev->data->mtu = mtu;
>>
>>+	rte_ethdev_trace_set_mtu(port_id, mtu, ret);
>> 	return eth_err(port_id, ret);
>> }
>>
>>@@ -3464,6 +3541,7 @@ rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t
>>vlan_id, int on)
>> 			vfc->ids[vidx] &= ~RTE_BIT64(vbit);
>> 	}
>>
>>+	rte_ethdev_trace_vlan_filter(port_id, vlan_id, on, ret);
>> 	return eth_err(port_id, ret);
>> }
>>
>>@@ -3483,6 +3561,7 @@ rte_eth_dev_set_vlan_strip_on_queue(uint16_t
>>port_id, uint16_t rx_queue_id,
>>
>> 	if (*dev->dev_ops->vlan_strip_queue_set == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_set_vlan_strip_on_queue(port_id, rx_queue_id,
>>on);
>> 	(*dev->dev_ops->vlan_strip_queue_set)(dev, rx_queue_id, on);
>>
>> 	return 0;
>>@@ -3500,6 +3579,7 @@ rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->vlan_tpid_set == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_set_vlan_ether_type(port_id, vlan_type, tpid);
>> 	return eth_err(port_id, (*dev->dev_ops->vlan_tpid_set)(dev,
>>vlan_type,
>> 							       tpid));
>> }
>>@@ -3593,6 +3673,7 @@ rte_eth_dev_set_vlan_offload(uint16_t port_id, int
>>offload_mask)
>> 		dev->data->dev_conf.rxmode.offloads = orig_offloads;
>> 	}
>>
>>+	rte_ethdev_trace_set_vlan_offload(port_id, offload_mask, ret);
>> 	return eth_err(port_id, ret);
>> }
>>
>>@@ -3619,6 +3700,7 @@ rte_eth_dev_get_vlan_offload(uint16_t port_id)
>> 	if (*dev_offloads & RTE_ETH_RX_OFFLOAD_QINQ_STRIP)
>> 		ret |= RTE_ETH_QINQ_STRIP_OFFLOAD;
>>
>>+	rte_ethdev_trace_get_vlan_offload(port_id, ret);
>> 	return ret;
>> }
>>
>>@@ -3632,6 +3714,7 @@ rte_eth_dev_set_vlan_pvid(uint16_t port_id,
>>uint16_t pvid, int on)
>>
>> 	if (*dev->dev_ops->vlan_pvid_set == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_set_vlan_pvid(port_id, pvid, on);
>> 	return eth_err(port_id, (*dev->dev_ops->vlan_pvid_set)(dev, pvid,
>>on));
>> }
>>
>>@@ -3653,6 +3736,7 @@ rte_eth_dev_flow_ctrl_get(uint16_t port_id, struct
>>rte_eth_fc_conf *fc_conf)
>> 	if (*dev->dev_ops->flow_ctrl_get == NULL)
>> 		return -ENOTSUP;
>> 	memset(fc_conf, 0, sizeof(*fc_conf));
>>+	rte_ethdev_trace_flow_ctrl_get(port_id, fc_conf);
>> 	return eth_err(port_id, (*dev->dev_ops->flow_ctrl_get)(dev,
>>fc_conf));
>> }
>>
>>@@ -3678,6 +3762,7 @@ rte_eth_dev_flow_ctrl_set(uint16_t port_id, struct
>>rte_eth_fc_conf *fc_conf)
>>
>> 	if (*dev->dev_ops->flow_ctrl_set == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_flow_ctrl_set(port_id, fc_conf);
>> 	return eth_err(port_id, (*dev->dev_ops->flow_ctrl_set)(dev, fc_conf));
>> }
>>
>>@@ -3702,6 +3787,7 @@ rte_eth_dev_priority_flow_ctrl_set(uint16_t
>>port_id,
>> 		return -EINVAL;
>> 	}
>>
>>+	rte_ethdev_trace_priority_flow_ctrl_set(port_id, pfc_conf);
>> 	/* High water, low water validation are device specific */
>> 	if  (*dev->dev_ops->priority_flow_ctrl_set)
>> 		return eth_err(port_id, (*dev->dev_ops-
>>>priority_flow_ctrl_set)
>>@@ -3774,6 +3860,7 @@
>>rte_eth_dev_priority_flow_ctrl_queue_info_get(uint16_t port_id,
>> 		return -EINVAL;
>> 	}
>>
>>+	rte_ethdev_trace_priority_flow_ctrl_queue_info_get(port_id,
>>pfc_queue_info);
>> 	if (*dev->dev_ops->priority_flow_ctrl_queue_info_get)
>> 		return eth_err(port_id, (*dev->dev_ops-
>>>priority_flow_ctrl_queue_info_get)
>> 			(dev, pfc_queue_info));
>>@@ -3845,6 +3932,8 @@
>>rte_eth_dev_priority_flow_ctrl_queue_configure(uint16_t port_id,
>> 			return ret;
>> 	}
>>
>>+	rte_ethdev_trace_priority_flow_ctrl_queue_configure(port_id,
>>+							     pfc_queue_conf);
>> 	if (*dev->dev_ops->priority_flow_ctrl_queue_config)
>> 		return eth_err(port_id,
>> 			       (*dev->dev_ops-
>>>priority_flow_ctrl_queue_config)(
>>@@ -3940,6 +4029,7 @@ rte_eth_dev_rss_reta_update(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->reta_update == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_rss_reta_update(port_id, reta_conf, reta_size);
>> 	return eth_err(port_id, (*dev->dev_ops->reta_update)(dev,
>>reta_conf,
>> 							     reta_size));
>> }
>>@@ -3969,6 +4059,7 @@ rte_eth_dev_rss_reta_query(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->reta_query == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_rss_reta_query(port_id, reta_conf, reta_size);
>> 	return eth_err(port_id, (*dev->dev_ops->reta_query)(dev, reta_conf,
>> 							    reta_size));
>> }
>>@@ -4014,6 +4105,7 @@ rte_eth_dev_rss_hash_update(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->rss_hash_update == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_rss_hash_update(port_id, rss_conf);
>> 	return eth_err(port_id, (*dev->dev_ops->rss_hash_update)(dev,
>> 								 rss_conf));
>> }
>>@@ -4036,6 +4128,7 @@ rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->rss_hash_conf_get == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_rss_hash_conf_get(port_id, rss_conf);
>> 	return eth_err(port_id, (*dev->dev_ops->rss_hash_conf_get)(dev,
>> 								   rss_conf));
>> }
>>@@ -4063,6 +4156,7 @@ rte_eth_dev_udp_tunnel_port_add(uint16_t
>>port_id,
>>
>> 	if (*dev->dev_ops->udp_tunnel_port_add == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_udp_tunnel_port_add(port_id, udp_tunnel);
>> 	return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_add)(dev,
>> 								udp_tunnel));
>> }
>>@@ -4090,6 +4184,7 @@ rte_eth_dev_udp_tunnel_port_delete(uint16_t
>>port_id,
>>
>> 	if (*dev->dev_ops->udp_tunnel_port_del == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_udp_tunnel_port_delete(port_id, udp_tunnel);
>> 	return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_del)(dev,
>> 								udp_tunnel));
>> }
>>@@ -4104,6 +4199,7 @@ rte_eth_led_on(uint16_t port_id)
>>
>> 	if (*dev->dev_ops->dev_led_on == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_led_on(port_id);
>> 	return eth_err(port_id, (*dev->dev_ops->dev_led_on)(dev));
>> }
>>
>>@@ -4117,6 +4213,7 @@ rte_eth_led_off(uint16_t port_id)
>>
>> 	if (*dev->dev_ops->dev_led_off == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_led_off(port_id);
>> 	return eth_err(port_id, (*dev->dev_ops->dev_led_off)(dev));
>> }
>>
>>@@ -4142,6 +4239,7 @@ rte_eth_fec_get_capability(uint16_t port_id,
>> 		return -ENOTSUP;
>> 	ret = (*dev->dev_ops->fec_get_capability)(dev, speed_fec_capa,
>>num);
>>
>>+	rte_eth_trace_fec_get_capability(port_id, speed_fec_capa, num, ret);
>> 	return ret;
>> }
>>
>>@@ -4162,6 +4260,7 @@ rte_eth_fec_get(uint16_t port_id, uint32_t
>>*fec_capa)
>>
>> 	if (*dev->dev_ops->fec_get == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_fec_get(port_id, fec_capa);
>> 	return eth_err(port_id, (*dev->dev_ops->fec_get)(dev, fec_capa));
>> }
>>
>>@@ -4175,6 +4274,7 @@ rte_eth_fec_set(uint16_t port_id, uint32_t
>>fec_capa)
>>
>> 	if (*dev->dev_ops->fec_set == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_fec_set(port_id, fec_capa);
>> 	return eth_err(port_id, (*dev->dev_ops->fec_set)(dev, fec_capa));
>> }
>>
>>@@ -4252,6 +4352,7 @@ rte_eth_dev_mac_addr_add(uint16_t port_id,
>>struct rte_ether_addr *addr,
>> 			return 0;
>> 	}
>>
>>+	rte_ethdev_trace_mac_addr_add(port_id, addr, pool);
>> 	/* Update NIC */
>> 	ret = (*dev->dev_ops->mac_addr_add)(dev, addr, index, pool);
>>
>>@@ -4294,6 +4395,7 @@ rte_eth_dev_mac_addr_remove(uint16_t port_id,
>>struct rte_ether_addr *addr)
>> 	} else if (index < 0)
>> 		return 0;  /* Do nothing if address wasn't found */
>>
>>+	rte_ethdev_trace_mac_addr_remove(port_id, addr);
>> 	/* Update NIC */
>> 	(*dev->dev_ops->mac_addr_remove)(dev, index);
>>
>>@@ -4329,6 +4431,7 @@ rte_eth_dev_default_mac_addr_set(uint16_t
>>port_id, struct rte_ether_addr *addr)
>> 		return -ENOTSUP;
>>
>> 	ret = (*dev->dev_ops->mac_addr_set)(dev, addr);
>>+	rte_ethdev_trace_default_mac_addr_set(port_id, addr, ret);
>> 	if (ret < 0)
>> 		return ret;
>>
>>@@ -4415,6 +4518,7 @@ rte_eth_dev_uc_hash_table_set(uint16_t port_id,
>>struct rte_ether_addr *addr,
>> 	if (*dev->dev_ops->uc_hash_table_set == NULL)
>> 		return -ENOTSUP;
>> 	ret = (*dev->dev_ops->uc_hash_table_set)(dev, addr, on);
>>+	rte_ethdev_trace_uc_hash_table_set(port_id, addr, on, ret);
>> 	if (ret == 0) {
>> 		/* Update address in NIC data structure */
>> 		if (on)
>>@@ -4438,6 +4542,7 @@ rte_eth_dev_uc_all_hash_table_set(uint16_t
>>port_id, uint8_t on)
>>
>> 	if (*dev->dev_ops->uc_all_hash_table_set == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_uc_all_hash_table_set(port_id, on);
>> 	return eth_err(port_id, (*dev->dev_ops->uc_all_hash_table_set)(dev,
>> 								       on));
>> }
>>@@ -4475,6 +4580,7 @@ int rte_eth_set_queue_rate_limit(uint16_t port_id,
>>uint16_t queue_idx,
>>
>> 	if (*dev->dev_ops->set_queue_rate_limit == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_set_queue_rate_limit(port_id, queue_idx, tx_rate);
>> 	return eth_err(port_id, (*dev->dev_ops->set_queue_rate_limit)(dev,
>> 							queue_idx, tx_rate));
>> }
>>@@ -4502,6 +4608,7 @@ int rte_eth_rx_avail_thresh_set(uint16_t port_id,
>>uint16_t queue_id,
>> 	}
>> 	if (*dev->dev_ops->rx_queue_avail_thresh_set == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_rx_avail_thresh_set(port_id, queue_id, avail_thresh);
>> 	return eth_err(port_id, (*dev->dev_ops-
>>>rx_queue_avail_thresh_set)(dev,
>> 							     queue_id,
>>avail_thresh));
>> }
>>@@ -4521,6 +4628,7 @@ int rte_eth_rx_avail_thresh_query(uint16_t port_id,
>>uint16_t *queue_id,
>>
>> 	if (*dev->dev_ops->rx_queue_avail_thresh_query == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_rx_avail_thresh_query(port_id, *queue_id);
>> 	return eth_err(port_id, (*dev->dev_ops-
>>>rx_queue_avail_thresh_query)(dev,
>> 							     queue_id,
>>avail_thresh));
>> }
>>@@ -4570,6 +4678,9 @@ rte_eth_dev_callback_register(uint16_t port_id,
>> 		next_port = last_port = port_id;
>> 	}
>>
>>+	rte_ethdev_trace_callback_register(port_id, event, cb_fn, cb_arg,
>>next_port,
>>+					   last_port);
>>+
>> 	rte_spinlock_lock(&eth_dev_cb_lock);
>>
>> 	do {
>>@@ -4665,6 +4776,7 @@ rte_eth_dev_callback_unregister(uint16_t port_id,
>> 	} while (++next_port <= last_port);
>>
>> 	rte_spinlock_unlock(&eth_dev_cb_lock);
>>+	rte_ethdev_trace_callback_unregister(port_id, event, cb_fn, cb_arg,
>>ret);
>> 	return ret;
>> }
>>
>>@@ -4694,6 +4806,7 @@ rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd,
>>int op, void *data)
>> 	for (qid = 0; qid < dev->data->nb_rx_queues; qid++) {
>> 		vec = rte_intr_vec_list_index_get(intr_handle, qid);
>> 		rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
>>+		rte_ethdev_trace_rx_intr_ctl(port_id, epfd, op, data, rc);
>> 		if (rc && rc != -EEXIST) {
>> 			RTE_ETHDEV_LOG(ERR,
>> 				"p %u q %u Rx ctl error op %d epfd %d vec
>>%u\n",
>>@@ -4737,6 +4850,7 @@ rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id,
>>uint16_t queue_id)
>> 		(vec - RTE_INTR_VEC_RXTX_OFFSET) : vec;
>> 	fd = rte_intr_efds_index_get(intr_handle, efd_idx);
>>
>>+	rte_ethdev_trace_rx_intr_ctl_q_get_fd(port_id, queue_id, fd);
>> 	return fd;
>> }
>>
>>@@ -4770,6 +4884,7 @@ rte_eth_dev_rx_intr_ctl_q(uint16_t port_id,
>>uint16_t queue_id,
>>
>> 	vec = rte_intr_vec_list_index_get(intr_handle, queue_id);
>> 	rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
>>+	rte_ethdev_trace_rx_intr_ctl_q(port_id, queue_id, epfd, op, data, rc);
>> 	if (rc && rc != -EEXIST) {
>> 		RTE_ETHDEV_LOG(ERR,
>> 			"p %u q %u Rx ctl error op %d epfd %d vec %u\n",
>>@@ -4796,6 +4911,7 @@ rte_eth_dev_rx_intr_enable(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->rx_queue_intr_enable == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_rx_intr_enable(port_id, queue_id);
>> 	return eth_err(port_id, (*dev->dev_ops->rx_queue_intr_enable)(dev,
>>queue_id));
>> }
>>
>>@@ -4815,6 +4931,7 @@ rte_eth_dev_rx_intr_disable(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->rx_queue_intr_disable == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_rx_intr_disable(port_id, queue_id);
>> 	return eth_err(port_id, (*dev->dev_ops->rx_queue_intr_disable)(dev,
>>queue_id));
>> }
>>
>>@@ -4873,6 +4990,7 @@ rte_eth_add_rx_callback(uint16_t port_id, uint16_t
>>queue_id,
>> 	}
>> 	rte_spinlock_unlock(&eth_dev_rx_cb_lock);
>>
>>+	rte_eth_trace_add_rx_callback(port_id, queue_id, fn, user_param,
>>cb);
>> 	return cb;
>> }
>>
>>@@ -4912,6 +5030,7 @@ rte_eth_add_first_rx_callback(uint16_t port_id,
>>uint16_t queue_id,
>> 		cb, __ATOMIC_RELEASE);
>> 	rte_spinlock_unlock(&eth_dev_rx_cb_lock);
>>
>>+	rte_eth_trace_add_first_rx_callback(port_id, queue_id, fn,
>>user_param, cb);
>> 	return cb;
>> }
>>
>>@@ -4971,6 +5090,7 @@ rte_eth_add_tx_callback(uint16_t port_id, uint16_t
>>queue_id,
>> 	}
>> 	rte_spinlock_unlock(&eth_dev_tx_cb_lock);
>>
>>+	rte_eth_trace_add_tx_callback(port_id, queue_id, fn, user_param,
>>cb);
>> 	return cb;
>> }
>>
>>@@ -5005,6 +5125,7 @@ rte_eth_remove_rx_callback(uint16_t port_id,
>>uint16_t queue_id,
>> 	}
>> 	rte_spinlock_unlock(&eth_dev_rx_cb_lock);
>>
>>+	rte_eth_trace_remove_rx_callback(port_id, queue_id, user_cb, ret);
>> 	return ret;
>> }
>>
>>@@ -5039,6 +5160,7 @@ rte_eth_remove_tx_callback(uint16_t port_id,
>>uint16_t queue_id,
>> 	}
>> 	rte_spinlock_unlock(&eth_dev_tx_cb_lock);
>>
>>+	rte_eth_trace_remove_tx_callback(port_id, queue_id, user_cb, ret);
>> 	return ret;
>> }
>>
>>@@ -5085,6 +5207,7 @@ rte_eth_rx_queue_info_get(uint16_t port_id,
>>uint16_t queue_id,
>> 	dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
>> 	qinfo->queue_state = dev->data->rx_queue_state[queue_id];
>>
>>+	rte_eth_trace_rx_queue_info_get(port_id, queue_id, qinfo);
>> 	return 0;
>> }
>>
>>@@ -5131,6 +5254,7 @@ rte_eth_tx_queue_info_get(uint16_t port_id,
>>uint16_t queue_id,
>> 	dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
>> 	qinfo->queue_state = dev->data->tx_queue_state[queue_id];
>>
>>+	rte_eth_trace_tx_queue_info_get(port_id, queue_id, qinfo);
>> 	return 0;
>> }
>>
>>@@ -5158,6 +5282,7 @@ rte_eth_rx_burst_mode_get(uint16_t port_id,
>>uint16_t queue_id,
>> 	if (*dev->dev_ops->rx_burst_mode_get == NULL)
>> 		return -ENOTSUP;
>> 	memset(mode, 0, sizeof(*mode));
>>+	rte_eth_trace_rx_burst_mode_get(port_id, queue_id, mode);
>> 	return eth_err(port_id,
>> 		       dev->dev_ops->rx_burst_mode_get(dev, queue_id,
>>mode));
>> }
>>@@ -5186,6 +5311,7 @@ rte_eth_tx_burst_mode_get(uint16_t port_id,
>>uint16_t queue_id,
>> 	if (*dev->dev_ops->tx_burst_mode_get == NULL)
>> 		return -ENOTSUP;
>> 	memset(mode, 0, sizeof(*mode));
>>+	rte_eth_trace_tx_burst_mode_get(port_id, queue_id, mode);
>> 	return eth_err(port_id,
>> 		       dev->dev_ops->tx_burst_mode_get(dev, queue_id,
>>mode));
>> }
>>@@ -5213,6 +5339,7 @@ rte_eth_get_monitor_addr(uint16_t port_id,
>>uint16_t queue_id,
>>
>> 	if (*dev->dev_ops->get_monitor_addr == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_get_monitor_addr(port_id, queue_id, pmc);
>> 	return eth_err(port_id,
>> 		dev->dev_ops->get_monitor_addr(dev->data-
>>>rx_queues[queue_id], pmc));
>> }
>>@@ -5229,6 +5356,7 @@ rte_eth_dev_set_mc_addr_list(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->set_mc_addr_list == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_set_mc_addr_list(port_id, mc_addr_set,
>>nb_mc_addr);
>> 	return eth_err(port_id, dev->dev_ops->set_mc_addr_list(dev,
>> 						mc_addr_set, nb_mc_addr));
>> }
>>@@ -5243,6 +5371,7 @@ rte_eth_timesync_enable(uint16_t port_id)
>>
>> 	if (*dev->dev_ops->timesync_enable == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_timesync_enable(port_id);
>> 	return eth_err(port_id, (*dev->dev_ops->timesync_enable)(dev));
>> }
>>
>>@@ -5256,6 +5385,7 @@ rte_eth_timesync_disable(uint16_t port_id)
>>
>> 	if (*dev->dev_ops->timesync_disable == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_timesync_disable(port_id);
>> 	return eth_err(port_id, (*dev->dev_ops->timesync_disable)(dev));
>> }
>>
>>@@ -5277,6 +5407,7 @@ rte_eth_timesync_read_rx_timestamp(uint16_t
>>port_id, struct timespec *timestamp,
>>
>> 	if (*dev->dev_ops->timesync_read_rx_timestamp == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_timesync_read_rx_timestamp(port_id, timestamp,
>>flags);
>> 	return eth_err(port_id, (*dev->dev_ops-
>>>timesync_read_rx_timestamp)
>> 				(dev, timestamp, flags));
>> }
>>@@ -5299,6 +5430,7 @@ rte_eth_timesync_read_tx_timestamp(uint16_t
>>port_id,
>>
>> 	if (*dev->dev_ops->timesync_read_tx_timestamp == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_timesync_read_tx_timestamp(port_id, timestamp);
>> 	return eth_err(port_id, (*dev->dev_ops-
>>>timesync_read_tx_timestamp)
>> 				(dev, timestamp));
>> }
>>@@ -5313,6 +5445,7 @@ rte_eth_timesync_adjust_time(uint16_t port_id,
>>int64_t delta)
>>
>> 	if (*dev->dev_ops->timesync_adjust_time == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_timesync_adjust_time(port_id, delta);
>> 	return eth_err(port_id, (*dev->dev_ops->timesync_adjust_time)(dev,
>>delta));
>> }
>>
>>@@ -5333,6 +5466,7 @@ rte_eth_timesync_read_time(uint16_t port_id,
>>struct timespec *timestamp)
>>
>> 	if (*dev->dev_ops->timesync_read_time == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_timesync_read_time(port_id, timestamp);
>> 	return eth_err(port_id, (*dev->dev_ops->timesync_read_time)(dev,
>> 								timestamp));
>> }
>>@@ -5354,6 +5488,7 @@ rte_eth_timesync_write_time(uint16_t port_id,
>>const struct timespec *timestamp)
>>
>> 	if (*dev->dev_ops->timesync_write_time == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_timesync_write_time(port_id, timestamp);
>> 	return eth_err(port_id, (*dev->dev_ops->timesync_write_time)(dev,
>> 								timestamp));
>> }
>>@@ -5374,6 +5509,7 @@ rte_eth_read_clock(uint16_t port_id, uint64_t
>>*clock)
>>
>> 	if (*dev->dev_ops->read_clock == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_read_clock(port_id, clock);
>> 	return eth_err(port_id, (*dev->dev_ops->read_clock)(dev, clock));
>> }
>>
>>@@ -5394,6 +5530,7 @@ rte_eth_dev_get_reg_info(uint16_t port_id, struct
>>rte_dev_reg_info *info)
>>
>> 	if (*dev->dev_ops->get_reg == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_get_reg_info(port_id, info);
>> 	return eth_err(port_id, (*dev->dev_ops->get_reg)(dev, info));
>> }
>>
>>@@ -5407,6 +5544,7 @@ rte_eth_dev_get_eeprom_length(uint16_t port_id)
>>
>> 	if (*dev->dev_ops->get_eeprom_length == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_get_eeprom_length(port_id);
>> 	return eth_err(port_id, (*dev->dev_ops->get_eeprom_length)(dev));
>> }
>>
>>@@ -5427,6 +5565,7 @@ rte_eth_dev_get_eeprom(uint16_t port_id, struct
>>rte_dev_eeprom_info *info)
>>
>> 	if (*dev->dev_ops->get_eeprom == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_get_eeprom(port_id, info);
>> 	return eth_err(port_id, (*dev->dev_ops->get_eeprom)(dev, info));
>> }
>>
>>@@ -5447,6 +5586,7 @@ rte_eth_dev_set_eeprom(uint16_t port_id, struct
>>rte_dev_eeprom_info *info)
>>
>> 	if (*dev->dev_ops->set_eeprom == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_set_eeprom(port_id, info);
>> 	return eth_err(port_id, (*dev->dev_ops->set_eeprom)(dev, info));
>> }
>>
>>@@ -5468,6 +5608,7 @@ rte_eth_dev_get_module_info(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->get_module_info == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_get_module_info(port_id, modinfo);
>> 	return (*dev->dev_ops->get_module_info)(dev, modinfo);
>> }
>>
>>@@ -5503,6 +5644,7 @@ rte_eth_dev_get_module_eeprom(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->get_module_eeprom == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_get_module_eeprom(port_id, info);
>> 	return (*dev->dev_ops->get_module_eeprom)(dev, info);
>> }
>>
>>@@ -5526,6 +5668,7 @@ rte_eth_dev_get_dcb_info(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->get_dcb_info == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_get_dcb_info(port_id, dcb_info);
>> 	return eth_err(port_id, (*dev->dev_ops->get_dcb_info)(dev,
>>dcb_info));
>> }
>>
>>@@ -5562,6 +5705,7 @@ rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t
>>port_id,
>> 	if (nb_tx_desc != NULL)
>> 		eth_dev_adjust_nb_desc(nb_tx_desc,
>>&dev_info.tx_desc_lim);
>>
>>+	rte_ethdev_trace_adjust_nb_rx_tx_desc(port_id, *nb_rx_desc,
>>*nb_tx_desc);
>> 	return 0;
>> }
>>
>>@@ -5584,6 +5728,7 @@ rte_eth_dev_hairpin_capability_get(uint16_t
>>port_id,
>> 	if (*dev->dev_ops->hairpin_cap_get == NULL)
>> 		return -ENOTSUP;
>> 	memset(cap, 0, sizeof(*cap));
>>+	rte_ethdev_trace_hairpin_capability_get(port_id, cap);
>> 	return eth_err(port_id, (*dev->dev_ops->hairpin_cap_get)(dev, cap));
>> }
>>
>>@@ -5605,6 +5750,7 @@ rte_eth_dev_pool_ops_supported(uint16_t port_id,
>>const char *pool)
>> 	if (*dev->dev_ops->pool_ops_supported == NULL)
>> 		return 1; /* all pools are supported */
>>
>>+	rte_ethdev_trace_pool_ops_supported(port_id, pool);
>> 	return (*dev->dev_ops->pool_ops_supported)(dev, pool);
>> }
>>
>>@@ -5901,6 +6047,7 @@ rte_eth_representor_info_get(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->representor_info_get == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_representor_info_get(port_id, info);
>> 	return eth_err(port_id, (*dev->dev_ops->representor_info_get)(dev,
>>info));
>> }
>>
>>@@ -5924,6 +6071,7 @@ rte_eth_rx_metadata_negotiate(uint16_t port_id,
>>uint64_t *features)
>> 		return -EINVAL;
>> 	}
>>
>>+	rte_eth_trace_rx_metadata_negotiate(port_id, features, *features);
>> 	if (*dev->dev_ops->rx_metadata_negotiate == NULL)
>> 		return -ENOTSUP;
>> 	return eth_err(port_id,
>>@@ -5956,6 +6104,7 @@ rte_eth_ip_reassembly_capability_get(uint16_t
>>port_id,
>> 		return -ENOTSUP;
>> 	memset(reassembly_capa, 0, sizeof(struct
>>rte_eth_ip_reassembly_params));
>>
>>+	rte_eth_trace_ip_reassembly_capability_get(port_id,
>>reassembly_capa);
>> 	return eth_err(port_id, (*dev->dev_ops-
>>>ip_reassembly_capability_get)
>> 					(dev, reassembly_capa));
>> }
>>@@ -5985,6 +6134,7 @@ rte_eth_ip_reassembly_conf_get(uint16_t port_id,
>> 	if (*dev->dev_ops->ip_reassembly_conf_get == NULL)
>> 		return -ENOTSUP;
>> 	memset(conf, 0, sizeof(struct rte_eth_ip_reassembly_params));
>>+	rte_eth_trace_ip_reassembly_conf_get(port_id, conf);
>> 	return eth_err(port_id,
>> 		       (*dev->dev_ops->ip_reassembly_conf_get)(dev, conf));
>> }
>>@@ -6022,6 +6172,7 @@ rte_eth_ip_reassembly_conf_set(uint16_t port_id,
>>
>> 	if (*dev->dev_ops->ip_reassembly_conf_set == NULL)
>> 		return -ENOTSUP;
>>+	rte_eth_trace_ip_reassembly_conf_set(port_id, conf);
>> 	return eth_err(port_id,
>> 		       (*dev->dev_ops->ip_reassembly_conf_set)(dev, conf));
>> }
>>@@ -6041,6 +6192,7 @@ rte_eth_dev_priv_dump(uint16_t port_id, FILE *file)
>>
>> 	if (*dev->dev_ops->eth_dev_priv_dump == NULL)
>> 		return -ENOTSUP;
>>+	rte_ethdev_trace_priv_dump(port_id);
>> 	return eth_err(port_id, (*dev->dev_ops->eth_dev_priv_dump)(dev,
>>file));
>> }
>>
>>diff --git a/lib/ethdev/rte_ethdev_trace.h b/lib/ethdev/rte_ethdev_trace.h
>>index 1491c815c3..802f2c1ae1 100644
>>--- a/lib/ethdev/rte_ethdev_trace.h
>>+++ b/lib/ethdev/rte_ethdev_trace.h
>>@@ -88,6 +88,1200 @@ RTE_TRACE_POINT(
>> 	rte_trace_point_emit_u16(port_id);
>> )
>>
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_add_first_rx_callback,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		rte_rx_callback_fn fn, void *user_param,
>>+		struct rte_eth_rxtx_callback *cb),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_ptr(fn);
>>+	rte_trace_point_emit_ptr(user_param);
>>+	rte_trace_point_emit_ptr(cb);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_add_rx_callback,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		rte_rx_callback_fn fn, void *user_param,
>>+		struct rte_eth_rxtx_callback *cb),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_ptr(fn);
>>+	rte_trace_point_emit_ptr(user_param);
>>+	rte_trace_point_emit_ptr(cb);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_add_tx_callback,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		rte_tx_callback_fn fn, void *user_param,
>>+		struct rte_eth_rxtx_callback *cb),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_ptr(fn);
>>+	rte_trace_point_emit_ptr(user_param);
>>+	rte_trace_point_emit_ptr(cb);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_allmulticast_disable,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int all_multicast),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(all_multicast);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_allmulticast_enable,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int all_multicast),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(all_multicast);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_allmulticast_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int all_multicast),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(all_multicast);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_mtu,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t mtu, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(mtu);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_adjust_nb_rx_tx_desc,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t nb_rx_desc,
>>+		uint16_t nb_tx_desc),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(nb_rx_desc);
>>+	rte_trace_point_emit_u16(nb_tx_desc);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_callback_register,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, enum rte_eth_event_type
>>event,
>>+		rte_eth_dev_cb_fn cb_fn, void *cb_arg, uint16_t next_port,
>>+		uint16_t last_port),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(event);
>>+	rte_trace_point_emit_ptr(cb_fn);
>>+	rte_trace_point_emit_ptr(cb_arg);
>>+	rte_trace_point_emit_u16(next_port);
>>+	rte_trace_point_emit_u16(last_port);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_callback_unregister,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, enum rte_eth_event_type
>>event,
>>+		rte_eth_dev_cb_fn cb_fn, void *cb_arg, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(event);
>>+	rte_trace_point_emit_ptr(cb_fn);
>>+	rte_trace_point_emit_ptr(cb_arg);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_default_mac_addr_set,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>>*addr, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(addr);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_flow_ctrl_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_fc_conf
>>*fc_conf),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(fc_conf);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_flow_ctrl_set,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_fc_conf
>>*fc_conf),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u32(fc_conf->high_water);
>>+	rte_trace_point_emit_u32(fc_conf->low_water);
>>+	rte_trace_point_emit_u16(fc_conf->pause_time);
>>+	rte_trace_point_emit_u16(fc_conf->send_xon);
>>+	rte_trace_point_emit_int(fc_conf->mode);
>>+	rte_trace_point_emit_u8(fc_conf->mac_ctrl_frame_fwd);
>>+	rte_trace_point_emit_u8(fc_conf->autoneg);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_fw_version_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, char *fw_version, size_t
>>fw_size),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(fw_version);
>>+	rte_trace_point_emit_size_t(fw_size);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_dcb_info,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_dcb_info
>>*dcb_info),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(dcb_info);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_eeprom,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct
>>rte_dev_eeprom_info *info),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(info);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_eeprom_length,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_mtu,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t mtu),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(mtu);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_count_avail,
>>+	RTE_TRACE_POINT_ARGS(uint16_t count),
>>+	rte_trace_point_emit_u16(count);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_count_total,
>>+	RTE_TRACE_POINT_ARGS(uint16_t count),
>>+	rte_trace_point_emit_u16(count);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_name_by_port,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, char *name),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_string(name);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_port_by_name,
>>+	RTE_TRACE_POINT_ARGS(const char *name, uint16_t port_id),
>>+	rte_trace_point_emit_string(name);
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_reg_info,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_dev_reg_info
>>*info),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(info);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_sec_ctx,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_supported_ptypes,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t ptype_mask,
>>+		uint32_t *ptypes, int num, int j),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u32(ptype_mask);
>>+	rte_trace_point_emit_ptr(ptypes);
>>+	rte_trace_point_emit_int(num);
>>+	rte_trace_point_emit_int(j);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_vlan_offload,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_info_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_dev_info *dev_info),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_string(dev_info->driver_name);
>>+	rte_trace_point_emit_u32(dev_info->if_index);
>>+	rte_trace_point_emit_u16(dev_info->min_mtu);
>>+	rte_trace_point_emit_u16(dev_info->max_mtu);
>>+	rte_trace_point_emit_u32(dev_info->min_rx_bufsize);
>>+	rte_trace_point_emit_u32(dev_info->max_rx_pktlen);
>>+	rte_trace_point_emit_u64(dev_info->rx_offload_capa);
>>+	rte_trace_point_emit_u64(dev_info->tx_offload_capa);
>>+	rte_trace_point_emit_u64(dev_info->rx_queue_offload_capa);
>>+	rte_trace_point_emit_u64(dev_info->tx_queue_offload_capa);
>>+	rte_trace_point_emit_u16(dev_info->reta_size);
>>+	rte_trace_point_emit_u8(dev_info->hash_key_size);
>>+	rte_trace_point_emit_u16(dev_info->nb_rx_queues);
>>+	rte_trace_point_emit_u16(dev_info->nb_tx_queues);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_is_removed,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_is_valid_port,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_mac_addr_add,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>>*addr,
>>+		uint32_t pool),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(addr);
>>+	rte_trace_point_emit_u32(pool);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_mac_addr_remove,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>>*addr),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(addr);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_pool_ops_supported,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const char *pool),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(pool);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_priority_flow_ctrl_set,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_pfc_conf
>>*pfc_conf),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u32(pfc_conf->fc.high_water);
>>+	rte_trace_point_emit_u32(pfc_conf->fc.low_water);
>>+	rte_trace_point_emit_u16(pfc_conf->fc.pause_time);
>>+	rte_trace_point_emit_u16(pfc_conf->fc.send_xon);
>>+	rte_trace_point_emit_int(pfc_conf->fc.mode);
>>+	rte_trace_point_emit_u8(pfc_conf->fc.mac_ctrl_frame_fwd);
>>+	rte_trace_point_emit_u8(pfc_conf->fc.autoneg);
>>+	rte_trace_point_emit_u8(pfc_conf->priority);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_reset,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rss_hash_conf_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_rss_conf
>>*rss_conf),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(rss_conf);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rss_hash_update,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_rss_conf
>>*rss_conf),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(rss_conf->rss_key);
>>+	rte_trace_point_emit_u8(rss_conf->rss_key_len);
>>+	rte_trace_point_emit_u64(rss_conf->rss_hf);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rss_reta_query,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t
>>reta_size),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(reta_conf);
>>+	rte_trace_point_emit_u16(reta_size);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rss_reta_update,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t
>>reta_size),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u64(reta_conf->mask);
>>+	rte_trace_point_emit_u16(reta_size);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rx_intr_ctl,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int epfd, int op, void
>>*data, int rc),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(epfd);
>>+	rte_trace_point_emit_int(op);
>>+	rte_trace_point_emit_ptr(data);
>>+	rte_trace_point_emit_int(rc);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rx_intr_ctl_q,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id, int
>>epfd,
>>+		int op, void *data, int rc),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_int(epfd);
>>+	rte_trace_point_emit_int(op);
>>+	rte_trace_point_emit_ptr(data);
>>+	rte_trace_point_emit_int(rc);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rx_intr_ctl_q_get_fd,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id, int fd),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_int(fd);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rx_intr_disable,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rx_intr_enable,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rx_offload_name,
>>+	RTE_TRACE_POINT_ARGS(uint64_t offload, const char *name),
>>+	rte_trace_point_emit_u64(offload);
>>+	rte_trace_point_emit_string(name);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rx_queue_start,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(rx_queue_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_rx_queue_stop,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(rx_queue_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_eeprom,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct
>>rte_dev_eeprom_info *info),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(info->data);
>>+	rte_trace_point_emit_u32(info->offset);
>>+	rte_trace_point_emit_u32(info->length);
>>+	rte_trace_point_emit_u32(info->magic);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_link_down,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_link_up,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_mc_addr_list,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_ether_addr *mc_addr_set,
>>+		uint32_t nb_mc_addr),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(mc_addr_set);
>>+	rte_trace_point_emit_u32(nb_mc_addr);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_ptypes,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t ptype_mask,
>>+		uint32_t *set_ptypes, unsigned int num),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u32(ptype_mask);
>>+	rte_trace_point_emit_ptr(set_ptypes);
>>+	rte_trace_point_emit_u32(num);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_rx_queue_stats_mapping,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
>>+		uint8_t stat_idx),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(rx_queue_id);
>>+	rte_trace_point_emit_u8(stat_idx);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_tx_queue_stats_mapping,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
>>+		uint8_t stat_idx),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(tx_queue_id);
>>+	rte_trace_point_emit_u8(stat_idx);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_vlan_ether_type,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, enum rte_vlan_type
>>vlan_type,
>>+		uint16_t tag_type),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(vlan_type);
>>+	rte_trace_point_emit_u16(tag_type);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_vlan_offload,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int offload_mask, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(offload_mask);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_vlan_pvid,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t pvid, int on),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(pvid);
>>+	rte_trace_point_emit_int(on);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_set_vlan_strip_on_queue,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
>>+		int on),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(rx_queue_id);
>>+	rte_trace_point_emit_int(on);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_socket_id,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_tx_offload_name,
>>+	RTE_TRACE_POINT_ARGS(uint64_t offload, const char *name),
>>+	rte_trace_point_emit_u64(offload);
>>+	rte_trace_point_emit_string(name);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_tx_queue_start,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(tx_queue_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_tx_queue_stop,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(tx_queue_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_uc_all_hash_table_set,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint8_t on),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u8(on);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_uc_hash_table_set,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>>*addr,
>>+		uint8_t on, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(addr);
>>+	rte_trace_point_emit_u8(on);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_udp_tunnel_port_add,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_udp_tunnel
>>*tunnel_udp),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(tunnel_udp->udp_port);
>>+	rte_trace_point_emit_u8(tunnel_udp->prot_type);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_udp_tunnel_port_delete,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_udp_tunnel
>>*tunnel_udp),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(tunnel_udp->udp_port);
>>+	rte_trace_point_emit_u8(tunnel_udp->prot_type);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_vlan_filter,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t vlan_id, int on,
>>int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(vlan_id);
>>+	rte_trace_point_emit_int(on);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_find_next,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_find_next_of,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id_start,
>>+		const struct rte_device *parent),
>>+	rte_trace_point_emit_u16(port_id_start);
>>+	rte_trace_point_emit_ptr(parent);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_find_next_owned_by,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		const uint64_t owner_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u64(owner_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_find_next_sibling,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id_start, uint16_t
>>ref_port_id),
>>+	rte_trace_point_emit_u16(port_id_start);
>>+	rte_trace_point_emit_u16(ref_port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_iterator_cleanup,
>>+	RTE_TRACE_POINT_ARGS(struct rte_dev_iterator *iter),
>>+	rte_trace_point_emit_ptr(iter);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_iterator_init,
>>+	RTE_TRACE_POINT_ARGS(struct rte_dev_iterator *iter, const char
>>*devargs),
>>+	rte_trace_point_emit_ptr(iter);
>>+	rte_trace_point_emit_ptr(devargs);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_iterator_next,
>>+	RTE_TRACE_POINT_ARGS(struct rte_dev_iterator *iter),
>>+	rte_trace_point_emit_ptr(iter);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_led_off,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_led_on,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_link_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_link *link),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u32(link->link_speed);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_link_get_nowait,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_link *link),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u32(link->link_speed);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_macaddr_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>>*mac_addr),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(mac_addr);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_promiscuous_disable,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int promiscuous),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(promiscuous);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_promiscuous_enable,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int promiscuous),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(promiscuous);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_promiscuous_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int promiscuous),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_int(promiscuous);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_remove_rx_callback,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		const struct rte_eth_rxtx_callback *user_cb, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_ptr(user_cb);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_remove_tx_callback,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		const struct rte_eth_rxtx_callback *user_cb, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_ptr(user_cb);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_rx_burst_mode_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		struct rte_eth_burst_mode *mode),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_ptr(mode);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_rx_queue_info_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		struct rte_eth_rxq_info *qinfo),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_ptr(qinfo->mp);
>>+	rte_trace_point_emit_u8(qinfo->scattered_rx);
>>+	rte_trace_point_emit_u8(qinfo->queue_state);
>>+	rte_trace_point_emit_u16(qinfo->nb_desc);
>>+	rte_trace_point_emit_u16(qinfo->rx_buf_size);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_rx_queue_setup,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
>>+		uint16_t nb_rx_desc, unsigned int socket_id,
>>+		const struct rte_eth_rxconf *rx_conf,
>>+		struct rte_mempool *mb_pool),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(rx_queue_id);
>>+	rte_trace_point_emit_u16(nb_rx_desc);
>>+	rte_trace_point_emit_u32(socket_id);
>>+	rte_trace_point_emit_ptr(rx_conf);
>>+	rte_trace_point_emit_ptr(mb_pool);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_set_queue_rate_limit,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_idx,
>>+		uint16_t tx_rate),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_idx);
>>+	rte_trace_point_emit_u16(tx_rate);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_speed_bitflag,
>>+	RTE_TRACE_POINT_ARGS(uint32_t speed, int duplex),
>>+	rte_trace_point_emit_u32(speed);
>>+	rte_trace_point_emit_int(duplex);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_stats_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_stats
>>*stats),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(stats);
>>+	rte_trace_point_emit_u64(stats->rx_nombuf);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_stats_reset,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_timesync_adjust_time,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int64_t delta),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_i64(delta);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_timesync_disable,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_timesync_enable,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_timesync_read_rx_timestamp,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct timespec
>>*timestamp,
>>+		uint32_t flags),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(timestamp);
>>+	rte_trace_point_emit_u32(flags);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_timesync_read_time,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct timespec *time),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(time);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_timesync_read_tx_timestamp,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct timespec
>>*timestamp),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(timestamp);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_timesync_write_time,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const struct timespec
>>*time),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(time);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_tx_buffer_count_callback,
>>+	RTE_TRACE_POINT_ARGS(struct rte_mbuf **pkts, uint16_t unsent,
>>+		uint64_t count),
>>+	rte_trace_point_emit_ptr(pkts);
>>+	rte_trace_point_emit_u16(unsent);
>>+	rte_trace_point_emit_u64(count);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_tx_buffer_drop_callback,
>>+	RTE_TRACE_POINT_ARGS(struct rte_mbuf **pkts, uint16_t unsent),
>>+	rte_trace_point_emit_ptr(pkts);
>>+	rte_trace_point_emit_u16(unsent);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_tx_buffer_init,
>>+	RTE_TRACE_POINT_ARGS(struct rte_eth_dev_tx_buffer *buffer,
>>uint16_t size,
>>+		int ret),
>>+	rte_trace_point_emit_ptr(buffer);
>>+	rte_trace_point_emit_u16(size);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_tx_buffer_set_err_callback,
>>+	RTE_TRACE_POINT_ARGS(struct rte_eth_dev_tx_buffer *buffer,
>>+		buffer_tx_error_fn callback, void *userdata),
>>+	rte_trace_point_emit_ptr(buffer);
>>+	rte_trace_point_emit_ptr(callback);
>>+	rte_trace_point_emit_ptr(userdata);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_tx_burst_mode_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		struct rte_eth_burst_mode *mode),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_ptr(mode);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_tx_done_cleanup,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>uint32_t free_cnt,
>>+		int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_u32(free_cnt);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_tx_queue_info_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		struct rte_eth_txq_info *qinfo),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_u16(qinfo->nb_desc);
>>+	rte_trace_point_emit_u8(qinfo->queue_state);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_xstats_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_xstat xstats,
>>+		int i),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u64(xstats.id);
>>+	rte_trace_point_emit_u64(xstats.value);
>>+	rte_trace_point_emit_u32(i);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_xstats_get_by_id,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const uint64_t *ids,
>>+		uint64_t *values, unsigned int size),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(ids);
>>+	rte_trace_point_emit_ptr(values);
>>+	rte_trace_point_emit_u32(size);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_xstats_get_id_by_name,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const char *xstat_name,
>>+		uint64_t *id),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_string(xstat_name);
>>+	rte_trace_point_emit_ptr(id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_xstats_get_names,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_xstat_name *xstats_names,
>>+		unsigned int size, int cnt_used_entries),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_string(xstats_names->name);
>>+	rte_trace_point_emit_u32(size);
>>+	rte_trace_point_emit_int(cnt_used_entries);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_xstats_get_names_by_id,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_xstat_name *xstats_names, uint64_t ids),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_string(xstats_names->name);
>>+	rte_trace_point_emit_u64(ids);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_xstats_reset,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_owner_delete,
>>+	RTE_TRACE_POINT_ARGS(const uint64_t owner_id, int ret),
>>+	rte_trace_point_emit_u64(owner_id);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_owner_get,
>>+	RTE_TRACE_POINT_ARGS(const uint16_t port_id,
>>+		struct rte_eth_dev_owner *owner),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u64(owner->id);
>>+	rte_trace_point_emit_string(owner->name);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_owner_new,
>>+	RTE_TRACE_POINT_ARGS(uint64_t owner_id),
>>+	rte_trace_point_emit_u64(owner_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_owner_set,
>>+	RTE_TRACE_POINT_ARGS(const uint16_t port_id,
>>+		const struct rte_eth_dev_owner *owner, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u64(owner->id);
>>+	rte_trace_point_emit_string(owner->name);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_owner_unset,
>>+	RTE_TRACE_POINT_ARGS(const uint16_t port_id,
>>+		const uint64_t owner_id, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u64(owner_id);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_module_eeprom,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_dev_eeprom_info *info),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(info);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_get_module_info,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_dev_module_info *modinfo),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(modinfo);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_read_clock,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint64_t *clk),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(clk);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_hairpin_capability_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_hairpin_cap *cap),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(cap);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_rx_hairpin_queue_setup,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
>>+		uint16_t nb_rx_desc, const struct rte_eth_hairpin_conf *conf,
>>+		int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(rx_queue_id);
>>+	rte_trace_point_emit_u16(nb_rx_desc);
>>+	rte_trace_point_emit_ptr(conf);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_tx_hairpin_queue_setup,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
>>+		uint16_t nb_tx_desc, const struct rte_eth_hairpin_conf *conf,
>>+		int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(tx_queue_id);
>>+	rte_trace_point_emit_u16(nb_tx_desc);
>>+	rte_trace_point_emit_ptr(conf);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_hairpin_bind,
>>+	RTE_TRACE_POINT_ARGS(uint16_t tx_port, uint16_t rx_port, int ret),
>>+	rte_trace_point_emit_u16(tx_port);
>>+	rte_trace_point_emit_u16(rx_port);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_hairpin_get_peer_ports,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t *peer_ports,
>>+		size_t len, uint32_t direction, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(peer_ports);
>>+	rte_trace_point_emit_size_t(len);
>>+	rte_trace_point_emit_u32(direction);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_hairpin_unbind,
>>+	RTE_TRACE_POINT_ARGS(uint16_t tx_port, uint16_t rx_port, int ret),
>>+	rte_trace_point_emit_u16(tx_port);
>>+	rte_trace_point_emit_u16(rx_port);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_link_speed_to_str,
>>+	RTE_TRACE_POINT_ARGS(uint32_t link_speed),
>>+	rte_trace_point_emit_u32(link_speed);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_link_to_str,
>>+	RTE_TRACE_POINT_ARGS(char *str, size_t len,
>>+		const struct rte_eth_link *eth_link),
>>+	rte_trace_point_emit_ptr(str);
>>+	rte_trace_point_emit_size_t(len);
>>+	rte_trace_point_emit_ptr(eth_link);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_fec_get_capability,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_fec_capa *speed_fec_capa,
>>+		unsigned int num, int ret),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(speed_fec_capa);
>>+	rte_trace_point_emit_u32(num);
>>+	rte_trace_point_emit_int(ret);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_fec_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t *fec_capa),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(fec_capa);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_fec_set,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t fec_capa),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u32(fec_capa);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_get_monitor_addr,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		struct rte_power_monitor_cond *pmc),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_ptr(pmc);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_representor_info_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_representor_info *info),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(info);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_capability_name,
>>+	RTE_TRACE_POINT_ARGS(uint64_t capability, const char *name),
>>+	rte_trace_point_emit_u64(capability);
>>+	rte_trace_point_emit_string(name);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_conf_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_conf
>>*dev_conf),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(dev_conf);
>>+	rte_trace_point_emit_u32(dev_conf->link_speeds);
>>+	rte_trace_point_emit_u64(dev_conf->rxmode.offloads);
>>+	rte_trace_point_emit_u64(dev_conf->txmode.offloads);
>>+	rte_trace_point_emit_u32(dev_conf->lpbk_mode);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_macaddrs_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr
>>*ma,
>>+		unsigned int num),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(ma);
>>+	rte_trace_point_emit_u32(num);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_rx_metadata_negotiate,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint64_t *features,
>>+		uint64_t features_val),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(features);
>>+	rte_trace_point_emit_u64(features_val);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_priority_flow_ctrl_queue_configure,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_pfc_queue_conf *pfc_queue_conf),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(pfc_queue_conf);
>>+	rte_trace_point_emit_int(pfc_queue_conf->mode);
>>+	rte_trace_point_emit_u16(pfc_queue_conf->rx_pause.tx_qid);
>>+	rte_trace_point_emit_u16(pfc_queue_conf->tx_pause.rx_qid);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_priority_flow_ctrl_queue_info_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_pfc_queue_info *pfc_queue_info),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(pfc_queue_info);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_ethdev_trace_priv_dump,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_ip_reassembly_capability_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_ip_reassembly_params *capa),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(capa);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_ip_reassembly_conf_get,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		struct rte_eth_ip_reassembly_params *conf),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(conf);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_ip_reassembly_conf_set,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
>>+		const struct rte_eth_ip_reassembly_params *conf),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_ptr(conf);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_rx_avail_thresh_query,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+)
>>+
>>+RTE_TRACE_POINT(
>>+	rte_eth_trace_rx_avail_thresh_set,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		uint8_t avail_thresh),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_u8(avail_thresh);
>>+)
>>+
>> #ifdef __cplusplus
>> }
>> #endif
>>diff --git a/lib/ethdev/rte_ethdev_trace_fp.h
>>b/lib/ethdev/rte_ethdev_trace_fp.h
>>index 40084d1929..ba3fdd04a2 100644
>>--- a/lib/ethdev/rte_ethdev_trace_fp.h
>>+++ b/lib/ethdev/rte_ethdev_trace_fp.h
>>@@ -37,6 +37,25 @@ RTE_TRACE_POINT_FP(
>> 	rte_trace_point_emit_u16(nb_pkts);
>> )
>>
>>+RTE_TRACE_POINT_FP(
>>+	rte_eth_trace_call_rx_callbacks,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		uint16_t nb_rx, uint16_t nb_pkts),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_u16(nb_rx);
>>+	rte_trace_point_emit_u16(nb_pkts);
>>+)
>>+
>>+RTE_TRACE_POINT_FP(
>>+	rte_eth_trace_call_tx_callbacks,
>>+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>>+		uint16_t nb_pkts),
>>+	rte_trace_point_emit_u16(port_id);
>>+	rte_trace_point_emit_u16(queue_id);
>>+	rte_trace_point_emit_u16(nb_pkts);
>>+)
>>+
>> #ifdef __cplusplus
>> }
>> #endif
>>diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
>>index 3651ceb234..79d0b2ee1f 100644
>>--- a/lib/ethdev/version.map
>>+++ b/lib/ethdev/version.map
>>@@ -319,4 +319,148 @@ INTERNAL {
>> 	rte_eth_representor_id_get;
>> 	rte_eth_switch_domain_alloc;
>> 	rte_eth_switch_domain_free;
>>+	__rte_eth_trace_add_first_rx_callback;
>>+	__rte_eth_trace_add_rx_callback;
>>+	__rte_eth_trace_add_tx_callback;
>>+	__rte_eth_trace_allmulticast_disable;
>>+	__rte_eth_trace_allmulticast_enable;
>>+	__rte_eth_trace_allmulticast_get;
>>+	__rte_eth_trace_call_rx_callbacks;
>>+	__rte_eth_trace_call_tx_callbacks;
>>+	__rte_ethdev_trace_count_avail;
>>+	__rte_ethdev_trace_count_total;
>>+	__rte_ethdev_trace_set_mtu;
>>+	__rte_ethdev_trace_adjust_nb_rx_tx_desc;
>>+	__rte_ethdev_trace_callback_register;
>>+	__rte_ethdev_trace_callback_unregister;
>>+	__rte_ethdev_trace_default_mac_addr_set;
>>+	__rte_ethdev_trace_flow_ctrl_get;
>>+	__rte_ethdev_trace_flow_ctrl_set;
>>+	__rte_ethdev_trace_fw_version_get;
>>+	__rte_ethdev_trace_get_dcb_info;
>>+	__rte_ethdev_trace_get_eeprom;
>>+	__rte_ethdev_trace_get_eeprom_length;
>>+	__rte_ethdev_trace_get_mtu;
>>+	__rte_ethdev_trace_get_name_by_port;
>>+	__rte_ethdev_trace_get_port_by_name;
>>+	__rte_ethdev_trace_get_reg_info;
>>+	__rte_ethdev_trace_get_sec_ctx;
>>+	__rte_ethdev_trace_get_supported_ptypes;
>>+	__rte_ethdev_trace_get_vlan_offload;
>>+	__rte_ethdev_trace_info_get;
>>+	__rte_ethdev_trace_is_removed;
>>+	__rte_ethdev_trace_is_valid_port;
>>+	__rte_ethdev_trace_mac_addr_add;
>>+	__rte_ethdev_trace_mac_addr_remove;
>>+	__rte_ethdev_trace_pool_ops_supported;
>>+	__rte_ethdev_trace_priority_flow_ctrl_set;
>>+	__rte_ethdev_trace_reset;
>>+	__rte_ethdev_trace_rss_hash_conf_get;
>>+	__rte_ethdev_trace_rss_hash_update;
>>+	__rte_ethdev_trace_rss_reta_query;
>>+	__rte_ethdev_trace_rss_reta_update;
>>+	__rte_ethdev_trace_rx_intr_ctl;
>>+	__rte_ethdev_trace_rx_intr_ctl_q;
>>+	__rte_ethdev_trace_rx_intr_ctl_q_get_fd;
>>+	__rte_ethdev_trace_rx_intr_disable;
>>+	__rte_ethdev_trace_rx_intr_enable;
>>+	__rte_ethdev_trace_rx_offload_name;
>>+	__rte_ethdev_trace_rx_queue_start;
>>+	__rte_ethdev_trace_rx_queue_stop;
>>+	__rte_ethdev_trace_set_eeprom;
>>+	__rte_ethdev_trace_set_link_down;
>>+	__rte_ethdev_trace_set_link_up;
>>+	__rte_ethdev_trace_set_mc_addr_list;
>>+	__rte_ethdev_trace_set_ptypes;
>>+	__rte_ethdev_trace_set_rx_queue_stats_mapping;
>>+	__rte_ethdev_trace_set_tx_queue_stats_mapping;
>>+	__rte_ethdev_trace_set_vlan_ether_type;
>>+	__rte_ethdev_trace_set_vlan_offload;
>>+	__rte_ethdev_trace_set_vlan_pvid;
>>+	__rte_ethdev_trace_set_vlan_strip_on_queue;
>>+	__rte_ethdev_trace_socket_id;
>>+	__rte_ethdev_trace_tx_offload_name;
>>+	__rte_ethdev_trace_tx_queue_start;
>>+	__rte_ethdev_trace_tx_queue_stop;
>>+	__rte_ethdev_trace_uc_all_hash_table_set;
>>+	__rte_ethdev_trace_uc_hash_table_set;
>>+	__rte_ethdev_trace_udp_tunnel_port_add;
>>+	__rte_ethdev_trace_udp_tunnel_port_delete;
>>+	__rte_ethdev_trace_vlan_filter;
>>+	__rte_eth_trace_find_next;
>>+	__rte_eth_trace_find_next_of;
>>+	__rte_eth_trace_find_next_owned_by;
>>+	__rte_eth_trace_find_next_sibling;
>>+	__rte_eth_trace_iterator_cleanup;
>>+	__rte_eth_trace_iterator_init;
>>+	__rte_eth_trace_iterator_next;
>>+	__rte_eth_trace_led_off;
>>+	__rte_eth_trace_led_on;
>>+	__rte_eth_trace_link_get;
>>+	__rte_eth_trace_link_get_nowait;
>>+	__rte_eth_trace_macaddr_get;
>>+	__rte_eth_trace_promiscuous_disable;
>>+	__rte_eth_trace_promiscuous_enable;
>>+	__rte_eth_trace_promiscuous_get;
>>+	__rte_eth_trace_remove_rx_callback;
>>+	__rte_eth_trace_remove_tx_callback;
>>+	__rte_eth_trace_rx_burst_mode_get;
>>+	__rte_eth_trace_rx_queue_info_get;
>>+	__rte_eth_trace_rx_queue_setup;
>>+	__rte_eth_trace_set_queue_rate_limit;
>>+	__rte_eth_trace_speed_bitflag;
>>+	__rte_eth_trace_stats_get;
>>+	__rte_eth_trace_stats_reset;
>>+	__rte_eth_trace_timesync_adjust_time;
>>+	__rte_eth_trace_timesync_disable;
>>+	__rte_eth_trace_timesync_enable;
>>+	__rte_eth_trace_timesync_read_rx_timestamp;
>>+	__rte_eth_trace_timesync_read_time;
>>+	__rte_eth_trace_timesync_read_tx_timestamp;
>>+	__rte_eth_trace_timesync_write_time;
>>+	__rte_eth_trace_tx_buffer_count_callback;
>>+	__rte_eth_trace_tx_buffer_drop_callback;
>>+	__rte_eth_trace_tx_buffer_init;
>>+	__rte_eth_trace_tx_buffer_set_err_callback;
>>+	__rte_eth_trace_tx_burst_mode_get;
>>+	__rte_eth_trace_tx_done_cleanup;
>>+	__rte_eth_trace_tx_queue_info_get;
>>+	__rte_eth_trace_xstats_get;
>>+	__rte_eth_trace_xstats_get_by_id;
>>+	__rte_eth_trace_xstats_get_id_by_name;
>>+	__rte_eth_trace_xstats_get_names;
>>+	__rte_eth_trace_xstats_get_names_by_id;
>>+	__rte_eth_trace_xstats_reset;
>>+	__rte_ethdev_trace_owner_delete;
>>+	__rte_ethdev_trace_owner_get;
>>+	__rte_ethdev_trace_owner_new;
>>+	__rte_ethdev_trace_owner_set;
>>+	__rte_ethdev_trace_owner_unset;
>>+	__rte_ethdev_trace_get_module_eeprom;
>>+	__rte_ethdev_trace_get_module_info;
>>+	__rte_ethdev_trace_hairpin_capability_get;
>>+	__rte_eth_trace_rx_hairpin_queue_setup;
>>+	__rte_eth_trace_tx_hairpin_queue_setup;
>>+	__rte_eth_trace_hairpin_bind;
>>+	__rte_eth_trace_hairpin_get_peer_ports;
>>+	__rte_eth_trace_hairpin_unbind;
>>+	__rte_eth_trace_link_speed_to_str;
>>+	__rte_eth_trace_link_to_str;
>>+	__rte_eth_trace_fec_get_capability;
>>+	__rte_eth_trace_fec_get;
>>+	__rte_eth_trace_fec_set;
>>+	__rte_eth_trace_get_monitor_addr;
>>+	__rte_eth_trace_representor_info_get;
>>+	__rte_ethdev_trace_capability_name;
>>+	__rte_ethdev_trace_conf_get;
>>+	__rte_eth_trace_macaddrs_get;
>>+	__rte_eth_trace_rx_metadata_negotiate;
>>+	__rte_ethdev_trace_priority_flow_ctrl_queue_configure;
>>+	__rte_ethdev_trace_priority_flow_ctrl_queue_info_get;
>>+	__rte_ethdev_trace_priv_dump;
>>+	__rte_eth_trace_ip_reassembly_capability_get;
>>+	__rte_eth_trace_ip_reassembly_conf_get;
>>+	__rte_eth_trace_ip_reassembly_conf_set;
>>+	__rte_eth_trace_rx_avail_thresh_query;
>>+	__rte_eth_trace_rx_avail_thresh_set;
>> };
>>--
>>2.28.0
  
Ferruh Yigit Dec. 12, 2022, 6:34 p.m. UTC | #4
On 10/10/2022 7:39 AM, Ankur Dwivedi wrote:
>> Yes the functions you mentioned in previous comment are called in while loop
>> in worker core. So I think they are fastpath.
>> rte_eth_stats_get() is called in fastpath. Similar to rte_eth_macaddr_get(), I
>> think functions like
>> rte_eth_pro miscuous_get(), rte_eth_allmulticast_get() can also be called in
>> fastpath.
>> I am not sure which other functions can be fastpath. Is there a guideline/theme
>> which can be used to determine this?
> [Ankur] I will make the trace call in following functions as fast path trace, considering they are used in while loop in worker core or as rx/tx callback in examples applications.
> rte_eth_tx_buffer_drop_callback
> rte_eth_tx_buffer_count_callback
> rte_eth_tx_done_cleanup
> rte_eth_macaddr_get
> rte_eth_timesync_read_rx_timestamp
> rte_eth_timesync_read_tx_timestamp
> rte_eth_timesync_adjust_time
> rte_eth_timesync_read_time
> rte_eth_timesync_write_time
> rte_eth_stats_get
> rte_flow_get_restore_info
> rte_eth_read_clock
> 
> Please let me know your comments on the patch series.

Hi Ankur,

I agree that tracing should not cause performance degradation, but not
all APIs in your list are for datapath, or for each packet (even called
in datapath in sample app).

I would use fast path trace for following ones, but keep rest regular
trace for rest:

fastpath
 rte_eth_tx_buffer_drop_callback
 rte_eth_tx_buffer_count_callback
 rte_eth_tx_done_cleanup



btw, I am planning to review series today/tomorrow, so please hold a
possible new version for a while.
  
Ferruh Yigit Dec. 12, 2022, 6:38 p.m. UTC | #5
On 10/6/2022 4:18 PM, Ankur Dwivedi wrote:
> diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
> index 3651ceb234..79d0b2ee1f 100644
> --- a/lib/ethdev/version.map
> +++ b/lib/ethdev/version.map
> @@ -319,4 +319,148 @@ INTERNAL {
>         rte_eth_representor_id_get;
>         rte_eth_switch_domain_alloc;
>         rte_eth_switch_domain_free;
> +       __rte_eth_trace_add_first_rx_callback;
> +       __rte_eth_trace_add_rx_callback;
> +       __rte_eth_trace_add_tx_callback;
> +       __rte_eth_trace_allmulticast_disable;


These are not trace functions, but trace point objects, I see this is
common usage in other libraries too, but can you please explain why we
need to export the trace point objects from the .so file?

For some datapath functions, which are static inline functions, trace
point objects are need to be accessible by application, it is OK to
export them, but they are very limited, but I am not clear why exporting
all of them is required.
  
Ferruh Yigit Dec. 13, 2022, 8:06 p.m. UTC | #6
On 10/6/2022 4:18 PM, Ankur Dwivedi wrote:

Hi Ankur, Jerin,

I have some major questions, I can see some already queried by Andrew as
well:

1) How flexible are we on changing trace log output?
Should we take trace log as kind of user interface and don't break it
(as much as possible)? Or is it OK to change whenever we want?


2) What is the main purpose of the trace library.
Is it to record type and frequency of the calls? Or is it to log values
and state of the device/driver after each call?
This can guide us to decide
- which values to record (should record only pointers or values of structs)
- if to record API return values and failure paths
- if to add tracing all APIs or not, like
'rte_eth_dev_rx_offload_name()' kind of helper function that converts
offload to a string, which doesn't have any functional impact, or
'rte_eth_speed_bitflag()', and many more...


3) What is the runtime impact.
As far as I can see some values copied and some memory is used for this
support, even user is not interested in tracing. For control path APIs
we can ignore the additional cost by memcpy, but how big memory
requirement is?


4) Why we need to export trace point variables in the .map files,
like '__rte_eth_trace_allmulticast_disable' one...



5) (bonus Q) Can we have an 'rte_trace_point_emit_xx()' function to
record mac address (struct rte_ether_addr) as string?
And maybe another set for array types?


There are bunch of small comments inline, some are related to above
highlevel question.
But I stopped after some point, specifically after
'rte_eth_trace_timesync_adjust_time()' :), this is a big file, splitting
it may help reviewers.

> 
> Add trace points for ethdev functions.
> 
> Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>

<...>

> +RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_burst_mode_get,
> +       lib.ethdev.rx_burst_mode_get)
> +

Tx counterpart of this API is missing.

> +RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_queue_info_get,
> +       lib.ethdev.rx_queue_info_get)
> +
> +RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_queue_setup,
> +       lib.ethdev.rx_queue_setup)
> +

! rte_eth_trace_rx_queue_setup() is not called.

And Tx counterpart of this API is missing, these are important APIs, we
should have them.

<...>

> @@ -331,6 +336,7 @@ rte_eth_find_next(uint16_t port_id)
>         if (port_id >= RTE_MAX_ETHPORTS)
>                 return RTE_MAX_ETHPORTS;
> 
> +       rte_eth_trace_find_next(port_id);


For the output 'port_id', trace function is after "return
RTE_MAX_ETHPORTS;", so "there is no next port" case is ignored, need to
update function to get trace on each call.

<...>

> @@ -636,6 +656,7 @@ rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id)
>         RTE_ETH_FOREACH_VALID_DEV(pid)
>                 if (!strcmp(name, eth_dev_shared_data->data[pid].name)) {
>                         *port_id = pid;
> +                       rte_ethdev_trace_get_port_by_name(name, *port_id);


This completely ignores the path that not able to find port_id from name.

What about change the function as

```
ret = -ENODEV;
*port_id = RTE_MAX_ETHPORTS;

RTE_ETH_FOREACH_VALID_DEV(pid)
  if (!strcmp())
    *port_id = pid;
    ret = 0;
    break;

rte_ethdev_trace_get_port_by_name(name, *port_id, ret);

return ret;
```

>                         return 0;
>                 }
> 
> @@ -737,6 +758,7 @@ rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id)
>                 return 0;
>         }
> 
> +       rte_ethdev_trace_rx_queue_start(port_id, rx_queue_id);

Please include return value.

>         return eth_err(port_id, dev->dev_ops->rx_queue_start(dev, rx_queue_id));
>  }
> 
> @@ -770,6 +792,7 @@ rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id)
>                 return 0;
>         }
> 
> +       rte_ethdev_trace_rx_queue_stop(port_id, rx_queue_id);

Please include return value.

>         return eth_err(port_id, dev->dev_ops->rx_queue_stop(dev, rx_queue_id));
>  }
> 
> @@ -810,6 +833,7 @@ rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id)
>                 return 0;
>         }
> 
> +       rte_ethdev_trace_tx_queue_start(port_id, tx_queue_id);

Please include return value.

>         return eth_err(port_id, dev->dev_ops->tx_queue_start(dev, tx_queue_id));
>  }
> 
> @@ -843,12 +867,14 @@ rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id)
>                 return 0;
>         }
> 
> +       rte_ethdev_trace_tx_queue_stop(port_id, tx_queue_id);

Please include return value.

>         return eth_err(port_id, dev->dev_ops->tx_queue_stop(dev, tx_queue_id));
>  }
> 
>  uint32_t
>  rte_eth_speed_bitflag(uint32_t speed, int duplex)
>  {
> +       rte_eth_trace_speed_bitflag(speed, duplex);

I think this should have return value, but I can see this requires
change in the function.

I am for either having return value or drop the tracing of this function
completely.

<...>

> @@ -1552,6 +1581,7 @@ rte_eth_dev_set_link_up(uint16_t port_id)
> 
>         if (*dev->dev_ops->dev_set_link_up == NULL)
>                 return -ENOTSUP;
> +       rte_ethdev_trace_set_link_up(port_id);

Please include return value.

>         return eth_err(port_id, (*dev->dev_ops->dev_set_link_up)(dev));
>  }
> 
> @@ -1565,6 +1595,7 @@ rte_eth_dev_set_link_down(uint16_t port_id)
> 
>         if (*dev->dev_ops->dev_set_link_down == NULL)
>                 return -ENOTSUP;
> +       rte_ethdev_trace_set_link_down(port_id);

Please include return value.

<...>

> @@ -2327,6 +2371,7 @@ rte_eth_promiscuous_enable(uint16_t port_id)
>         diag = (*dev->dev_ops->promiscuous_enable)(dev);
>         dev->data->promiscuous = (diag == 0) ? 1 : 0;
> 
> +       rte_eth_trace_promiscuous_enable(port_id, dev->data->promiscuous);

Above is good, but to be consistent what about returning return value of
the API (diag (with record name 'return')), which is relavent with
'dev->data->promiscuous' value.

>         return eth_err(port_id, diag);
>  }
> 
> @@ -2350,6 +2395,7 @@ rte_eth_promiscuous_disable(uint16_t port_id)
>         if (diag != 0)
>                 dev->data->promiscuous = 1;
> 
> +       rte_eth_trace_promiscuous_disable(port_id, dev->data->promiscuous);

Above is good, but to be consistent what about returning return value of
the API (diag (with record name 'return')), which is relavent with
'dev->data->promiscuous' value.

<...>

> @@ -2561,6 +2616,7 @@ rte_eth_stats_reset(uint16_t port_id)
> 
>         dev->data->rx_mbuf_alloc_failed = 0;
> 
> +       rte_eth_trace_stats_reset(port_id);

Please include return value.

<...>

> @@ -3483,6 +3561,7 @@ rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
> 
>         if (*dev->dev_ops->vlan_strip_queue_set == NULL)
>                 return -ENOTSUP;
> +       rte_ethdev_trace_set_vlan_strip_on_queue(port_id, rx_queue_id, on);

Please include return value.

>         (*dev->dev_ops->vlan_strip_queue_set)(dev, rx_queue_id, on);
> 
>         return 0;
> @@ -3500,6 +3579,7 @@ rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
> 
>         if (*dev->dev_ops->vlan_tpid_set == NULL)
>                 return -ENOTSUP;
> +       rte_ethdev_trace_set_vlan_ether_type(port_id, vlan_type, tpid);

Please include return value.

<...>

> @@ -3632,6 +3714,7 @@ rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on)
> 
>         if (*dev->dev_ops->vlan_pvid_set == NULL)
>                 return -ENOTSUP;
> +       rte_ethdev_trace_set_vlan_pvid(port_id, pvid, on);

Please include return value.

<...>

> @@ -3702,6 +3787,7 @@ rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
>                 return -EINVAL;
>         }
> 
> +       rte_ethdev_trace_priority_flow_ctrl_set(port_id, pfc_conf);

Please put the call very bottom of the function and include return value.

<...>

> @@ -4063,6 +4156,7 @@ rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
> 
>         if (*dev->dev_ops->udp_tunnel_port_add == NULL)
>                 return -ENOTSUP;
> +       rte_ethdev_trace_udp_tunnel_port_add(port_id, udp_tunnel);

Please include return value.

>         return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_add)(dev,
>                                                                 udp_tunnel));
>  }
> @@ -4090,6 +4184,7 @@ rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
> 
>         if (*dev->dev_ops->udp_tunnel_port_del == NULL)
>                 return -ENOTSUP;
> +       rte_ethdev_trace_udp_tunnel_port_delete(port_id, udp_tunnel);

Please include return value.

>         return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_del)(dev,
>                                                                 udp_tunnel));
>  }
> @@ -4104,6 +4199,7 @@ rte_eth_led_on(uint16_t port_id)
> 
>         if (*dev->dev_ops->dev_led_on == NULL)
>                 return -ENOTSUP;
> +       rte_eth_trace_led_on(port_id);

Please include return value.

>         return eth_err(port_id, (*dev->dev_ops->dev_led_on)(dev));
>  }
> 
> @@ -4117,6 +4213,7 @@ rte_eth_led_off(uint16_t port_id)
> 
>         if (*dev->dev_ops->dev_led_off == NULL)
>                 return -ENOTSUP;
> +       rte_eth_trace_led_off(port_id);

Please include return value.

<...>

> @@ -4294,6 +4395,7 @@ rte_eth_dev_mac_addr_remove(uint16_t port_id, struct rte_ether_addr *addr)
>         } else if (index < 0)
>                 return 0;  /* Do nothing if address wasn't found */
> 
> +       rte_ethdev_trace_mac_addr_remove(port_id, addr);

better to keep trace APIs are last thing in the function for
consistency, as long as it is possible, and for this case it is possible.

<...>

> @@ -4438,6 +4542,7 @@ rte_eth_dev_uc_all_hash_table_set(uint16_t port_id, uint8_t on)
> 
>         if (*dev->dev_ops->uc_all_hash_table_set == NULL)
>                 return -ENOTSUP;
> +       rte_ethdev_trace_uc_all_hash_table_set(port_id, on);

Please include return value.

>         return eth_err(port_id, (*dev->dev_ops->uc_all_hash_table_set)(dev,
>                                                                        on));
>  }
> @@ -4475,6 +4580,7 @@ int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
> 
>         if (*dev->dev_ops->set_queue_rate_limit == NULL)
>                 return -ENOTSUP;
> +       rte_eth_trace_set_queue_rate_limit(port_id, queue_idx, tx_rate);

Please include return value.

<...>

> @@ -4570,6 +4678,9 @@ rte_eth_dev_callback_register(uint16_t port_id,
>                 next_port = last_port = port_id;
>         }
> 
> +       rte_ethdev_trace_callback_register(port_id, event, cb_fn, cb_arg, next_port,
> +                                          last_port);
> +

I assume this added into middle to be able to use 'next_port' &
'last_port', but they are generated from given 'port_id', so what do you
think to have only 'port_id', and move call to the bottom of the function.

'rte_ethdev_trace_callback_unregister()' has same logic, and it has only
'port_id' already.



And I think better to standardise to record API return value or not,
because some has it, some don't.
What do you think to trace all return values, is there any downside of
this approach?

If we need fine grain on recording return values, what about following:
- All API that changes device config return values should be recorded
  * like, record return for set_mtu(), but ignore it for get_mtu()
- If return value has not API status but useful information, record it
  * like rte_eth_dev_is_valid_port() return value


>         rte_spinlock_lock(&eth_dev_cb_lock);
> 
>         do {
> @@ -4665,6 +4776,7 @@ rte_eth_dev_callback_unregister(uint16_t port_id,
>         } while (++next_port <= last_port);
> 
>         rte_spinlock_unlock(&eth_dev_cb_lock);
> +       rte_ethdev_trace_callback_unregister(port_id, event, cb_fn, cb_arg, ret);

Just a syntax comment, what do you think to have an empty line one
before and after the trace call, to separate this trace calls from
regular logic.

>         return ret;
>  }
> 
> @@ -4694,6 +4806,7 @@ rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
>         for (qid = 0; qid < dev->data->nb_rx_queues; qid++) {
>                 vec = rte_intr_vec_list_index_get(intr_handle, qid);
>                 rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
> +               rte_ethdev_trace_rx_intr_ctl(port_id, epfd, op, data, rc);

Why this is in the for loop, API if for port level, this loop iterates
on queues?
What about moving this trace to the bottom of the function, and record
return value as return value of the API?

>                 if (rc && rc != -EEXIST) {
>                         RTE_ETHDEV_LOG(ERR,
>                                 "p %u q %u Rx ctl error op %d epfd %d vec %u\n",
> @@ -4737,6 +4850,7 @@ rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id)
>                 (vec - RTE_INTR_VEC_RXTX_OFFSET) : vec;
>         fd = rte_intr_efds_index_get(intr_handle, efd_idx);
> 
> +       rte_ethdev_trace_rx_intr_ctl_q_get_fd(port_id, queue_id, fd);
>         return fd;
>  }
> 
> @@ -4770,6 +4884,7 @@ rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
> 
>         vec = rte_intr_vec_list_index_get(intr_handle, queue_id);
>         rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
> +       rte_ethdev_trace_rx_intr_ctl_q(port_id, queue_id, epfd, op, data, rc);

Instead of trace API having in the middle, what about changing API as:

```
rc = ...

if (rc && rc != -EEXIST) {
	...
}

rte_ethdev_trace_rx_intr_ctl_q(port_id, queue_id, epfd, op, data, rc);

return rc;
```

>         if (rc && rc != -EEXIST) {
>                 RTE_ETHDEV_LOG(ERR,
>                         "p %u q %u Rx ctl error op %d epfd %d vec %u\n",
> @@ -4796,6 +4911,7 @@ rte_eth_dev_rx_intr_enable(uint16_t port_id,
> 
>         if (*dev->dev_ops->rx_queue_intr_enable == NULL)
>                 return -ENOTSUP;
> +       rte_ethdev_trace_rx_intr_enable(port_id, queue_id);

Please include return value.

>         return eth_err(port_id, (*dev->dev_ops->rx_queue_intr_enable)(dev, queue_id));
>  }
> 
> @@ -4815,6 +4931,7 @@ rte_eth_dev_rx_intr_disable(uint16_t port_id,
> 
>         if (*dev->dev_ops->rx_queue_intr_disable == NULL)
>                 return -ENOTSUP;
> +       rte_ethdev_trace_rx_intr_disable(port_id, queue_id);

Please include return value.

<...>

> @@ -5447,6 +5586,7 @@ rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
> 
>         if (*dev->dev_ops->set_eeprom == NULL)
>                 return -ENOTSUP;
> +       rte_ethdev_trace_set_eeprom(port_id, info);

Please include return value.

<...>

> @@ -5562,6 +5705,7 @@ rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
>         if (nb_tx_desc != NULL)
>                 eth_dev_adjust_nb_desc(nb_tx_desc, &dev_info.tx_desc_lim);
> 
> +       rte_ethdev_trace_adjust_nb_rx_tx_desc(port_id, *nb_rx_desc, *nb_rx_desc);


'nb_rx_desc' or 'nb_rx_desc' can be NULL, so we can't directly access them.

<...>

> @@ -5605,6 +5750,7 @@ rte_eth_dev_pool_ops_supported(uint16_t port_id, const char *pool)
>         if (*dev->dev_ops->pool_ops_supported == NULL)
>                 return 1; /* all pools are supported */
> 
> +       rte_ethdev_trace_pool_ops_supported(port_id, pool);

Please include return value.

<...>

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_flow_ctrl_get,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_fc_conf *fc_conf),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(fc_conf);
> +)

'fc_conf' is pointer for the config struct, its address is not much
useful, can you expand it similar to ones in
'rte_ethdev_trace_flow_ctrl_set()' API?

> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_flow_ctrl_set,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_fc_conf *fc_conf),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_u32(fc_conf->high_water);
> +       rte_trace_point_emit_u32(fc_conf->low_water);
> +       rte_trace_point_emit_u16(fc_conf->pause_time);
> +       rte_trace_point_emit_u16(fc_conf->send_xon);
> +       rte_trace_point_emit_int(fc_conf->mode);
> +       rte_trace_point_emit_u8(fc_conf->mac_ctrl_frame_fwd);
> +       rte_trace_point_emit_u8(fc_conf->autoneg);
> +)
> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_fw_version_get,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, char *fw_version, size_t fw_size),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(fw_version);
> +       rte_trace_point_emit_size_t(fw_size);
> +)

'fw_version' is string, it help to display the string, but not sure if
the pointer value has a value.
Is there a way to display string in the trace point?
And 'fw_size' is normally just used to know the valid data in the
'fw_version', when 'fw_version' string is displayed, not sure if there
is a value to have 'fw_size'

> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_get_dcb_info,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_dcb_info *dcb_info),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(dcb_info);
> +)

'dcb_info' is pointer to a info struct, not useful as pointer value, we
should display content of the 'dcb_info' struct.
There are arrays in the 'dcb_info', perhaps it can be possible to trace
'dcb_info->nb_tcs', also 'dcb_info->prio_tc[]' & 'dcb_info->tc_bws[]'
since their size is small (8).

> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_get_eeprom,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_dev_eeprom_info *info),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(info);
> +)
> +

Similarly, content of the 'info' should be displayed, for '*data' it can
be possible to display address of it, but values for rest.

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_get_eeprom_length,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id),
> +       rte_trace_point_emit_u16(port_id);
> +)
> +

This should return the size of the eeprom, existing
'rte_eth_dev_get_eeprom_length()' needs to be updated for it.

<...>

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_get_reg_info,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_dev_reg_info *info),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(info);
> +)

What do you think to display content of the 'info', insted of pointer
value which is not very useful.

> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_get_sec_ctx,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id),
> +       rte_trace_point_emit_u16(port_id);
> +)

'security_ctx' is "void *", so can't record content, but what do you
think to record pointer value of it?

> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_get_supported_ptypes,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t ptype_mask,
> +               uint32_t *ptypes, int num, int j),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_u32(ptype_mask);
> +       rte_trace_point_emit_ptr(ptypes);
> +       rte_trace_point_emit_int(num);
> +       rte_trace_point_emit_int(j);
> +)

better to use 'supported_num' instead of 'j' which is not clear what it is.

The real information is in 'ptypes' but that is an array, I guess not
possible to record array values.

> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_get_vlan_offload,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_int(ret);
> +)
> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_info_get,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id,
> +               struct rte_eth_dev_info *dev_info),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_string(dev_info->driver_name);
> +       rte_trace_point_emit_u32(dev_info->if_index);
> +       rte_trace_point_emit_u16(dev_info->min_mtu);
> +       rte_trace_point_emit_u16(dev_info->max_mtu);
> +       rte_trace_point_emit_u32(dev_info->min_rx_bufsize);
> +       rte_trace_point_emit_u32(dev_info->max_rx_pktlen);
> +       rte_trace_point_emit_u64(dev_info->rx_offload_capa);
> +       rte_trace_point_emit_u64(dev_info->tx_offload_capa);
> +       rte_trace_point_emit_u64(dev_info->rx_queue_offload_capa);
> +       rte_trace_point_emit_u64(dev_info->tx_queue_offload_capa);
> +       rte_trace_point_emit_u16(dev_info->reta_size);
> +       rte_trace_point_emit_u8(dev_info->hash_key_size);
> +       rte_trace_point_emit_u16(dev_info->nb_rx_queues);
> +       rte_trace_point_emit_u16(dev_info->nb_tx_queues);
> +)
> +

It is a debate what to display, but I would remove 'if_index' and add
'max_rx_queues', 'max_tx_queues', 'max_mac_addrs',
'flow_type_rss_offloads', 'rx_desc_lim', 'tx_desc_lim', 'speed_capa',
'dev_capa'.

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_is_removed,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_int(ret);
> +)
> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_is_valid_port,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id),
> +       rte_trace_point_emit_u16(port_id);
> +)
> +

Should have return value, if the port is valid of not.

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_mac_addr_add,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *addr,
> +               uint32_t pool),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(addr);
> +       rte_trace_point_emit_u32(pool);
> +)
> +

Isn't it possible to return 'addr' as string? I am not sure about
benefit to record addr pointer value.
Should have return value.

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_mac_addr_remove,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *addr),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(addr);
> +)
> +

As above, can content of 'addr' be recorded, like as string?

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_pool_ops_supported,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, const char *pool),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(pool);
> +)
> +

'pool' should be string, instead of pointer.

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_priority_flow_ctrl_set,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_pfc_conf *pfc_conf),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_u32(pfc_conf->fc.high_water);
> +       rte_trace_point_emit_u32(pfc_conf->fc.low_water);
> +       rte_trace_point_emit_u16(pfc_conf->fc.pause_time);
> +       rte_trace_point_emit_u16(pfc_conf->fc.send_xon);
> +       rte_trace_point_emit_int(pfc_conf->fc.mode);
> +       rte_trace_point_emit_u8(pfc_conf->fc.mac_ctrl_frame_fwd);
> +       rte_trace_point_emit_u8(pfc_conf->fc.autoneg);
> +       rte_trace_point_emit_u8(pfc_conf->priority);
> +)
> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_reset,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_int(ret);
> +)
> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_rss_hash_conf_get,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_rss_conf *rss_conf),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(rss_conf);
> +)
> +

Please record content of the 'rss_conf' instead of pointer value.

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_rss_hash_update,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_rss_conf *rss_conf),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(rss_conf->rss_key);
> +       rte_trace_point_emit_u8(rss_conf->rss_key_len);
> +       rte_trace_point_emit_u64(rss_conf->rss_hf);
> +)
> +

Please add return value.

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_rss_reta_query,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id,
> +               struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(reta_conf);
> +       rte_trace_point_emit_u16(reta_size);
> +)
> +
> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_rss_reta_update,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id,
> +               struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_u64(reta_conf->mask);
> +       rte_trace_point_emit_u16(reta_size);
> +)

'reta_conf->mask' on its own is not much usefull, and 'reta_conf->reta'
is an array and hard to record.
As above 'rte_ethdev_trace_rss_reta_query' trace point only record
reta_config pointer, this can do the same.

Overall, I think better to make get/set pair of an API record same set
of values.

<...>

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_set_mc_addr_list,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id,
> +               struct rte_ether_addr *mc_addr_set,
> +               uint32_t nb_mc_addr),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(mc_addr_set);
> +       rte_trace_point_emit_u32(nb_mc_addr);
> +)
> +

Better to record content of 'mc_addr_set' but it is pointer array for
mac address, so I guess we can't record these mac addresses.

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_set_ptypes,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t ptype_mask,
> +               uint32_t *set_ptypes, unsigned int num),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_u32(ptype_mask);
> +       rte_trace_point_emit_ptr(set_ptypes);
> +       rte_trace_point_emit_u32(num);
> +)
> +

Similarly 'set_ptypes' is an array.

I wonder if there should be an rte_trace_point_emit_ function for
arrays? What do you think?

<...>

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_socket_id,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id),
> +       rte_trace_point_emit_u16(port_id);
> +)

Should include 'socket_id'.

<...>

> +RTE_TRACE_POINT(
> +       rte_ethdev_trace_uc_hash_table_set,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *addr,
> +               uint8_t on, int ret),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(addr);
> +       rte_trace_point_emit_u8(on);
> +       rte_trace_point_emit_int(ret);
> +)
> +

Can have 'addr' as string?
Do we need a specific rte_trace_point_emit_ function for mac addr?

<...>

> +RTE_TRACE_POINT(
> +       rte_eth_trace_find_next,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id),
> +       rte_trace_point_emit_u16(port_id);
> +)
> +

rte_eth_trace_find_next* functions gets 'port_id' as input parameter,
and returns next 'port_id', so both input and output is 'port_id' and
both should be recorded.

For this need to update these functions to create an interim variable
for input 'port_id'.

Above comments are for all 'rte_eth_trace_find_next*()' functions.

<...>

> +RTE_TRACE_POINT(
> +       rte_eth_trace_link_get,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_link *link),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_u32(link->link_speed);
> +)

I think better to record other link values too.

> +
> +RTE_TRACE_POINT(
> +       rte_eth_trace_link_get_nowait,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_link *link),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_u32(link->link_speed);
> +)
> +

I think better to record other link values too.

<...>

> +RTE_TRACE_POINT(
> +       rte_eth_trace_rx_burst_mode_get,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
> +               struct rte_eth_burst_mode *mode),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_u16(queue_id);
> +       rte_trace_point_emit_ptr(mode);
> +)
> +

Can you please record content of 'mode' inst

> +RTE_TRACE_POINT(
> +       rte_eth_trace_rx_queue_info_get,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
> +               struct rte_eth_rxq_info *qinfo),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_u16(queue_id);
> +       rte_trace_point_emit_ptr(qinfo->mp);
> +       rte_trace_point_emit_u8(qinfo->scattered_rx);
> +       rte_trace_point_emit_u8(qinfo->queue_state);
> +       rte_trace_point_emit_u16(qinfo->nb_desc);
> +       rte_trace_point_emit_u16(qinfo->rx_buf_size);
> +)
> +

Can you please add 'qinfo->conf->rx_drop_en' & 'qinfo->conf->offloads'.


> +RTE_TRACE_POINT(
> +       rte_eth_trace_rx_queue_setup,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
> +               uint16_t nb_rx_desc, unsigned int socket_id,
> +               const struct rte_eth_rxconf *rx_conf,
> +               struct rte_mempool *mb_pool),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_u16(rx_queue_id);
> +       rte_trace_point_emit_u16(nb_rx_desc);
> +       rte_trace_point_emit_u32(socket_id);
> +       rte_trace_point_emit_ptr(rx_conf);
> +       rte_trace_point_emit_ptr(mb_pool);
> +)
> +

Can you please add 'rx_conf->rx_drop_en' & 'rx_conf->offloads'.

> +RTE_TRACE_POINT(
> +       rte_eth_trace_set_queue_rate_limit,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_idx,
> +               uint16_t tx_rate),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_u16(queue_idx);
> +       rte_trace_point_emit_u16(tx_rate);
> +)
> +
> +RTE_TRACE_POINT(
> +       rte_eth_trace_speed_bitflag,
> +       RTE_TRACE_POINT_ARGS(uint32_t speed, int duplex),
> +       rte_trace_point_emit_u32(speed);
> +       rte_trace_point_emit_int(duplex);
> +)
> +
> +RTE_TRACE_POINT(
> +       rte_eth_trace_stats_get,
> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_stats *stats),
> +       rte_trace_point_emit_u16(port_id);
> +       rte_trace_point_emit_ptr(stats);
> +       rte_trace_point_emit_u64(stats->rx_nombuf);
> +)
> +

Not sure what to record here, I think all basic stat counters can be
recorded if there cost is effordable.
  
David Marchand Dec. 14, 2022, 10:34 a.m. UTC | #7
On Mon, Dec 12, 2022 at 7:38 PM Ferruh Yigit <ferruh.yigit@amd.com> wrote:
>
> On 10/6/2022 4:18 PM, Ankur Dwivedi wrote:
> > diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
> > index 3651ceb234..79d0b2ee1f 100644
> > --- a/lib/ethdev/version.map
> > +++ b/lib/ethdev/version.map
> > @@ -319,4 +319,148 @@ INTERNAL {
> >         rte_eth_representor_id_get;
> >         rte_eth_switch_domain_alloc;
> >         rte_eth_switch_domain_free;
> > +       __rte_eth_trace_add_first_rx_callback;
> > +       __rte_eth_trace_add_rx_callback;
> > +       __rte_eth_trace_add_tx_callback;
> > +       __rte_eth_trace_allmulticast_disable;
>
>
> These are not trace functions, but trace point objects, I see this is
> common usage in other libraries too, but can you please explain why we
> need to export the trace point objects from the .so file?
>
> For some datapath functions, which are static inline functions, trace
> point objects are need to be accessible by application, it is OK to
> export them, but they are very limited, but I am not clear why exporting
> all of them is required.

There should be no need to export them.
The only usage I can think of is when calling a tracepoint from a
public inline helper.
  
Jerin Jacob Dec. 14, 2022, 10:40 a.m. UTC | #8
On Wed, Dec 14, 2022 at 1:37 AM Ferruh Yigit <ferruh.yigit@amd.com> wrote:
>
> On 10/6/2022 4:18 PM, Ankur Dwivedi wrote:
>
> Hi Ankur, Jerin,

Hi Ferruh, Please find answers to generic trace questions.

>
> I have some major questions, I can see some already queried by Andrew as
> well:
>
> 1) How flexible are we on changing trace log output?
> Should we take trace log as kind of user interface and don't break it
> (as much as possible)? Or is it OK to change whenever we want?

If you see https://doc.dpdk.org/guides/prog_guide/trace_lib.html
"Section: 6.9.3. Trace memory layout", Currently, we defined packet.header,
packet.context, trace.header as minimum as required. It can be
extended if needed.
Trace payload is not fixed, it is created based on arguments of RTE_TRACE_POINT.

>
>
> 2) What is the main purpose of the trace library.
> Is it to record type and frequency of the calls? Or is it to log values
> and state of the device/driver after each call?

From the framework POV, it can be used for both.
I think, as first step, we can emit the traces for public DPDK APIs
with return type of each API.

> This can guide us to decide
> - which values to record (should record only pointers or values of structs)
> - if to record API return values and failure paths
> - if to add tracing all APIs or not, like
> 'rte_eth_dev_rx_offload_name()' kind of helper function that converts
> offload to a string, which doesn't have any functional impact, or
> 'rte_eth_speed_bitflag()', and many more...
>
>
> 3) What is the runtime impact.

Profiling overhead is one cycle. i.e. RTE_TRACE_POINT is added, and it
is disabled at runtime.
For RTE_TRACE_POINT_FP it is zero if it is not enabled at compile time.


> As far as I can see some values copied and some memory is used for this
> support, even user is not interested in tracing. For control path APIs
> we can ignore the additional cost by memcpy, but how big memory
> requirement is?

Currently, per core/thread 1MB trace buffer is created as default. The
size can be overridden via EAL command line argument.
See __rte_trace_mem_per_thread_alloc().
If you see https://doc.dpdk.org/guides/prog_guide/trace_lib.html
section "6.5. Event record mode", it has two modes
Overwrite - When the trace buffer is full, new trace events overwrites
the existing captured events in the trace buffer.
Discard - When the trace buffer is full, new trace events will be discarded.

>
>
> 4) Why we need to export trace point variables in the .map files,
> like '__rte_eth_trace_allmulticast_disable' one...

If you see app/test/test_trace.c example

There are two-way to operate on trace point, We need to export symbol
iff we need option 1

option1:
rte_trace_point_enable(&__app_dpdk_test_tp);

option2:
rte_trace_point_t *trace = rte_trace_point_lookup("app.dpdk.test.tp");
rte_trace_point_enable(trace);


>
>
>
> 5) (bonus Q) Can we have an 'rte_trace_point_emit_xx()' function to
> record mac address (struct rte_ether_addr) as string?
> And maybe another set for array types?

Yes it possible and better to add rte_trace_pint_emit_,mac() or so.


>
>
> There are bunch of small comments inline, some are related to above
> highlevel question.
> But I stopped after some point, specifically after
> 'rte_eth_trace_timesync_adjust_time()' :), this is a big file, splitting
> it may help reviewers.
>
  
Ferruh Yigit Dec. 14, 2022, 11:04 a.m. UTC | #9
On 12/14/2022 10:34 AM, David Marchand wrote:
> On Mon, Dec 12, 2022 at 7:38 PM Ferruh Yigit <ferruh.yigit@amd.com> wrote:
>>
>> On 10/6/2022 4:18 PM, Ankur Dwivedi wrote:
>>> diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
>>> index 3651ceb234..79d0b2ee1f 100644
>>> --- a/lib/ethdev/version.map
>>> +++ b/lib/ethdev/version.map
>>> @@ -319,4 +319,148 @@ INTERNAL {
>>>         rte_eth_representor_id_get;
>>>         rte_eth_switch_domain_alloc;
>>>         rte_eth_switch_domain_free;
>>> +       __rte_eth_trace_add_first_rx_callback;
>>> +       __rte_eth_trace_add_rx_callback;
>>> +       __rte_eth_trace_add_tx_callback;
>>> +       __rte_eth_trace_allmulticast_disable;
>>
>>
>> These are not trace functions, but trace point objects, I see this is
>> common usage in other libraries too, but can you please explain why we
>> need to export the trace point objects from the .so file?
>>
>> For some datapath functions, which are static inline functions, trace
>> point objects are need to be accessible by application, it is OK to
>> export them, but they are very limited, but I am not clear why exporting
>> all of them is required.
> 
> There should be no need to export them.
> The only usage I can think of is when calling a tracepoint from a
> public inline helper.
> 

Like '__rte_ethdev_trace_rx_burst' & '__rte_ethdev_trace_tx_burst',
which are used by 'rte_eth_rx_burst()' & 'rte_eth_tx_burst()' static
inline functions.
  
Ferruh Yigit Dec. 14, 2022, 12:10 p.m. UTC | #10
On 12/14/2022 10:40 AM, Jerin Jacob wrote:
> On Wed, Dec 14, 2022 at 1:37 AM Ferruh Yigit <ferruh.yigit@amd.com> wrote:
>>
>> On 10/6/2022 4:18 PM, Ankur Dwivedi wrote:
>>
>> Hi Ankur, Jerin,
> 
> Hi Ferruh, Please find answers to generic trace questions.
> 
>>
>> I have some major questions, I can see some already queried by Andrew as
>> well:
>>
>> 1) How flexible are we on changing trace log output?
>> Should we take trace log as kind of user interface and don't break it
>> (as much as possible)? Or is it OK to change whenever we want?
> 
> If you see https://doc.dpdk.org/guides/prog_guide/trace_lib.html
> "Section: 6.9.3. Trace memory layout", Currently, we defined packet.header,
> packet.context, trace.header as minimum as required. It can be
> extended if needed.
> Trace payload is not fixed, it is created based on arguments of RTE_TRACE_POINT.
> 

I am aware payload is not fixed technically, but my concern is from user
perspective.

Lets get 'rte_ethdev_trace_info_get' as example, right now it records
'dev_info->if_index', if we remove it in next release, will it impact
the users?
Or if we start recording 'dev_info->max_rx_queues' in another release,
it will change order of fields in output, will it impact the user?

If changing payload doesn't impact user, we can accept changes easier
since we can tweak them as needed without user impact.
But if the target is to stick to the payload layout as much as possible,
we should be more careful before we finalize it.

I am trying to understand how strict to be in accepting trace point patches.

>>
>>
>> 2) What is the main purpose of the trace library.
>> Is it to record type and frequency of the calls? Or is it to log values
>> and state of the device/driver after each call?
> 
> From the framework POV, it can be used for both.
> I think, as first step, we can emit the traces for public DPDK APIs
> with return type of each API.
> 

Most of the trace point records only on success path, and not record at
all when there is a failure in the API, that is why I think trace can't
completely replace the logging.

But trace may be useful to analysis a functioning system for performance
issues, overall system analysis, or unexpected behaviors.
In that case I am not sure how much detail to record in trace.

Because recording more fields comes with additional runtime cost and
memory cost, right? Also useless records can be noise in the trace output.

OK to record return values but I don't know if it may be misleading
because in some of the failure path trace functions not called at all,
so recorded failures will be subset of the overall failures.
BTW, I don't think that we should record all failures in trace log, that
will create to much noise in the code.

>> This can guide us to decide
>> - which values to record (should record only pointers or values of structs)
>> - if to record API return values and failure paths
>> - if to add tracing all APIs or not, like
>> 'rte_eth_dev_rx_offload_name()' kind of helper function that converts
>> offload to a string, which doesn't have any functional impact, or
>> 'rte_eth_speed_bitflag()', and many more...
>>
>>
>> 3) What is the runtime impact.
> 
> Profiling overhead is one cycle. i.e. RTE_TRACE_POINT is added, and it
> is disabled at runtime.

Got it, there is '__RTE_TRACE_FIELD_ENABLE_MASK' check, and this is the
only cost when trace is disabled.

> For RTE_TRACE_POINT_FP it is zero if it is not enabled at compile time.
> 

ack

> 
>> As far as I can see some values copied and some memory is used for this
>> support, even user is not interested in tracing. For control path APIs
>> we can ignore the additional cost by memcpy, but how big memory
>> requirement is?
> 
> Currently, per core/thread 1MB trace buffer is created as default. The
> size can be overridden via EAL command line argument.
> See __rte_trace_mem_per_thread_alloc().
> If you see https://doc.dpdk.org/guides/prog_guide/trace_lib.html
> section "6.5. Event record mode", it has two modes
> Overwrite - When the trace buffer is full, new trace events overwrites
> the existing captured events in the trace buffer.
> Discard - When the trace buffer is full, new trace events will be discarded.
> 

OK, default 1M buffer doesn't look something to worry about.

>>
>>
>> 4) Why we need to export trace point variables in the .map files,
>> like '__rte_eth_trace_allmulticast_disable' one...
> 
> If you see app/test/test_trace.c example
> 
> There are two-way to operate on trace point, We need to export symbol
> iff we need option 1
> 
> option1:
> rte_trace_point_enable(&__app_dpdk_test_tp);
> 
> option2:
> rte_trace_point_t *trace = rte_trace_point_lookup("app.dpdk.test.tp");
> rte_trace_point_enable(trace);
> 

got it, do we really need direct access to trace point (option 1), I
would be OK to remove that option to not expose all these trace point
objects.

> 
>>
>>
>>
>> 5) (bonus Q) Can we have an 'rte_trace_point_emit_xx()' function to
>> record mac address (struct rte_ether_addr) as string?
>> And maybe another set for array types?
> 
> Yes it possible and better to add rte_trace_pint_emit_,mac() or so.
> 

Thanks.

> 
>>
>>
>> There are bunch of small comments inline, some are related to above
>> highlevel question.
>> But I stopped after some point, specifically after
>> 'rte_eth_trace_timesync_adjust_time()' :), this is a big file, splitting
>> it may help reviewers.
>>
  
Ankur Dwivedi Dec. 14, 2022, 1:52 p.m. UTC | #11
Hi Ferruh,

Thanks a lot for reviewing this patch. The generic questions have been answered by Jerin in earlier email. I have replied inline to the remaining comments.
>
>There are bunch of small comments inline, some are related to above highlevel
>question.
>But I stopped after some point, specifically after
>'rte_eth_trace_timesync_adjust_time()' :), this is a big file, splitting it may help
>reviewers.
I will split this patch into two.
>
>>
>> Add trace points for ethdev functions.
>>
>> Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>
>
><...>
>
>> +RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_burst_mode_get,
>> +       lib.ethdev.rx_burst_mode_get)
>> +
>
>Tx counterpart of this API is missing.
The tx API is also added.
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_burst_mode_get,
+	lib.ethdev.tx_burst_mode_get)
+
>
>> +RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_queue_info_get,
>> +       lib.ethdev.rx_queue_info_get)
>> +
>> +RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_queue_setup,
>> +       lib.ethdev.rx_queue_setup)
>> +
>
>! rte_eth_trace_rx_queue_setup() is not called.
Will remove this. This is not required as rte_ethdev_trace_rxq_setup is already added.

>
>And Tx counterpart of this API is missing, these are important APIs, we should
>have them.
rte_ethdev_trace_txq_setup is already added.
>
><...>
>
>> @@ -331,6 +336,7 @@ rte_eth_find_next(uint16_t port_id)
>>         if (port_id >= RTE_MAX_ETHPORTS)
>>                 return RTE_MAX_ETHPORTS;
>>
>> +       rte_eth_trace_find_next(port_id);
>
>
>For the output 'port_id', trace function is after "return RTE_MAX_ETHPORTS;",
>so "there is no next port" case is ignored, need to update function to get trace
>on each call.
Ok. Will add trace for the "there is no next port" case.
>
><...>
>
>> @@ -636,6 +656,7 @@ rte_eth_dev_get_port_by_name(const char *name,
>uint16_t *port_id)
>>         RTE_ETH_FOREACH_VALID_DEV(pid)
>>                 if (!strcmp(name, eth_dev_shared_data->data[pid].name)) {
>>                         *port_id = pid;
>> +                       rte_ethdev_trace_get_port_by_name(name,
>> + *port_id);
>
>
>This completely ignores the path that not able to find port_id from name.
The trace was added for the success case only. For the failure case there is no port_id value.
>
>What about change the function as
>
>```
>ret = -ENODEV;
>*port_id = RTE_MAX_ETHPORTS;
>
>RTE_ETH_FOREACH_VALID_DEV(pid)
>  if (!strcmp())
>    *port_id = pid;
>    ret = 0;
>    break;
>
>rte_ethdev_trace_get_port_by_name(name, *port_id, ret);
>
>return ret;
>```
>
>>                         return 0;
>>                 }
>>
>> @@ -737,6 +758,7 @@ rte_eth_dev_rx_queue_start(uint16_t port_id,
>uint16_t rx_queue_id)
>>                 return 0;
>>         }
>>
>> +       rte_ethdev_trace_rx_queue_start(port_id, rx_queue_id);
>
>Please include return value.
Will add return value. The following changes will be required:
ret = eth_err(port_id, dev->dev_ops->rx_queue_start(dev, rx_queue_id)); 
rte_ethdev_trace_rx_queue_start(port_id, rx_queue_id, ret);
return ret;
>
>>         return eth_err(port_id, dev->dev_ops->rx_queue_start(dev,
>> rx_queue_id));  }
>>
>> @@ -770,6 +792,7 @@ rte_eth_dev_rx_queue_stop(uint16_t port_id,
>uint16_t rx_queue_id)
>>                 return 0;
>>         }
>>
>> +       rte_ethdev_trace_rx_queue_stop(port_id, rx_queue_id);
>
>Please include return value.
Ok.
>
>>         return eth_err(port_id, dev->dev_ops->rx_queue_stop(dev,
>> rx_queue_id));  }
>>
>> @@ -810,6 +833,7 @@ rte_eth_dev_tx_queue_start(uint16_t port_id,
>uint16_t tx_queue_id)
>>                 return 0;
>>         }
>>
>> +       rte_ethdev_trace_tx_queue_start(port_id, tx_queue_id);
>
>Please include return value.
Ok.
>
>>         return eth_err(port_id, dev->dev_ops->tx_queue_start(dev,
>> tx_queue_id));  }
>>
>> @@ -843,12 +867,14 @@ rte_eth_dev_tx_queue_stop(uint16_t port_id,
>uint16_t tx_queue_id)
>>                 return 0;
>>         }
>>
>> +       rte_ethdev_trace_tx_queue_stop(port_id, tx_queue_id);
>
>Please include return value.
Ok.
>
>>         return eth_err(port_id, dev->dev_ops->tx_queue_stop(dev,
>> tx_queue_id));  }
>>
>>  uint32_t
>>  rte_eth_speed_bitflag(uint32_t speed, int duplex)  {
>> +       rte_eth_trace_speed_bitflag(speed, duplex);
>
>I think this should have return value, but I can see this requires change in the
>function.
>
>I am for either having return value or drop the tracing of this function
>completely.
Will drop the tracing for this function.
>
><...>
>
>> @@ -1552,6 +1581,7 @@ rte_eth_dev_set_link_up(uint16_t port_id)
>>
>>         if (*dev->dev_ops->dev_set_link_up == NULL)
>>                 return -ENOTSUP;
>> +       rte_ethdev_trace_set_link_up(port_id);
>
>Please include return value.
Ok.
>
>>         return eth_err(port_id,
>> (*dev->dev_ops->dev_set_link_up)(dev));
>>  }
>>
>> @@ -1565,6 +1595,7 @@ rte_eth_dev_set_link_down(uint16_t port_id)
>>
>>         if (*dev->dev_ops->dev_set_link_down == NULL)
>>                 return -ENOTSUP;
>> +       rte_ethdev_trace_set_link_down(port_id);
>
>Please include return value.
Ok.
>
><...>
>
>> @@ -2327,6 +2371,7 @@ rte_eth_promiscuous_enable(uint16_t port_id)
>>         diag = (*dev->dev_ops->promiscuous_enable)(dev);
>>         dev->data->promiscuous = (diag == 0) ? 1 : 0;
>>
>> +       rte_eth_trace_promiscuous_enable(port_id,
>> + dev->data->promiscuous);
>
>Above is good, but to be consistent what about returning return value of the
>API (diag (with record name 'return')), which is relavent with 'dev->data-
>>promiscuous' value.
For this the following changes will capture return value and diag:
 ret = eth_err(port_id, diag);
rte_eth_trace_promiscuous_enable(port_id, dev->data->promiscuous, diag, ret);
return ret;
>
>>         return eth_err(port_id, diag);  }
>>
>> @@ -2350,6 +2395,7 @@ rte_eth_promiscuous_disable(uint16_t port_id)
>>         if (diag != 0)
>>                 dev->data->promiscuous = 1;
>>
>> +       rte_eth_trace_promiscuous_disable(port_id,
>> + dev->data->promiscuous);
>
>Above is good, but to be consistent what about returning return value of the
>API (diag (with record name 'return')), which is relavent with 'dev->data-
>>promiscuous' value.
Similar changes as rte_eth_trace_promiscuous_enable.
>
><...>
>
>> @@ -2561,6 +2616,7 @@ rte_eth_stats_reset(uint16_t port_id)
>>
>>         dev->data->rx_mbuf_alloc_failed = 0;
>>
>> +       rte_eth_trace_stats_reset(port_id);
>
>Please include return value.
Here the return value is not required, because if the control reached here the return is 0.
>
><...>
>
>> @@ -3483,6 +3561,7 @@ rte_eth_dev_set_vlan_strip_on_queue(uint16_t
>> port_id, uint16_t rx_queue_id,
>>
>>         if (*dev->dev_ops->vlan_strip_queue_set == NULL)
>>                 return -ENOTSUP;
>> +       rte_ethdev_trace_set_vlan_strip_on_queue(port_id, rx_queue_id,
>> + on);
>
>Please include return value.
>
>>         (*dev->dev_ops->vlan_strip_queue_set)(dev, rx_queue_id, on);
If the control reached this point the return is 0. I think the return value is not required here.
>>
>>         return 0;
>> @@ -3500,6 +3579,7 @@ rte_eth_dev_set_vlan_ether_type(uint16_t
>> port_id,
>>
>>         if (*dev->dev_ops->vlan_tpid_set == NULL)
>>                 return -ENOTSUP;
>> +       rte_ethdev_trace_set_vlan_ether_type(port_id, vlan_type,
>> + tpid);
>
>Please include return value.
Ok.
>
><...>
>
>> @@ -3632,6 +3714,7 @@ rte_eth_dev_set_vlan_pvid(uint16_t port_id,
>> uint16_t pvid, int on)
>>
>>         if (*dev->dev_ops->vlan_pvid_set == NULL)
>>                 return -ENOTSUP;
>> +       rte_ethdev_trace_set_vlan_pvid(port_id, pvid, on);
>
>Please include return value.
Ok.
>
><...>
>
>> @@ -3702,6 +3787,7 @@ rte_eth_dev_priority_flow_ctrl_set(uint16_t
>port_id,
>>                 return -EINVAL;
>>         }
>>
>> +       rte_ethdev_trace_priority_flow_ctrl_set(port_id, pfc_conf);
>
>Please put the call very bottom of the function and include return value.
Ok.
>
><...>
>
>> @@ -4063,6 +4156,7 @@ rte_eth_dev_udp_tunnel_port_add(uint16_t
>> port_id,
>>
>>         if (*dev->dev_ops->udp_tunnel_port_add == NULL)
>>                 return -ENOTSUP;
>> +       rte_ethdev_trace_udp_tunnel_port_add(port_id, udp_tunnel);
>
>Please include return value.
Ok.
>
>>         return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_add)(dev,
>>
>> udp_tunnel));  } @@ -4090,6 +4184,7 @@
>> rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
>>
>>         if (*dev->dev_ops->udp_tunnel_port_del == NULL)
>>                 return -ENOTSUP;
>> +       rte_ethdev_trace_udp_tunnel_port_delete(port_id, udp_tunnel);
>
>Please include return value.
Ok.
>
>>         return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_del)(dev,
>>
>> udp_tunnel));  } @@ -4104,6 +4199,7 @@ rte_eth_led_on(uint16_t
>> port_id)
>>
>>         if (*dev->dev_ops->dev_led_on == NULL)
>>                 return -ENOTSUP;
>> +       rte_eth_trace_led_on(port_id);
>
>Please include return value.
Ok.
>
>>         return eth_err(port_id, (*dev->dev_ops->dev_led_on)(dev));
>>  }
>>
>> @@ -4117,6 +4213,7 @@ rte_eth_led_off(uint16_t port_id)
>>
>>         if (*dev->dev_ops->dev_led_off == NULL)
>>                 return -ENOTSUP;
>> +       rte_eth_trace_led_off(port_id);
>
>Please include return value.
Ok.
>
><...>
>
>> @@ -4294,6 +4395,7 @@ rte_eth_dev_mac_addr_remove(uint16_t port_id,
>struct rte_ether_addr *addr)
>>         } else if (index < 0)
>>                 return 0;  /* Do nothing if address wasn't found */
>>
>> +       rte_ethdev_trace_mac_addr_remove(port_id, addr);
>
>better to keep trace APIs are last thing in the function for consistency, as long as
>it is possible, and for this case it is possible.
Ok.
>
><...>
>
>> @@ -4438,6 +4542,7 @@ rte_eth_dev_uc_all_hash_table_set(uint16_t
>> port_id, uint8_t on)
>>
>>         if (*dev->dev_ops->uc_all_hash_table_set == NULL)
>>                 return -ENOTSUP;
>> +       rte_ethdev_trace_uc_all_hash_table_set(port_id, on);
>
>Please include return value.
Ok.
>
>>         return eth_err(port_id, (*dev->dev_ops->uc_all_hash_table_set)(dev,
>>
>> on));  } @@ -4475,6 +4580,7 @@ int
>> rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
>>
>>         if (*dev->dev_ops->set_queue_rate_limit == NULL)
>>                 return -ENOTSUP;
>> +       rte_eth_trace_set_queue_rate_limit(port_id, queue_idx,
>> + tx_rate);
>
>Please include return value.
Ok.
>
><...>
>
>> @@ -4570,6 +4678,9 @@ rte_eth_dev_callback_register(uint16_t port_id,
>>                 next_port = last_port = port_id;
>>         }
>>
>> +       rte_ethdev_trace_callback_register(port_id, event, cb_fn, cb_arg,
>next_port,
>> +                                          last_port);
>> +
>
>I assume this added into middle to be able to use 'next_port' & 'last_port', but
>they are generated from given 'port_id', so what do you think to have only
>'port_id', and move call to the bottom of the function.
I think its fine to move the trace to the bottom. But I was thinking of capturing all the input arguments to the function like port_id, event, cb_fn, cb_arg also.
>
>'rte_ethdev_trace_callback_unregister()' has same logic, and it has only
>'port_id' already.
>
>
>
>And I think better to standardise to record API return value or not, because
>some has it, some don't.
>What do you think to trace all return values, is there any downside of this
>approach?
Initially my thought was to not change the existing code of library functions, and capture the trace with input args and in some cases capture return value where possible.
But now I think small modifications are fine if return values can be captured.
>
>If we need fine grain on recording return values, what about following:
>- All API that changes device config return values should be recorded
>  * like, record return for set_mtu(), but ignore it for get_mtu()
>- If return value has not API status but useful information, record it
>  * like rte_eth_dev_is_valid_port() return value
>
>
>>         rte_spinlock_lock(&eth_dev_cb_lock);
>>
>>         do {
>> @@ -4665,6 +4776,7 @@ rte_eth_dev_callback_unregister(uint16_t port_id,
>>         } while (++next_port <= last_port);
>>
>>         rte_spinlock_unlock(&eth_dev_cb_lock);
>> +       rte_ethdev_trace_callback_unregister(port_id, event, cb_fn,
>> + cb_arg, ret);
>
>Just a syntax comment, what do you think to have an empty line one before
>and after the trace call, to separate this trace calls from regular logic.
Just that it makes the function(and as a result the file) longer. But i agree adding the empty lines improve readability. 
>
>>         return ret;
>>  }
>>
>> @@ -4694,6 +4806,7 @@ rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd,
>int op, void *data)
>>         for (qid = 0; qid < dev->data->nb_rx_queues; qid++) {
>>                 vec = rte_intr_vec_list_index_get(intr_handle, qid);
>>                 rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec,
>> data);
>> +               rte_ethdev_trace_rx_intr_ctl(port_id, epfd, op, data,
>> + rc);
>
>Why this is in the for loop, API if for port level, this loop iterates on queues?
Yes this iterates on queues records the return (rc) for qid 0 to nb_rx_queues.
>What about moving this trace to the bottom of the function, and record return
>value as return value of the API?
>
>>                 if (rc && rc != -EEXIST) {
>>                         RTE_ETHDEV_LOG(ERR,
>>                                 "p %u q %u Rx ctl error op %d epfd %d
>> vec %u\n", @@ -4737,6 +4850,7 @@
>rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id)
>>                 (vec - RTE_INTR_VEC_RXTX_OFFSET) : vec;
>>         fd = rte_intr_efds_index_get(intr_handle, efd_idx);
>>
>> +       rte_ethdev_trace_rx_intr_ctl_q_get_fd(port_id, queue_id, fd);
>>         return fd;
>>  }
>>
>> @@ -4770,6 +4884,7 @@ rte_eth_dev_rx_intr_ctl_q(uint16_t port_id,
>> uint16_t queue_id,
>>
>>         vec = rte_intr_vec_list_index_get(intr_handle, queue_id);
>>         rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
>> +       rte_ethdev_trace_rx_intr_ctl_q(port_id, queue_id, epfd, op,
>> + data, rc);
>
>Instead of trace API having in the middle, what about changing API as:
>
>```
>rc = ...
>
>if (rc && rc != -EEXIST) {
>	...
>}
>
>rte_ethdev_trace_rx_intr_ctl_q(port_id, queue_id, epfd, op, data, rc);
>
>return rc;
>```
In this trace the return value rc is being captured, so I was thinking changing the API is not required.
>
>>         if (rc && rc != -EEXIST) {
>>                 RTE_ETHDEV_LOG(ERR,
>>                         "p %u q %u Rx ctl error op %d epfd %d vec
>> %u\n", @@ -4796,6 +4911,7 @@ rte_eth_dev_rx_intr_enable(uint16_t
>> port_id,
>>
>>         if (*dev->dev_ops->rx_queue_intr_enable == NULL)
>>                 return -ENOTSUP;
>> +       rte_ethdev_trace_rx_intr_enable(port_id, queue_id);
>
>Please include return value.
Ok.
>
>>         return eth_err(port_id,
>> (*dev->dev_ops->rx_queue_intr_enable)(dev, queue_id));  }
>>
>> @@ -4815,6 +4931,7 @@ rte_eth_dev_rx_intr_disable(uint16_t port_id,
>>
>>         if (*dev->dev_ops->rx_queue_intr_disable == NULL)
>>                 return -ENOTSUP;
>> +       rte_ethdev_trace_rx_intr_disable(port_id, queue_id);
>
>Please include return value.
Ok.
>
><...>
>
>> @@ -5447,6 +5586,7 @@ rte_eth_dev_set_eeprom(uint16_t port_id, struct
>> rte_dev_eeprom_info *info)
>>
>>         if (*dev->dev_ops->set_eeprom == NULL)
>>                 return -ENOTSUP;
>> +       rte_ethdev_trace_set_eeprom(port_id, info);
>
>Please include return value.
Ok.
>
><...>
>
>> @@ -5562,6 +5705,7 @@ rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t
>port_id,
>>         if (nb_tx_desc != NULL)
>>                 eth_dev_adjust_nb_desc(nb_tx_desc,
>> &dev_info.tx_desc_lim);
>>
>> +       rte_ethdev_trace_adjust_nb_rx_tx_desc(port_id, *nb_rx_desc,
>> + *nb_rx_desc);
>
>
>'nb_rx_desc' or 'nb_rx_desc' can be NULL, so we can't directly access them.
Yes. Will remove nb_rx_desc and nb_tx_desc.
>
><...>
>
>> @@ -5605,6 +5750,7 @@ rte_eth_dev_pool_ops_supported(uint16_t
>port_id, const char *pool)
>>         if (*dev->dev_ops->pool_ops_supported == NULL)
>>                 return 1; /* all pools are supported */
>>
>> +       rte_ethdev_trace_pool_ops_supported(port_id, pool);
>
>Please include return value.
Ok.
>
><...>
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_flow_ctrl_get,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_fc_conf
>*fc_conf),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(fc_conf);
>> +)
>
>'fc_conf' is pointer for the config struct, its address is not much useful, can you
>expand it similar to ones in 'rte_ethdev_trace_flow_ctrl_set()' API?
The value of fc_conf is updated after this line.
return eth_err(port_id, (*dev->dev_ops->flow_ctrl_get)(dev, fc_conf));

So to capture fc_conf values the return of eth_err needs to be stored in a local variable and also the return needs to be checked for success(if condition). Then only fc_conf will have valid values. Is this fine?

>
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_flow_ctrl_set,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_fc_conf
>*fc_conf),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_u32(fc_conf->high_water);
>> +       rte_trace_point_emit_u32(fc_conf->low_water);
>> +       rte_trace_point_emit_u16(fc_conf->pause_time);
>> +       rte_trace_point_emit_u16(fc_conf->send_xon);
>> +       rte_trace_point_emit_int(fc_conf->mode);
>> +       rte_trace_point_emit_u8(fc_conf->mac_ctrl_frame_fwd);
>> +       rte_trace_point_emit_u8(fc_conf->autoneg);
>> +)
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_fw_version_get,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, char *fw_version, size_t
>fw_size),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(fw_version);
>> +       rte_trace_point_emit_size_t(fw_size);
>> +)
>
>'fw_version' is string, it help to display the string, but not sure if the pointer
>value has a value.
>Is there a way to display string in the trace point?
Yes string can be displayed in trace by rte_trace_point_emit_string() function. But there is a max string length of 32 which can be displayed. Will display 'fw_version' as string.
>And 'fw_size' is normally just used to know the valid data in the 'fw_version',
>when 'fw_version' string is displayed, not sure if there is a value to have
>'fw_size'
If fw_size is greater than 32, displaying fw_size will present some additional information, as only 32 bytes of fw_version will be displayed.
>
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_get_dcb_info,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_dcb_info
>*dcb_info),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(dcb_info);
>> +)
>
>'dcb_info' is pointer to a info struct, not useful as pointer value, we should
>display content of the 'dcb_info' struct.
>There are arrays in the 'dcb_info', perhaps it can be possible to trace 'dcb_info-
>>nb_tcs', also 'dcb_info->prio_tc[]' & 'dcb_info->tc_bws[]'
>since their size is small (8).
Yes will capture the array also. Same changes required as fc_conf above.
>
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_get_eeprom,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_dev_eeprom_info
>*info),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(info);
>> +)
>> +
>
>Similarly, content of the 'info' should be displayed, for '*data' it can be possible
>to display address of it, but values for rest.
Ok. Same changes required as fc_conf above.
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_get_eeprom_length,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id),
>> +       rte_trace_point_emit_u16(port_id);
>> +)
>> +
>
>This should return the size of the eeprom, existing
>'rte_eth_dev_get_eeprom_length()' needs to be updated for it.
Ok. Same as fc_conf above.
>
><...>
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_get_reg_info,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_dev_reg_info
>*info),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(info);
>> +)
>
>What do you think to display content of the 'info', insted of pointer value which
>is not very useful.
Yes info can be displayed. The rte_eth_dev_get_reg_info needs to be changed such that trace is called after eth_err() function call. Same as fc_conf above.
>
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_get_sec_ctx,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id),
>> +       rte_trace_point_emit_u16(port_id);
>> +)
>
>'security_ctx' is "void *", so can't record content, but what do you think to
>record pointer value of it?
rte_eth_dev_get_sec_ctx() needs to be changed. The rte_eth_devices[port_id].security_ctx needs to be stored in a local variable.
>
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_get_supported_ptypes,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t ptype_mask,
>> +               uint32_t *ptypes, int num, int j),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_u32(ptype_mask);
>> +       rte_trace_point_emit_ptr(ptypes);
>> +       rte_trace_point_emit_int(num);
>> +       rte_trace_point_emit_int(j);
>> +)
>
>better to use 'supported_num' instead of 'j' which is not clear what it is.
Ok.
>
>The real information is in 'ptypes' but that is an array, I guess not possible to
>record array values.
>
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_get_vlan_offload,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_int(ret);
>> +)
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_info_get,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id,
>> +               struct rte_eth_dev_info *dev_info),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_string(dev_info->driver_name);
>> +       rte_trace_point_emit_u32(dev_info->if_index);
>> +       rte_trace_point_emit_u16(dev_info->min_mtu);
>> +       rte_trace_point_emit_u16(dev_info->max_mtu);
>> +       rte_trace_point_emit_u32(dev_info->min_rx_bufsize);
>> +       rte_trace_point_emit_u32(dev_info->max_rx_pktlen);
>> +       rte_trace_point_emit_u64(dev_info->rx_offload_capa);
>> +       rte_trace_point_emit_u64(dev_info->tx_offload_capa);
>> +       rte_trace_point_emit_u64(dev_info->rx_queue_offload_capa);
>> +       rte_trace_point_emit_u64(dev_info->tx_queue_offload_capa);
>> +       rte_trace_point_emit_u16(dev_info->reta_size);
>> +       rte_trace_point_emit_u8(dev_info->hash_key_size);
>> +       rte_trace_point_emit_u16(dev_info->nb_rx_queues);
>> +       rte_trace_point_emit_u16(dev_info->nb_tx_queues);
>> +)
>> +
>
>It is a debate what to display, but I would remove 'if_index' and add
>'max_rx_queues', 'max_tx_queues', 'max_mac_addrs', 'flow_type_rss_offloads',
>'rx_desc_lim', 'tx_desc_lim', 'speed_capa', 'dev_capa'.
Ok.
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_is_removed,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_int(ret);
>> +)
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_is_valid_port,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id),
>> +       rte_trace_point_emit_u16(port_id);
>> +)
>> +
>
>Should have return value, if the port is valid of not.
Some changes needs to be made as the rte_ethdev_is_valid_port function return 0 or 1.
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_mac_addr_add,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *addr,
>> +               uint32_t pool),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(addr);
>> +       rte_trace_point_emit_u32(pool);
>> +)
>> +
>
>Isn't it possible to return 'addr' as string? I am not sure about benefit to record
>addr pointer value.
>Should have return value.
Right now the function to display array is not there in trace. I have added a new function(not yet sent upstream) to display mac addresses.
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_mac_addr_remove,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *addr),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(addr);
>> +)
>> +
>
>As above, can content of 'addr' be recorded, like as string?
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_pool_ops_supported,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, const char *pool),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(pool);
>> +)
>> +
>
>'pool' should be string, instead of pointer.
Ok.
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_priority_flow_ctrl_set,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_pfc_conf
>*pfc_conf),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_u32(pfc_conf->fc.high_water);
>> +       rte_trace_point_emit_u32(pfc_conf->fc.low_water);
>> +       rte_trace_point_emit_u16(pfc_conf->fc.pause_time);
>> +       rte_trace_point_emit_u16(pfc_conf->fc.send_xon);
>> +       rte_trace_point_emit_int(pfc_conf->fc.mode);
>> +       rte_trace_point_emit_u8(pfc_conf->fc.mac_ctrl_frame_fwd);
>> +       rte_trace_point_emit_u8(pfc_conf->fc.autoneg);
>> +       rte_trace_point_emit_u8(pfc_conf->priority);
>> +)
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_reset,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_int(ret);
>> +)
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_rss_hash_conf_get,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_rss_conf
>*rss_conf),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(rss_conf);
>> +)
>> +
>
>Please record content of the 'rss_conf' instead of pointer value.
Ok. Same as fc_conf above.
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_rss_hash_update,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_rss_conf
>*rss_conf),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(rss_conf->rss_key);
>> +       rte_trace_point_emit_u8(rss_conf->rss_key_len);
>> +       rte_trace_point_emit_u64(rss_conf->rss_hf);
>> +)
>> +
>
>Please add return value.
Ok.
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_rss_reta_query,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id,
>> +               struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(reta_conf);
>> +       rte_trace_point_emit_u16(reta_size);
>> +)
>> +
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_rss_reta_update,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id,
>> +               struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_u64(reta_conf->mask);
>> +       rte_trace_point_emit_u16(reta_size);
>> +)
>
>'reta_conf->mask' on its own is not much usefull, and 'reta_conf->reta'
>is an array and hard to record.
>As above 'rte_ethdev_trace_rss_reta_query' trace point only record reta_config
>pointer, this can do the same.
In rte_eth_dev_rss_reta_query, if return of eth_err is captured and success then reta conf can be displayed.
>
>Overall, I think better to make get/set pair of an API record same set of values.
>
><...>
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_set_mc_addr_list,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id,
>> +               struct rte_ether_addr *mc_addr_set,
>> +               uint32_t nb_mc_addr),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(mc_addr_set);
>> +       rte_trace_point_emit_u32(nb_mc_addr);
>> +)
>> +
>
>Better to record content of 'mc_addr_set' but it is pointer array for mac address,
>so I guess we can't record these mac addresses.
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_set_ptypes,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t ptype_mask,
>> +               uint32_t *set_ptypes, unsigned int num),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_u32(ptype_mask);
>> +       rte_trace_point_emit_ptr(set_ptypes);
>> +       rte_trace_point_emit_u32(num);
>> +)
>> +
>
>Similarly 'set_ptypes' is an array.
>
>I wonder if there should be an rte_trace_point_emit_ function for arrays? What
>do you think?
In my new series(not yet sent upstream), I have added a function to display uint8_t arrays like mac addresses. Will have to check how much change is required to display other array type.
>
><...>
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_socket_id,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id),
>> +       rte_trace_point_emit_u16(port_id);
>> +)
>
>Should include 'socket_id'.
Ok.
>
><...>
>
>> +RTE_TRACE_POINT(
>> +       rte_ethdev_trace_uc_hash_table_set,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *addr,
>> +               uint8_t on, int ret),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(addr);
>> +       rte_trace_point_emit_u8(on);
>> +       rte_trace_point_emit_int(ret);
>> +)
>> +
>
>Can have 'addr' as string?
mac_addr can be displayed as arrays.
>Do we need a specific rte_trace_point_emit_ function for mac addr?
>
><...>
>
>> +RTE_TRACE_POINT(
>> +       rte_eth_trace_find_next,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id),
>> +       rte_trace_point_emit_u16(port_id);
>> +)
>> +
>
>rte_eth_trace_find_next* functions gets 'port_id' as input parameter, and
>returns next 'port_id', so both input and output is 'port_id' and both should be
>recorded.
>
>For this need to update these functions to create an interim variable for input
>'port_id'.
>
>Above comments are for all 'rte_eth_trace_find_next*()' functions.
Ok.
>
><...>
>
>> +RTE_TRACE_POINT(
>> +       rte_eth_trace_link_get,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_link *link),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_u32(link->link_speed);
>> +)
>
>I think better to record other link values too.
Ok.
>
>> +
>> +RTE_TRACE_POINT(
>> +       rte_eth_trace_link_get_nowait,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_link *link),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_u32(link->link_speed);
>> +)
>> +
>
>I think better to record other link values too.
>
><...>
>
>> +RTE_TRACE_POINT(
>> +       rte_eth_trace_rx_burst_mode_get,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>> +               struct rte_eth_burst_mode *mode),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_u16(queue_id);
>> +       rte_trace_point_emit_ptr(mode);
>> +)
>> +
>
>Can you please record content of 'mode' inst
mode->flags can be displayed. Not sure about info array.
>
>> +RTE_TRACE_POINT(
>> +       rte_eth_trace_rx_queue_info_get,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>> +               struct rte_eth_rxq_info *qinfo),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_u16(queue_id);
>> +       rte_trace_point_emit_ptr(qinfo->mp);
>> +       rte_trace_point_emit_u8(qinfo->scattered_rx);
>> +       rte_trace_point_emit_u8(qinfo->queue_state);
>> +       rte_trace_point_emit_u16(qinfo->nb_desc);
>> +       rte_trace_point_emit_u16(qinfo->rx_buf_size);
>> +)
>> +
>
>Can you please add 'qinfo->conf->rx_drop_en' & 'qinfo->conf->offloads'.
Ok.
>
>
>> +RTE_TRACE_POINT(
>> +       rte_eth_trace_rx_queue_setup,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
>> +               uint16_t nb_rx_desc, unsigned int socket_id,
>> +               const struct rte_eth_rxconf *rx_conf,
>> +               struct rte_mempool *mb_pool),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_u16(rx_queue_id);
>> +       rte_trace_point_emit_u16(nb_rx_desc);
>> +       rte_trace_point_emit_u32(socket_id);
>> +       rte_trace_point_emit_ptr(rx_conf);
>> +       rte_trace_point_emit_ptr(mb_pool);
>> +)
>> +
>
>Can you please add 'rx_conf->rx_drop_en' & 'rx_conf->offloads'.
Ok.
>
>> +RTE_TRACE_POINT(
>> +       rte_eth_trace_set_queue_rate_limit,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_idx,
>> +               uint16_t tx_rate),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_u16(queue_idx);
>> +       rte_trace_point_emit_u16(tx_rate);
>> +)
>> +
>> +RTE_TRACE_POINT(
>> +       rte_eth_trace_speed_bitflag,
>> +       RTE_TRACE_POINT_ARGS(uint32_t speed, int duplex),
>> +       rte_trace_point_emit_u32(speed);
>> +       rte_trace_point_emit_int(duplex);
>> +)
>> +
>> +RTE_TRACE_POINT(
>> +       rte_eth_trace_stats_get,
>> +       RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_stats *stats),
>> +       rte_trace_point_emit_u16(port_id);
>> +       rte_trace_point_emit_ptr(stats);
>> +       rte_trace_point_emit_u64(stats->rx_nombuf);
>> +)
>> +
>
>Not sure what to record here, I think all basic stat counters can be recorded if
>there cost is effordable.
Ok. Same changes required as fc_conf above.
  
Jerin Jacob Dec. 15, 2022, 6:49 a.m. UTC | #12
On Wed, Dec 14, 2022 at 5:40 PM Ferruh Yigit <ferruh.yigit@amd.com> wrote:
>
> On 12/14/2022 10:40 AM, Jerin Jacob wrote:
> > On Wed, Dec 14, 2022 at 1:37 AM Ferruh Yigit <ferruh.yigit@amd.com> wrote:
> >>
> >> On 10/6/2022 4:18 PM, Ankur Dwivedi wrote:
> >>
> >> Hi Ankur, Jerin,
> >
> > Hi Ferruh, Please find answers to generic trace questions.
> >
> >>
> >> I have some major questions, I can see some already queried by Andrew as
> >> well:
> >>
> >> 1) How flexible are we on changing trace log output?
> >> Should we take trace log as kind of user interface and don't break it
> >> (as much as possible)? Or is it OK to change whenever we want?
> >
> > If you see https://doc.dpdk.org/guides/prog_guide/trace_lib.html
> > "Section: 6.9.3. Trace memory layout", Currently, we defined packet.header,
> > packet.context, trace.header as minimum as required. It can be
> > extended if needed.
> > Trace payload is not fixed, it is created based on arguments of RTE_TRACE_POINT.
> >
>
> I am aware payload is not fixed technically, but my concern is from user
> perspective.
>
> Lets get 'rte_ethdev_trace_info_get' as example, right now it records
> 'dev_info->if_index', if we remove it in next release, will it impact
> the users?
> Or if we start recording 'dev_info->max_rx_queues' in another release,
> it will change order of fields in output, will it impact the user?

No. IMO, That level of compatibility is not needed.

>
> If changing payload doesn't impact user, we can accept changes easier
> since we can tweak them as needed without user impact.
> But if the target is to stick to the payload layout as much as possible,
> we should be more careful before we finalize it.
>
> I am trying to understand how strict to be in accepting trace point patches.
>
> >>
> >>
> >> 2) What is the main purpose of the trace library.
> >> Is it to record type and frequency of the calls? Or is it to log values
> >> and state of the device/driver after each call?
> >
> > From the framework POV, it can be used for both.
> > I think, as first step, we can emit the traces for public DPDK APIs
> > with return type of each API.
> >
>
> Most of the trace point records only on success path, and not record at
> all when there is a failure in the API, that is why I think trace can't
> completely replace the logging.

Yes.

>
> But trace may be useful to analysis a functioning system for performance
> issues, overall system analysis, or unexpected behaviors.
> In that case I am not sure how much detail to record in trace.

For other projects(example:
https://docs.zephyrproject.org/2.6.0/guides/tracing/index.html), I see
it's just capturing the  PUBLIC APIs to know how application using the
library and debug
customer issues. i.e API contract between user and DPDK library,

>
> Because recording more fields comes with additional runtime cost and
> memory cost, right? Also useless records can be noise in the trace output.

Since each trace point can be disabled(using regex pattern) at
runtime, users have control on it

>
> OK to record return values but I don't know if it may be misleading
> because in some of the failure path trace functions not called at all,
> so recorded failures will be subset of the overall failures.
> BTW, I don't think that we should record all failures in trace log, that
> will create to much noise in the code.

Yes. Just the return value of the function is enough in most case.
Also, it is up to the specific subsystem maintainer to decide what
level of info needs to capture.

>
> >> This can guide us to decide
> >> - which values to record (should record only pointers or values of structs)
> >> - if to record API return values and failure paths
> >> - if to add tracing all APIs or not, like
> >> 'rte_eth_dev_rx_offload_name()' kind of helper function that converts
> >> offload to a string, which doesn't have any functional impact, or
> >> 'rte_eth_speed_bitflag()', and many more...
> >>
> >>
> >> 3) What is the runtime impact.
> >
> > Profiling overhead is one cycle. i.e. RTE_TRACE_POINT is added, and it
> > is disabled at runtime.
>
> Got it, there is '__RTE_TRACE_FIELD_ENABLE_MASK' check, and this is the
> only cost when trace is disabled.
>
> > For RTE_TRACE_POINT_FP it is zero if it is not enabled at compile time.
> >
>
> ack
>
> >
> >> As far as I can see some values copied and some memory is used for this
> >> support, even user is not interested in tracing. For control path APIs
> >> we can ignore the additional cost by memcpy, but how big memory
> >> requirement is?
> >
> > Currently, per core/thread 1MB trace buffer is created as default. The
> > size can be overridden via EAL command line argument.
> > See __rte_trace_mem_per_thread_alloc().
> > If you see https://doc.dpdk.org/guides/prog_guide/trace_lib.html
> > section "6.5. Event record mode", it has two modes
> > Overwrite - When the trace buffer is full, new trace events overwrites
> > the existing captured events in the trace buffer.
> > Discard - When the trace buffer is full, new trace events will be discarded.
> >
>
> OK, default 1M buffer doesn't look something to worry about.
>
> >>
> >>
> >> 4) Why we need to export trace point variables in the .map files,
> >> like '__rte_eth_trace_allmulticast_disable' one...
> >
> > If you see app/test/test_trace.c example
> >
> > There are two-way to operate on trace point, We need to export symbol
> > iff we need option 1
> >
> > option1:
> > rte_trace_point_enable(&__app_dpdk_test_tp);
> >
> > option2:
> > rte_trace_point_t *trace = rte_trace_point_lookup("app.dpdk.test.tp");
> > rte_trace_point_enable(trace);
> >
>
> got it, do we really need direct access to trace point (option 1), I
> would be OK to remove that option to not expose all these trace point
> objects.

Looks good to me.

>
> >
> >>
> >>
> >>
> >> 5) (bonus Q) Can we have an 'rte_trace_point_emit_xx()' function to
> >> record mac address (struct rte_ether_addr) as string?
> >> And maybe another set for array types?
> >
> > Yes it possible and better to add rte_trace_pint_emit_,mac() or so.
> >
>
> Thanks.
>
> >
> >>
> >>
> >> There are bunch of small comments inline, some are related to above
> >> highlevel question.
> >> But I stopped after some point, specifically after
> >> 'rte_eth_trace_timesync_adjust_time()' :), this is a big file, splitting
> >> it may help reviewers.
> >>
>
  
Thomas Monjalon Jan. 12, 2023, 9:10 a.m. UTC | #13
15/12/2022 07:49, Jerin Jacob:
> On Wed, Dec 14, 2022 at 5:40 PM Ferruh Yigit <ferruh.yigit@amd.com> wrote:
> >
> > On 12/14/2022 10:40 AM, Jerin Jacob wrote:
> > > On Wed, Dec 14, 2022 at 1:37 AM Ferruh Yigit <ferruh.yigit@amd.com> wrote:
> > >> 4) Why we need to export trace point variables in the .map files,
> > >> like '__rte_eth_trace_allmulticast_disable' one...
> > >
> > > If you see app/test/test_trace.c example
> > >
> > > There are two-way to operate on trace point, We need to export symbol
> > > iff we need option 1
> > >
> > > option1:
> > > rte_trace_point_enable(&__app_dpdk_test_tp);
> > >
> > > option2:
> > > rte_trace_point_t *trace = rte_trace_point_lookup("app.dpdk.test.tp");
> > > rte_trace_point_enable(trace);
> > >
> >
> > got it, do we really need direct access to trace point (option 1), I
> > would be OK to remove that option to not expose all these trace point
> > objects.
> 
> Looks good to me.

I would like to see a policy regarding trace symbols.
If we decide option 1 is not so useful,
then we should not export trace symbols at all and document this policy.
Also there are some trace symbols which could be cleaned up.
  
Morten Brørup Jan. 12, 2023, 9:43 a.m. UTC | #14
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Thursday, 12 January 2023 10.11
> 
> 15/12/2022 07:49, Jerin Jacob:
> > On Wed, Dec 14, 2022 at 5:40 PM Ferruh Yigit <ferruh.yigit@amd.com>
> wrote:
> > >
> > > On 12/14/2022 10:40 AM, Jerin Jacob wrote:
> > > > On Wed, Dec 14, 2022 at 1:37 AM Ferruh Yigit
> <ferruh.yigit@amd.com> wrote:
> > > >> 4) Why we need to export trace point variables in the .map
> files,
> > > >> like '__rte_eth_trace_allmulticast_disable' one...
> > > >
> > > > If you see app/test/test_trace.c example
> > > >
> > > > There are two-way to operate on trace point, We need to export
> symbol
> > > > iff we need option 1
> > > >
> > > > option1:
> > > > rte_trace_point_enable(&__app_dpdk_test_tp);
> > > >
> > > > option2:
> > > > rte_trace_point_t *trace =
> rte_trace_point_lookup("app.dpdk.test.tp");
> > > > rte_trace_point_enable(trace);

rte_trace_point_enable() allows passing a NULL pointer, so enabling a trace point can still be a one-liner:

rte_trace_point_enable(rte_trace_point_lookup("app.dpdk.test.tp"));

With option2, we lose the build-time error if trying to enable a non-existing trace point. But it's an acceptable tradeoff.

> > > >
> > >
> > > got it, do we really need direct access to trace point (option 1),
> I
> > > would be OK to remove that option to not expose all these trace
> point
> > > objects.
> >
> > Looks good to me.
> 
> I would like to see a policy regarding trace symbols.
> If we decide option 1 is not so useful,
> then we should not export trace symbols at all and document this
> policy.
> Also there are some trace symbols which could be cleaned up.

+1 for not exposing trace point symbols at all.

The trace point symbols are only used internally by DPDK, so they should not be part of DPDK's public API.

It might also make it easier for Bruce to move the trace library out of EAL.

I'm not familiar with the CTF format, but I assume that if we don't expose the trace point symbols, the trace points can still be identified when parsing the trace file.
  
Jerin Jacob Jan. 13, 2023, 11:22 a.m. UTC | #15
On Thu, Jan 12, 2023 at 3:13 PM Morten Brørup <mb@smartsharesystems.com> wrote:
>
> > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > Sent: Thursday, 12 January 2023 10.11
> >

> >
> > I would like to see a policy regarding trace symbols.
> > If we decide option 1 is not so useful,
> > then we should not export trace symbols at all and document this
> > policy.
> > Also there are some trace symbols which could be cleaned up.

I can send a patch to remove existing exposed symbols for option 1 in
DPDK repo. But, Is n't  an ABI break? The only downside, I can think
of, is that a few more entries in version.map file.
I don't have a strong option one way, either. Let me know what you think?

If we decided to remove then, In
https://doc.dpdk.org/guides/prog_guide/trace_lib.html, There is NOTE
section as following, I can remove that as well.

--
The RTE_TRACE_POINT_REGISTER defines the placeholder for the
rte_trace_point_t tracepoint object. The user must export a
__<trace_function_name> symbol in the library .map file for this
tracepoint to be used out of the library, in shared builds. For
example, __app_trace_string will be the exported symbol in the above
example.
---

>
> +1 for not exposing trace point symbols at all.
>
> The trace point symbols are only used internally by DPDK, so they should not be part of DPDK's public API.
>
> It might also make it easier for Bruce to move the trace library out of EAL.
>
> I'm not familiar with the CTF format, but I assume that if we don't expose the trace point symbols, the trace points can still be identified when parsing the trace file.

Yes. It won't impact. The only use case for option 1 is to avoid named lookup.

>
  

Patch

diff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c
index 48090c879a..08e7f49fd8 100644
--- a/lib/ethdev/ethdev_private.c
+++ b/lib/ethdev/ethdev_private.c
@@ -5,6 +5,7 @@ 
 #include <rte_debug.h>
 
 #include "rte_ethdev.h"
+#include "rte_ethdev_trace.h"
 #include "ethdev_driver.h"
 #include "ethdev_private.h"
 
@@ -297,6 +298,7 @@  rte_eth_call_rx_callbacks(uint16_t port_id, uint16_t queue_id,
 		cb = cb->next;
 	}
 
+	rte_eth_trace_call_rx_callbacks(port_id, queue_id, nb_rx, nb_pkts);
 	return nb_rx;
 }
 
@@ -312,6 +314,7 @@  rte_eth_call_tx_callbacks(uint16_t port_id, uint16_t queue_id,
 		cb = cb->next;
 	}
 
+	rte_eth_trace_call_tx_callbacks(port_id, queue_id, nb_pkts);
 	return nb_pkts;
 }
 
diff --git a/lib/ethdev/ethdev_trace_points.c b/lib/ethdev/ethdev_trace_points.c
index 2919409a15..2c06b47b7f 100644
--- a/lib/ethdev/ethdev_trace_points.c
+++ b/lib/ethdev/ethdev_trace_points.c
@@ -29,3 +29,438 @@  RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_burst,
 
 RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_burst,
 	lib.ethdev.tx.burst)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_add_first_rx_callback,
+	lib.ethdev.add_first_rx_callback)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_add_rx_callback,
+	lib.ethdev.add_rx_callback)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_add_tx_callback,
+	lib.ethdev.add_tx_callback)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_allmulticast_disable,
+	lib.ethdev.allmulticast_disable)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_allmulticast_enable,
+	lib.ethdev.allmulticast_enable)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_allmulticast_get,
+	lib.ethdev.allmulticast_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_call_rx_callbacks,
+	lib.ethdev.call_rx_callbacks)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_call_tx_callbacks,
+	lib.ethdev.call_tx_callbacks)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_mtu,
+	lib.ethdev.set_mtu)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_adjust_nb_rx_tx_desc,
+	lib.ethdev.adjust_nb_rx_tx_desc)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_callback_register,
+	lib.ethdev.callback_register)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_callback_unregister,
+	lib.ethdev.callback_unregister)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_default_mac_addr_set,
+	lib.ethdev.default_mac_addr_set)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_flow_ctrl_get,
+	lib.ethdev.flow_ctrl_get)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_flow_ctrl_set,
+	lib.ethdev.flow_ctrl_set)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_fw_version_get,
+	lib.ethdev.fw_version_get)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_dcb_info,
+	lib.ethdev.get_dcb_info)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_eeprom,
+	lib.ethdev.get_eeprom)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_eeprom_length,
+	lib.ethdev.get_eeprom_length)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_mtu,
+	lib.ethdev.get_mtu)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_count_avail,
+	lib.ethdev.count_avail)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_count_total,
+	lib.ethdev.count_total)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_name_by_port,
+	lib.ethdev.get_name_by_port)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_port_by_name,
+	lib.ethdev.get_port_by_name)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_reg_info,
+	lib.ethdev.get_reg_info)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_sec_ctx,
+	lib.ethdev.get_sec_ctx)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_supported_ptypes,
+	lib.ethdev.get_supported_ptypes)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_vlan_offload,
+	lib.ethdev.get_vlan_offload)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_info_get,
+	lib.ethdev.info_get)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_is_removed,
+	lib.ethdev.is_removed)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_is_valid_port,
+	lib.ethdev.is_valid_port)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_mac_addr_add,
+	lib.ethdev.mac_addr_add)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_mac_addr_remove,
+	lib.ethdev.mac_addr_remove)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_pool_ops_supported,
+	lib.ethdev.pool_ops_supported)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priority_flow_ctrl_set,
+	lib.ethdev.priority_flow_ctrl_set)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_reset,
+	lib.ethdev.reset)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_hash_conf_get,
+	lib.ethdev.rss_hash_conf_get)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_hash_update,
+	lib.ethdev.rss_hash_update)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_reta_query,
+	lib.ethdev.rss_reta_query)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rss_reta_update,
+	lib.ethdev.rss_reta_update)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_ctl,
+	lib.ethdev.rx_intr_ctl)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_ctl_q,
+	lib.ethdev.rx_intr_ctl_q)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_ctl_q_get_fd,
+	lib.ethdev.rx_intr_ctl_q_get_fd)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_disable,
+	lib.ethdev.rx_intr_disable)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_intr_enable,
+	lib.ethdev.rx_intr_enable)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_offload_name,
+	lib.ethdev.rx_offload_name)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_queue_start,
+	lib.ethdev.rx_queue_start)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_rx_queue_stop,
+	lib.ethdev.rx_queue_stop)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_eeprom,
+	lib.ethdev.set_eeprom)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_link_down,
+	lib.ethdev.set_link_down)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_link_up,
+	lib.ethdev.set_link_up)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_mc_addr_list,
+	lib.ethdev.set_mc_addr_list)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_ptypes,
+	lib.ethdev.set_ptypes)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_rx_queue_stats_mapping,
+	lib.ethdev.set_rx_queue_stats_mapping)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_tx_queue_stats_mapping,
+	lib.ethdev.set_tx_queue_stats_mapping)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_ether_type,
+	lib.ethdev.set_vlan_ether_type)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_offload,
+	lib.ethdev.set_vlan_offload)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_pvid,
+	lib.ethdev.set_vlan_pvid)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_set_vlan_strip_on_queue,
+	lib.ethdev.set_vlan_strip_on_queue)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_socket_id,
+	lib.ethdev.socket_id)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_offload_name,
+	lib.ethdev.tx_offload_name)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_queue_start,
+	lib.ethdev.tx_queue_start)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_tx_queue_stop,
+	lib.ethdev.tx_queue_stop)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_uc_all_hash_table_set,
+	lib.ethdev.uc_all_hash_table_set)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_uc_hash_table_set,
+	lib.ethdev.uc_hash_table_set)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_udp_tunnel_port_add,
+	lib.ethdev.udp_tunnel_port_add)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_udp_tunnel_port_delete,
+	lib.ethdev.udp_tunnel_port_delete)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_vlan_filter,
+	lib.ethdev.vlan_filter)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next,
+	lib.ethdev.find_next)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next_of,
+	lib.ethdev.find_next_of)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next_owned_by,
+	lib.ethdev.find_next_owned_by)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_find_next_sibling,
+	lib.ethdev.find_next_sibling)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_iterator_cleanup,
+	lib.ethdev.iterator_cleanup)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_iterator_init,
+	lib.ethdev.iterator_init)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_iterator_next,
+	lib.ethdev.iterator_next)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_led_off,
+	lib.ethdev.led_off)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_led_on,
+	lib.ethdev.led_on)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_get,
+	lib.ethdev.link_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_get_nowait,
+	lib.ethdev.link_get_nowait)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_macaddr_get,
+	lib.ethdev.macaddr_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_promiscuous_disable,
+	lib.ethdev.promiscuous_disable)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_promiscuous_enable,
+	lib.ethdev.promiscuous_enable)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_promiscuous_get,
+	lib.ethdev.promiscuous_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_remove_rx_callback,
+	lib.ethdev.remove_rx_callback)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_remove_tx_callback,
+	lib.ethdev.remove_tx_callback)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_burst_mode_get,
+	lib.ethdev.rx_burst_mode_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_queue_info_get,
+	lib.ethdev.rx_queue_info_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_queue_setup,
+	lib.ethdev.rx_queue_setup)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_set_queue_rate_limit,
+	lib.ethdev.set_queue_rate_limit)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_speed_bitflag,
+	lib.ethdev.speed_bitflag)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_get,
+	lib.ethdev.stats_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_reset,
+	lib.ethdev.stats_reset)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_adjust_time,
+	lib.ethdev.timesync_adjust_time)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_disable,
+	lib.ethdev.timesync_disable)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_enable,
+	lib.ethdev.timesync_enable)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_read_rx_timestamp,
+	lib.ethdev.timesync_read_rx_timestamp)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_read_time,
+	lib.ethdev.timesync_read_time)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_read_tx_timestamp,
+	lib.ethdev.timesync_read_tx_timestamp)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_timesync_write_time,
+	lib.ethdev.timesync_write_time)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_count_callback,
+	lib.ethdev.tx_buffer_count_callback)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_drop_callback,
+	lib.ethdev.tx_buffer_drop_callback)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_init,
+	lib.ethdev.tx_buffer_init)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_buffer_set_err_callback,
+	lib.ethdev.tx_buffer_set_err_callback)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_burst_mode_get,
+	lib.ethdev.tx_burst_mode_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_done_cleanup,
+	lib.ethdev.tx_done_cleanup)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_queue_info_get,
+	lib.ethdev.tx_queue_info_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get,
+	lib.ethdev.xstats_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_by_id,
+	lib.ethdev.xstats_get_by_id)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_id_by_name,
+	lib.ethdev.xstats_get_id_by_name)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_names,
+	lib.ethdev.xstats_get_names)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_get_names_by_id,
+	lib.ethdev.xstats_get_names_by_id)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_xstats_reset,
+	lib.ethdev.xstats_reset)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_delete,
+	lib.ethdev.owner_delete)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_get,
+	lib.ethdev.owner_get)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_new,
+	lib.ethdev.owner_new)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_set,
+	lib.ethdev.owner_set)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_owner_unset,
+	lib.ethdev.owner_unset)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_module_eeprom,
+	lib.ethdev.get_module_eeprom)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_get_module_info,
+	lib.ethdev.get_module_info)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_read_clock,
+	lib.ethdev.read_clock)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_hairpin_capability_get,
+	lib.ethdev.hairpin_capability_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_hairpin_queue_setup,
+	lib.ethdev.rx.hairpin_queue_setup)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_hairpin_queue_setup,
+	lib.ethdev.tx.hairpin_queue_setup)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_hairpin_bind,
+	lib.ethdev.hairpin_bind)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_hairpin_get_peer_ports,
+	lib.ethdev.hairpin_get_peer_ports)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_hairpin_unbind,
+	lib.ethdev.hairpin_unbind)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_speed_to_str,
+	lib.ethdev.link_speed_to_str)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_to_str,
+	lib.ethdev.link_to_str)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_fec_get_capability,
+	lib.ethdev.fec_get_capability)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_fec_get,
+	lib.ethdev.fec_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_fec_set,
+	lib.ethdev.fec_set)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_get_monitor_addr,
+	lib.ethdev.get_monitor_addr)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_representor_info_get,
+	lib.ethdev.representor_info_get)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_capability_name,
+	lib.ethdev.capability_name)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_conf_get,
+	lib.ethdev.conf_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_macaddrs_get,
+	lib.ethdev.macaddrs_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_metadata_negotiate,
+	lib.ethdev.rx_metadata_negotiate)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priority_flow_ctrl_queue_configure,
+	lib.ethdev.priority_flow_ctrl_queue_configure)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priority_flow_ctrl_queue_info_get,
+	lib.ethdev.priority_flow_ctrl_queue_info_get)
+
+RTE_TRACE_POINT_REGISTER(rte_ethdev_trace_priv_dump,
+	lib.ethdev.priv_dump)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_ip_reassembly_capability_get,
+	lib.ethdev.ip_reassembly_capability_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_ip_reassembly_conf_get,
+	lib.ethdev.ip_reassembly_conf_get)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_ip_reassembly_conf_set,
+	lib.ethdev.ip_reassembly_conf_set)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_avail_thresh_query,
+	lib.ethdev.rx_avail_thresh_query)
+
+RTE_TRACE_POINT_REGISTER(rte_eth_trace_rx_avail_thresh_set,
+	lib.ethdev.rx_avail_thresh_set)
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 01c141a039..f66d3ecd0a 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -182,6 +182,8 @@  rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str)
 	memset(iter, 0, sizeof(*iter));
 	memset(&devargs, 0, sizeof(devargs));
 
+	rte_eth_trace_iterator_init(iter, devargs_str);
+
 	/*
 	 * The devargs string may use various syntaxes:
 	 *   - 0000:08:00.0,representor=[1-3]
@@ -283,6 +285,8 @@  rte_eth_iterator_next(struct rte_dev_iterator *iter)
 	if (iter->cls == NULL) /* invalid ethdev iterator */
 		return RTE_MAX_ETHPORTS;
 
+	rte_eth_trace_iterator_next(iter);
+
 	do { /* loop to try all matching rte_device */
 		/* If not pure ethdev filter and */
 		if (iter->bus != NULL &&
@@ -316,6 +320,7 @@  rte_eth_iterator_cleanup(struct rte_dev_iterator *iter)
 
 	if (iter->bus_str == NULL)
 		return; /* nothing to free in pure class filter */
+	rte_eth_trace_iterator_cleanup(iter);
 	free(RTE_CAST_FIELD(iter, bus_str, char *)); /* workaround const */
 	free(RTE_CAST_FIELD(iter, cls_str, char *)); /* workaround const */
 	memset(iter, 0, sizeof(*iter));
@@ -331,6 +336,7 @@  rte_eth_find_next(uint16_t port_id)
 	if (port_id >= RTE_MAX_ETHPORTS)
 		return RTE_MAX_ETHPORTS;
 
+	rte_eth_trace_find_next(port_id);
 	return port_id;
 }
 
@@ -351,6 +357,7 @@  rte_eth_find_next_of(uint16_t port_id, const struct rte_device *parent)
 			rte_eth_devices[port_id].device != parent)
 		port_id = rte_eth_find_next(port_id + 1);
 
+	rte_eth_trace_find_next_of(port_id, parent);
 	return port_id;
 }
 
@@ -358,6 +365,7 @@  uint16_t
 rte_eth_find_next_sibling(uint16_t port_id, uint16_t ref_port_id)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(ref_port_id, RTE_MAX_ETHPORTS);
+	rte_eth_trace_find_next_sibling(port_id, ref_port_id);
 	return rte_eth_find_next_of(port_id,
 			rte_eth_devices[ref_port_id].device);
 }
@@ -371,6 +379,7 @@  eth_dev_is_allocated(const struct rte_eth_dev *ethdev)
 int
 rte_eth_dev_is_valid_port(uint16_t port_id)
 {
+	rte_ethdev_trace_is_valid_port(port_id);
 	if (port_id >= RTE_MAX_ETHPORTS ||
 	    (rte_eth_devices[port_id].state == RTE_ETH_DEV_UNUSED))
 		return 0;
@@ -395,6 +404,7 @@  rte_eth_find_next_owned_by(uint16_t port_id, const uint64_t owner_id)
 			rte_eth_devices[port_id].data->owner.id != owner_id)
 		port_id = rte_eth_find_next(port_id + 1);
 
+	rte_eth_trace_find_next_owned_by(port_id, owner_id);
 	return port_id;
 }
 
@@ -413,6 +423,7 @@  rte_eth_dev_owner_new(uint64_t *owner_id)
 	*owner_id = eth_dev_shared_data->next_owner_id++;
 
 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
+	rte_ethdev_trace_owner_new(*owner_id);
 	return 0;
 }
 
@@ -476,6 +487,7 @@  rte_eth_dev_owner_set(const uint16_t port_id,
 	ret = eth_dev_owner_set(port_id, RTE_ETH_DEV_NO_OWNER, owner);
 
 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
+	rte_ethdev_trace_owner_set(port_id, owner, ret);
 	return ret;
 }
 
@@ -493,6 +505,7 @@  rte_eth_dev_owner_unset(const uint16_t port_id, const uint64_t owner_id)
 	ret = eth_dev_owner_set(port_id, owner_id, &new_owner);
 
 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
+	rte_ethdev_trace_owner_unset(port_id, owner_id, ret);
 	return ret;
 }
 
@@ -526,6 +539,7 @@  rte_eth_dev_owner_delete(const uint64_t owner_id)
 
 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
 
+	rte_ethdev_trace_owner_delete(owner_id, ret);
 	return ret;
 }
 
@@ -555,6 +569,7 @@  rte_eth_dev_owner_get(const uint16_t port_id, struct rte_eth_dev_owner *owner)
 	rte_memcpy(owner, &ethdev->data->owner, sizeof(*owner));
 	rte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);
 
+	rte_ethdev_trace_owner_get(port_id, owner);
 	return 0;
 }
 
@@ -562,6 +577,7 @@  int
 rte_eth_dev_socket_id(uint16_t port_id)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
+	rte_ethdev_trace_socket_id(port_id);
 	return rte_eth_devices[port_id].data->numa_node;
 }
 
@@ -569,6 +585,7 @@  void *
 rte_eth_dev_get_sec_ctx(uint16_t port_id)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, NULL);
+	rte_ethdev_trace_get_sec_ctx(port_id);
 	return rte_eth_devices[port_id].security_ctx;
 }
 
@@ -583,6 +600,7 @@  rte_eth_dev_count_avail(void)
 	RTE_ETH_FOREACH_DEV(p)
 		count++;
 
+	rte_ethdev_trace_count_avail(count);
 	return count;
 }
 
@@ -594,6 +612,7 @@  rte_eth_dev_count_total(void)
 	RTE_ETH_FOREACH_VALID_DEV(port)
 		count++;
 
+	rte_ethdev_trace_count_total(count);
 	return count;
 }
 
@@ -614,6 +633,7 @@  rte_eth_dev_get_name_by_port(uint16_t port_id, char *name)
 	 * because it might be overwritten by VDEV PMD */
 	tmp = eth_dev_shared_data->data[port_id].name;
 	strcpy(name, tmp);
+	rte_ethdev_trace_get_name_by_port(port_id, name);
 	return 0;
 }
 
@@ -636,6 +656,7 @@  rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id)
 	RTE_ETH_FOREACH_VALID_DEV(pid)
 		if (!strcmp(name, eth_dev_shared_data->data[pid].name)) {
 			*port_id = pid;
+			rte_ethdev_trace_get_port_by_name(name, *port_id);
 			return 0;
 		}
 
@@ -737,6 +758,7 @@  rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id)
 		return 0;
 	}
 
+	rte_ethdev_trace_rx_queue_start(port_id, rx_queue_id);
 	return eth_err(port_id, dev->dev_ops->rx_queue_start(dev, rx_queue_id));
 }
 
@@ -770,6 +792,7 @@  rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id)
 		return 0;
 	}
 
+	rte_ethdev_trace_rx_queue_stop(port_id, rx_queue_id);
 	return eth_err(port_id, dev->dev_ops->rx_queue_stop(dev, rx_queue_id));
 }
 
@@ -810,6 +833,7 @@  rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id)
 		return 0;
 	}
 
+	rte_ethdev_trace_tx_queue_start(port_id, tx_queue_id);
 	return eth_err(port_id, dev->dev_ops->tx_queue_start(dev, tx_queue_id));
 }
 
@@ -843,12 +867,14 @@  rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id)
 		return 0;
 	}
 
+	rte_ethdev_trace_tx_queue_stop(port_id, tx_queue_id);
 	return eth_err(port_id, dev->dev_ops->tx_queue_stop(dev, tx_queue_id));
 }
 
 uint32_t
 rte_eth_speed_bitflag(uint32_t speed, int duplex)
 {
+	rte_eth_trace_speed_bitflag(speed, duplex);
 	switch (speed) {
 	case RTE_ETH_SPEED_NUM_10M:
 		return duplex ? RTE_ETH_LINK_SPEED_10M : RTE_ETH_LINK_SPEED_10M_HD;
@@ -894,6 +920,7 @@  rte_eth_dev_rx_offload_name(uint64_t offload)
 		}
 	}
 
+	rte_ethdev_trace_rx_offload_name(offload, name);
 	return name;
 }
 
@@ -910,6 +937,7 @@  rte_eth_dev_tx_offload_name(uint64_t offload)
 		}
 	}
 
+	rte_ethdev_trace_tx_offload_name(offload, name);
 	return name;
 }
 
@@ -926,6 +954,7 @@  rte_eth_dev_capability_name(uint64_t capability)
 		}
 	}
 
+	rte_ethdev_trace_capability_name(capability, name);
 	return name;
 }
 
@@ -1552,6 +1581,7 @@  rte_eth_dev_set_link_up(uint16_t port_id)
 
 	if (*dev->dev_ops->dev_set_link_up == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_set_link_up(port_id);
 	return eth_err(port_id, (*dev->dev_ops->dev_set_link_up)(dev));
 }
 
@@ -1565,6 +1595,7 @@  rte_eth_dev_set_link_down(uint16_t port_id)
 
 	if (*dev->dev_ops->dev_set_link_down == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_set_link_down(port_id);
 	return eth_err(port_id, (*dev->dev_ops->dev_set_link_down)(dev));
 }
 
@@ -1621,6 +1652,7 @@  rte_eth_dev_reset(uint16_t port_id)
 			port_id, rte_strerror(-ret));
 	}
 	ret = dev->dev_ops->dev_reset(dev);
+	rte_ethdev_trace_reset(port_id, ret);
 
 	return eth_err(port_id, ret);
 }
@@ -1645,6 +1677,7 @@  rte_eth_dev_is_removed(uint16_t port_id)
 		/* Device is physically removed. */
 		dev->state = RTE_ETH_DEV_REMOVED;
 
+	rte_ethdev_trace_is_removed(port_id, ret);
 	return ret;
 }
 
@@ -1984,6 +2017,8 @@  rte_eth_rx_hairpin_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 	if (ret == 0)
 		dev->data->rx_queue_state[rx_queue_id] =
 			RTE_ETH_QUEUE_STATE_HAIRPIN;
+	rte_eth_trace_rx_hairpin_queue_setup(port_id, rx_queue_id, nb_rx_desc,
+					     conf, ret);
 	return eth_err(port_id, ret);
 }
 
@@ -2151,6 +2186,7 @@  rte_eth_tx_hairpin_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 	if (ret == 0)
 		dev->data->tx_queue_state[tx_queue_id] =
 			RTE_ETH_QUEUE_STATE_HAIRPIN;
+	rte_eth_trace_tx_hairpin_queue_setup(port_id, tx_queue_id, nb_tx_desc, conf, ret);
 	return eth_err(port_id, ret);
 }
 
@@ -2176,6 +2212,7 @@  rte_eth_hairpin_bind(uint16_t tx_port, uint16_t rx_port)
 			       " to Rx %d (%d - all ports)\n",
 			       tx_port, rx_port, RTE_MAX_ETHPORTS);
 
+	rte_eth_trace_hairpin_bind(tx_port, rx_port, ret);
 	return ret;
 }
 
@@ -2201,6 +2238,7 @@  rte_eth_hairpin_unbind(uint16_t tx_port, uint16_t rx_port)
 			       " from Rx %d (%d - all ports)\n",
 			       tx_port, rx_port, RTE_MAX_ETHPORTS);
 
+	rte_eth_trace_hairpin_unbind(tx_port, rx_port, ret);
 	return ret;
 }
 
@@ -2237,6 +2275,7 @@  rte_eth_hairpin_get_peer_ports(uint16_t port_id, uint16_t *peer_ports,
 		RTE_ETHDEV_LOG(ERR, "Failed to get %d hairpin peer %s ports\n",
 			       port_id, direction ? "Rx" : "Tx");
 
+	rte_eth_trace_hairpin_get_peer_ports(port_id, peer_ports, len, direction, ret);
 	return ret;
 }
 
@@ -2244,6 +2283,7 @@  void
 rte_eth_tx_buffer_drop_callback(struct rte_mbuf **pkts, uint16_t unsent,
 		void *userdata __rte_unused)
 {
+	rte_eth_trace_tx_buffer_drop_callback(pkts, unsent);
 	rte_pktmbuf_free_bulk(pkts, unsent);
 }
 
@@ -2255,6 +2295,7 @@  rte_eth_tx_buffer_count_callback(struct rte_mbuf **pkts, uint16_t unsent,
 
 	rte_pktmbuf_free_bulk(pkts, unsent);
 	*count += unsent;
+	rte_eth_trace_tx_buffer_count_callback(pkts, unsent, *count);
 }
 
 int
@@ -2267,6 +2308,7 @@  rte_eth_tx_buffer_set_err_callback(struct rte_eth_dev_tx_buffer *buffer,
 		return -EINVAL;
 	}
 
+	rte_eth_trace_tx_buffer_set_err_callback(buffer, cbfn, userdata);
 	buffer->error_callback = cbfn;
 	buffer->error_userdata = userdata;
 	return 0;
@@ -2288,6 +2330,7 @@  rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer *buffer, uint16_t size)
 			buffer, rte_eth_tx_buffer_drop_callback, NULL);
 	}
 
+	rte_eth_trace_tx_buffer_init(buffer, size, ret);
 	return ret;
 }
 
@@ -2306,6 +2349,7 @@  rte_eth_tx_done_cleanup(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt)
 	/* Call driver to free pending mbufs. */
 	ret = (*dev->dev_ops->tx_done_cleanup)(dev->data->tx_queues[queue_id],
 					       free_cnt);
+	rte_eth_trace_tx_done_cleanup(port_id, queue_id, free_cnt, ret);
 	return eth_err(port_id, ret);
 }
 
@@ -2327,6 +2371,7 @@  rte_eth_promiscuous_enable(uint16_t port_id)
 	diag = (*dev->dev_ops->promiscuous_enable)(dev);
 	dev->data->promiscuous = (diag == 0) ? 1 : 0;
 
+	rte_eth_trace_promiscuous_enable(port_id, dev->data->promiscuous);
 	return eth_err(port_id, diag);
 }
 
@@ -2350,6 +2395,7 @@  rte_eth_promiscuous_disable(uint16_t port_id)
 	if (diag != 0)
 		dev->data->promiscuous = 1;
 
+	rte_eth_trace_promiscuous_disable(port_id, dev->data->promiscuous);
 	return eth_err(port_id, diag);
 }
 
@@ -2361,6 +2407,7 @@  rte_eth_promiscuous_get(uint16_t port_id)
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
+	rte_eth_trace_promiscuous_get(port_id, dev->data->promiscuous);
 	return dev->data->promiscuous;
 }
 
@@ -2381,6 +2428,7 @@  rte_eth_allmulticast_enable(uint16_t port_id)
 	diag = (*dev->dev_ops->allmulticast_enable)(dev);
 	dev->data->all_multicast = (diag == 0) ? 1 : 0;
 
+	rte_eth_trace_allmulticast_enable(port_id, dev->data->all_multicast);
 	return eth_err(port_id, diag);
 }
 
@@ -2403,6 +2451,7 @@  rte_eth_allmulticast_disable(uint16_t port_id)
 	if (diag != 0)
 		dev->data->all_multicast = 1;
 
+	rte_eth_trace_allmulticast_disable(port_id, dev->data->all_multicast);
 	return eth_err(port_id, diag);
 }
 
@@ -2414,6 +2463,7 @@  rte_eth_allmulticast_get(uint16_t port_id)
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
+	rte_eth_trace_allmulticast_get(port_id, dev->data->all_multicast);
 	return dev->data->all_multicast;
 }
 
@@ -2440,6 +2490,7 @@  rte_eth_link_get(uint16_t port_id, struct rte_eth_link *eth_link)
 		*eth_link = dev->data->dev_link;
 	}
 
+	rte_eth_trace_link_get(port_id, eth_link);
 	return 0;
 }
 
@@ -2466,12 +2517,14 @@  rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *eth_link)
 		*eth_link = dev->data->dev_link;
 	}
 
+	rte_eth_trace_link_get_nowait(port_id, eth_link);
 	return 0;
 }
 
 const char *
 rte_eth_link_speed_to_str(uint32_t link_speed)
 {
+	rte_eth_trace_link_speed_to_str(link_speed);
 	switch (link_speed) {
 	case RTE_ETH_SPEED_NUM_NONE: return "None";
 	case RTE_ETH_SPEED_NUM_10M:  return "10 Mbps";
@@ -2511,6 +2564,7 @@  rte_eth_link_to_str(char *str, size_t len, const struct rte_eth_link *eth_link)
 		return -EINVAL;
 	}
 
+	rte_eth_trace_link_to_str(str, len, eth_link);
 	if (eth_link->link_status == RTE_ETH_LINK_DOWN)
 		return snprintf(str, len, "Link down");
 	else
@@ -2541,6 +2595,7 @@  rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats)
 	if (*dev->dev_ops->stats_get == NULL)
 		return -ENOTSUP;
 	stats->rx_nombuf = dev->data->rx_mbuf_alloc_failed;
+	rte_eth_trace_stats_get(port_id, stats);
 	return eth_err(port_id, (*dev->dev_ops->stats_get)(dev, stats));
 }
 
@@ -2561,6 +2616,7 @@  rte_eth_stats_reset(uint16_t port_id)
 
 	dev->data->rx_mbuf_alloc_failed = 0;
 
+	rte_eth_trace_stats_reset(port_id);
 	return 0;
 }
 
@@ -2625,6 +2681,7 @@  rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,
 		return -ENOMEM;
 	}
 
+	rte_eth_trace_xstats_get_id_by_name(port_id, xstat_name, id);
 	/* Get count */
 	cnt_xstats = rte_eth_xstats_get_names_by_id(port_id, NULL, 0, NULL);
 	if (cnt_xstats  < 0) {
@@ -2797,6 +2854,8 @@  rte_eth_xstats_get_names_by_id(uint16_t port_id,
 			return -1;
 		}
 		xstats_names[i] = xstats_names_copy[ids[i]];
+		rte_eth_trace_xstats_get_names_by_id(port_id, &xstats_names[i],
+						     ids[i]);
 	}
 
 	free(xstats_names_copy);
@@ -2836,6 +2895,7 @@  rte_eth_xstats_get_names(uint16_t port_id,
 		cnt_used_entries += cnt_driver_entries;
 	}
 
+	rte_eth_trace_xstats_get_names(port_id, xstats_names, size, cnt_used_entries);
 	return cnt_used_entries;
 }
 
@@ -2985,6 +3045,7 @@  rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 		}
 		values[i] = xstats[ids[i]].value;
 	}
+	rte_eth_trace_xstats_get_by_id(port_id, ids, values, size);
 	return size;
 }
 
@@ -3032,6 +3093,8 @@  rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
 	for ( ; i < count + xcount; i++)
 		xstats[i].id += count;
 
+	for (i = 0; i < n; i++)
+		rte_eth_trace_xstats_get(port_id, xstats[i], i);
 	return count + xcount;
 }
 
@@ -3044,6 +3107,7 @@  rte_eth_xstats_reset(uint16_t port_id)
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
+	rte_eth_trace_xstats_reset(port_id);
 	/* implemented by the driver */
 	if (dev->dev_ops->xstats_reset != NULL)
 		return eth_err(port_id, (*dev->dev_ops->xstats_reset)(dev));
@@ -3079,6 +3143,8 @@  int
 rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id, uint16_t tx_queue_id,
 		uint8_t stat_idx)
 {
+	rte_ethdev_trace_set_tx_queue_stats_mapping(port_id, tx_queue_id,
+						    stat_idx);
 	return eth_err(port_id, eth_dev_set_queue_stats_mapping(port_id,
 						tx_queue_id,
 						stat_idx, STAT_QMAP_TX));
@@ -3088,6 +3154,8 @@  int
 rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id, uint16_t rx_queue_id,
 		uint8_t stat_idx)
 {
+	rte_ethdev_trace_set_rx_queue_stats_mapping(port_id, rx_queue_id,
+						    stat_idx);
 	return eth_err(port_id, eth_dev_set_queue_stats_mapping(port_id,
 						rx_queue_id,
 						stat_idx, STAT_QMAP_RX));
@@ -3110,6 +3178,7 @@  rte_eth_dev_fw_version_get(uint16_t port_id, char *fw_version, size_t fw_size)
 
 	if (*dev->dev_ops->fw_version_get == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_fw_version_get(port_id, fw_version, fw_size);
 	return eth_err(port_id, (*dev->dev_ops->fw_version_get)(dev,
 							fw_version, fw_size));
 }
@@ -3171,6 +3240,7 @@  rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info)
 
 	dev_info->dev_flags = &dev->data->dev_flags;
 
+	rte_ethdev_trace_info_get(port_id, dev_info);
 	return 0;
 }
 
@@ -3191,6 +3261,7 @@  rte_eth_dev_conf_get(uint16_t port_id, struct rte_eth_conf *dev_conf)
 
 	memcpy(dev_conf, &dev->data->dev_conf, sizeof(struct rte_eth_conf));
 
+	rte_ethdev_trace_conf_get(port_id, dev_conf);
 	return 0;
 }
 
@@ -3226,6 +3297,7 @@  rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,
 			j++;
 		}
 
+	rte_ethdev_trace_get_supported_ptypes(port_id, ptype_mask, ptypes, num, j);
 	return j;
 }
 
@@ -3310,6 +3382,7 @@  rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t ptype_mask,
 	if (set_ptypes != NULL && j < num)
 		set_ptypes[j] = RTE_PTYPE_UNKNOWN;
 
+	rte_ethdev_trace_set_ptypes(port_id, ptype_mask, set_ptypes, num);
 	return (*dev->dev_ops->dev_ptypes_set)(dev, ptype_mask);
 
 ptype_unknown:
@@ -3341,6 +3414,7 @@  rte_eth_macaddrs_get(uint16_t port_id, struct rte_ether_addr *ma,
 	num = RTE_MIN(dev_info.max_mac_addrs, num);
 	memcpy(ma, dev->data->mac_addrs, num * sizeof(ma[0]));
 
+	rte_eth_trace_macaddrs_get(port_id, ma, num);
 	return num;
 }
 
@@ -3359,6 +3433,7 @@  rte_eth_macaddr_get(uint16_t port_id, struct rte_ether_addr *mac_addr)
 		return -EINVAL;
 	}
 
+	rte_eth_trace_macaddr_get(port_id, mac_addr);
 	rte_ether_addr_copy(&dev->data->mac_addrs[0], mac_addr);
 
 	return 0;
@@ -3379,6 +3454,7 @@  rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu)
 	}
 
 	*mtu = dev->data->mtu;
+	rte_ethdev_trace_get_mtu(port_id, *mtu);
 	return 0;
 }
 
@@ -3421,6 +3497,7 @@  rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu)
 	if (ret == 0)
 		dev->data->mtu = mtu;
 
+	rte_ethdev_trace_set_mtu(port_id, mtu, ret);
 	return eth_err(port_id, ret);
 }
 
@@ -3464,6 +3541,7 @@  rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on)
 			vfc->ids[vidx] &= ~RTE_BIT64(vbit);
 	}
 
+	rte_ethdev_trace_vlan_filter(port_id, vlan_id, on, ret);
 	return eth_err(port_id, ret);
 }
 
@@ -3483,6 +3561,7 @@  rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
 
 	if (*dev->dev_ops->vlan_strip_queue_set == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_set_vlan_strip_on_queue(port_id, rx_queue_id, on);
 	(*dev->dev_ops->vlan_strip_queue_set)(dev, rx_queue_id, on);
 
 	return 0;
@@ -3500,6 +3579,7 @@  rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
 
 	if (*dev->dev_ops->vlan_tpid_set == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_set_vlan_ether_type(port_id, vlan_type, tpid);
 	return eth_err(port_id, (*dev->dev_ops->vlan_tpid_set)(dev, vlan_type,
 							       tpid));
 }
@@ -3593,6 +3673,7 @@  rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
 		dev->data->dev_conf.rxmode.offloads = orig_offloads;
 	}
 
+	rte_ethdev_trace_set_vlan_offload(port_id, offload_mask, ret);
 	return eth_err(port_id, ret);
 }
 
@@ -3619,6 +3700,7 @@  rte_eth_dev_get_vlan_offload(uint16_t port_id)
 	if (*dev_offloads & RTE_ETH_RX_OFFLOAD_QINQ_STRIP)
 		ret |= RTE_ETH_QINQ_STRIP_OFFLOAD;
 
+	rte_ethdev_trace_get_vlan_offload(port_id, ret);
 	return ret;
 }
 
@@ -3632,6 +3714,7 @@  rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on)
 
 	if (*dev->dev_ops->vlan_pvid_set == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_set_vlan_pvid(port_id, pvid, on);
 	return eth_err(port_id, (*dev->dev_ops->vlan_pvid_set)(dev, pvid, on));
 }
 
@@ -3653,6 +3736,7 @@  rte_eth_dev_flow_ctrl_get(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 	if (*dev->dev_ops->flow_ctrl_get == NULL)
 		return -ENOTSUP;
 	memset(fc_conf, 0, sizeof(*fc_conf));
+	rte_ethdev_trace_flow_ctrl_get(port_id, fc_conf);
 	return eth_err(port_id, (*dev->dev_ops->flow_ctrl_get)(dev, fc_conf));
 }
 
@@ -3678,6 +3762,7 @@  rte_eth_dev_flow_ctrl_set(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 
 	if (*dev->dev_ops->flow_ctrl_set == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_flow_ctrl_set(port_id, fc_conf);
 	return eth_err(port_id, (*dev->dev_ops->flow_ctrl_set)(dev, fc_conf));
 }
 
@@ -3702,6 +3787,7 @@  rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
 		return -EINVAL;
 	}
 
+	rte_ethdev_trace_priority_flow_ctrl_set(port_id, pfc_conf);
 	/* High water, low water validation are device specific */
 	if  (*dev->dev_ops->priority_flow_ctrl_set)
 		return eth_err(port_id, (*dev->dev_ops->priority_flow_ctrl_set)
@@ -3774,6 +3860,7 @@  rte_eth_dev_priority_flow_ctrl_queue_info_get(uint16_t port_id,
 		return -EINVAL;
 	}
 
+	rte_ethdev_trace_priority_flow_ctrl_queue_info_get(port_id, pfc_queue_info);
 	if (*dev->dev_ops->priority_flow_ctrl_queue_info_get)
 		return eth_err(port_id, (*dev->dev_ops->priority_flow_ctrl_queue_info_get)
 			(dev, pfc_queue_info));
@@ -3845,6 +3932,8 @@  rte_eth_dev_priority_flow_ctrl_queue_configure(uint16_t port_id,
 			return ret;
 	}
 
+	rte_ethdev_trace_priority_flow_ctrl_queue_configure(port_id,
+							     pfc_queue_conf);
 	if (*dev->dev_ops->priority_flow_ctrl_queue_config)
 		return eth_err(port_id,
 			       (*dev->dev_ops->priority_flow_ctrl_queue_config)(
@@ -3940,6 +4029,7 @@  rte_eth_dev_rss_reta_update(uint16_t port_id,
 
 	if (*dev->dev_ops->reta_update == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_rss_reta_update(port_id, reta_conf, reta_size);
 	return eth_err(port_id, (*dev->dev_ops->reta_update)(dev, reta_conf,
 							     reta_size));
 }
@@ -3969,6 +4059,7 @@  rte_eth_dev_rss_reta_query(uint16_t port_id,
 
 	if (*dev->dev_ops->reta_query == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_rss_reta_query(port_id, reta_conf, reta_size);
 	return eth_err(port_id, (*dev->dev_ops->reta_query)(dev, reta_conf,
 							    reta_size));
 }
@@ -4014,6 +4105,7 @@  rte_eth_dev_rss_hash_update(uint16_t port_id,
 
 	if (*dev->dev_ops->rss_hash_update == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_rss_hash_update(port_id, rss_conf);
 	return eth_err(port_id, (*dev->dev_ops->rss_hash_update)(dev,
 								 rss_conf));
 }
@@ -4036,6 +4128,7 @@  rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
 
 	if (*dev->dev_ops->rss_hash_conf_get == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_rss_hash_conf_get(port_id, rss_conf);
 	return eth_err(port_id, (*dev->dev_ops->rss_hash_conf_get)(dev,
 								   rss_conf));
 }
@@ -4063,6 +4156,7 @@  rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
 
 	if (*dev->dev_ops->udp_tunnel_port_add == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_udp_tunnel_port_add(port_id, udp_tunnel);
 	return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_add)(dev,
 								udp_tunnel));
 }
@@ -4090,6 +4184,7 @@  rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
 
 	if (*dev->dev_ops->udp_tunnel_port_del == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_udp_tunnel_port_delete(port_id, udp_tunnel);
 	return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_del)(dev,
 								udp_tunnel));
 }
@@ -4104,6 +4199,7 @@  rte_eth_led_on(uint16_t port_id)
 
 	if (*dev->dev_ops->dev_led_on == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_led_on(port_id);
 	return eth_err(port_id, (*dev->dev_ops->dev_led_on)(dev));
 }
 
@@ -4117,6 +4213,7 @@  rte_eth_led_off(uint16_t port_id)
 
 	if (*dev->dev_ops->dev_led_off == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_led_off(port_id);
 	return eth_err(port_id, (*dev->dev_ops->dev_led_off)(dev));
 }
 
@@ -4142,6 +4239,7 @@  rte_eth_fec_get_capability(uint16_t port_id,
 		return -ENOTSUP;
 	ret = (*dev->dev_ops->fec_get_capability)(dev, speed_fec_capa, num);
 
+	rte_eth_trace_fec_get_capability(port_id, speed_fec_capa, num, ret);
 	return ret;
 }
 
@@ -4162,6 +4260,7 @@  rte_eth_fec_get(uint16_t port_id, uint32_t *fec_capa)
 
 	if (*dev->dev_ops->fec_get == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_fec_get(port_id, fec_capa);
 	return eth_err(port_id, (*dev->dev_ops->fec_get)(dev, fec_capa));
 }
 
@@ -4175,6 +4274,7 @@  rte_eth_fec_set(uint16_t port_id, uint32_t fec_capa)
 
 	if (*dev->dev_ops->fec_set == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_fec_set(port_id, fec_capa);
 	return eth_err(port_id, (*dev->dev_ops->fec_set)(dev, fec_capa));
 }
 
@@ -4252,6 +4352,7 @@  rte_eth_dev_mac_addr_add(uint16_t port_id, struct rte_ether_addr *addr,
 			return 0;
 	}
 
+	rte_ethdev_trace_mac_addr_add(port_id, addr, pool);
 	/* Update NIC */
 	ret = (*dev->dev_ops->mac_addr_add)(dev, addr, index, pool);
 
@@ -4294,6 +4395,7 @@  rte_eth_dev_mac_addr_remove(uint16_t port_id, struct rte_ether_addr *addr)
 	} else if (index < 0)
 		return 0;  /* Do nothing if address wasn't found */
 
+	rte_ethdev_trace_mac_addr_remove(port_id, addr);
 	/* Update NIC */
 	(*dev->dev_ops->mac_addr_remove)(dev, index);
 
@@ -4329,6 +4431,7 @@  rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr)
 		return -ENOTSUP;
 
 	ret = (*dev->dev_ops->mac_addr_set)(dev, addr);
+	rte_ethdev_trace_default_mac_addr_set(port_id, addr, ret);
 	if (ret < 0)
 		return ret;
 
@@ -4415,6 +4518,7 @@  rte_eth_dev_uc_hash_table_set(uint16_t port_id, struct rte_ether_addr *addr,
 	if (*dev->dev_ops->uc_hash_table_set == NULL)
 		return -ENOTSUP;
 	ret = (*dev->dev_ops->uc_hash_table_set)(dev, addr, on);
+	rte_ethdev_trace_uc_hash_table_set(port_id, addr, on, ret);
 	if (ret == 0) {
 		/* Update address in NIC data structure */
 		if (on)
@@ -4438,6 +4542,7 @@  rte_eth_dev_uc_all_hash_table_set(uint16_t port_id, uint8_t on)
 
 	if (*dev->dev_ops->uc_all_hash_table_set == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_uc_all_hash_table_set(port_id, on);
 	return eth_err(port_id, (*dev->dev_ops->uc_all_hash_table_set)(dev,
 								       on));
 }
@@ -4475,6 +4580,7 @@  int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
 
 	if (*dev->dev_ops->set_queue_rate_limit == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_set_queue_rate_limit(port_id, queue_idx, tx_rate);
 	return eth_err(port_id, (*dev->dev_ops->set_queue_rate_limit)(dev,
 							queue_idx, tx_rate));
 }
@@ -4502,6 +4608,7 @@  int rte_eth_rx_avail_thresh_set(uint16_t port_id, uint16_t queue_id,
 	}
 	if (*dev->dev_ops->rx_queue_avail_thresh_set == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_rx_avail_thresh_set(port_id, queue_id, avail_thresh);
 	return eth_err(port_id, (*dev->dev_ops->rx_queue_avail_thresh_set)(dev,
 							     queue_id, avail_thresh));
 }
@@ -4521,6 +4628,7 @@  int rte_eth_rx_avail_thresh_query(uint16_t port_id, uint16_t *queue_id,
 
 	if (*dev->dev_ops->rx_queue_avail_thresh_query == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_rx_avail_thresh_query(port_id, *queue_id);
 	return eth_err(port_id, (*dev->dev_ops->rx_queue_avail_thresh_query)(dev,
 							     queue_id, avail_thresh));
 }
@@ -4570,6 +4678,9 @@  rte_eth_dev_callback_register(uint16_t port_id,
 		next_port = last_port = port_id;
 	}
 
+	rte_ethdev_trace_callback_register(port_id, event, cb_fn, cb_arg, next_port,
+					   last_port);
+
 	rte_spinlock_lock(&eth_dev_cb_lock);
 
 	do {
@@ -4665,6 +4776,7 @@  rte_eth_dev_callback_unregister(uint16_t port_id,
 	} while (++next_port <= last_port);
 
 	rte_spinlock_unlock(&eth_dev_cb_lock);
+	rte_ethdev_trace_callback_unregister(port_id, event, cb_fn, cb_arg, ret);
 	return ret;
 }
 
@@ -4694,6 +4806,7 @@  rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
 	for (qid = 0; qid < dev->data->nb_rx_queues; qid++) {
 		vec = rte_intr_vec_list_index_get(intr_handle, qid);
 		rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
+		rte_ethdev_trace_rx_intr_ctl(port_id, epfd, op, data, rc);
 		if (rc && rc != -EEXIST) {
 			RTE_ETHDEV_LOG(ERR,
 				"p %u q %u Rx ctl error op %d epfd %d vec %u\n",
@@ -4737,6 +4850,7 @@  rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id)
 		(vec - RTE_INTR_VEC_RXTX_OFFSET) : vec;
 	fd = rte_intr_efds_index_get(intr_handle, efd_idx);
 
+	rte_ethdev_trace_rx_intr_ctl_q_get_fd(port_id, queue_id, fd);
 	return fd;
 }
 
@@ -4770,6 +4884,7 @@  rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 
 	vec = rte_intr_vec_list_index_get(intr_handle, queue_id);
 	rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
+	rte_ethdev_trace_rx_intr_ctl_q(port_id, queue_id, epfd, op, data, rc);
 	if (rc && rc != -EEXIST) {
 		RTE_ETHDEV_LOG(ERR,
 			"p %u q %u Rx ctl error op %d epfd %d vec %u\n",
@@ -4796,6 +4911,7 @@  rte_eth_dev_rx_intr_enable(uint16_t port_id,
 
 	if (*dev->dev_ops->rx_queue_intr_enable == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_rx_intr_enable(port_id, queue_id);
 	return eth_err(port_id, (*dev->dev_ops->rx_queue_intr_enable)(dev, queue_id));
 }
 
@@ -4815,6 +4931,7 @@  rte_eth_dev_rx_intr_disable(uint16_t port_id,
 
 	if (*dev->dev_ops->rx_queue_intr_disable == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_rx_intr_disable(port_id, queue_id);
 	return eth_err(port_id, (*dev->dev_ops->rx_queue_intr_disable)(dev, queue_id));
 }
 
@@ -4873,6 +4990,7 @@  rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id,
 	}
 	rte_spinlock_unlock(&eth_dev_rx_cb_lock);
 
+	rte_eth_trace_add_rx_callback(port_id, queue_id, fn, user_param, cb);
 	return cb;
 }
 
@@ -4912,6 +5030,7 @@  rte_eth_add_first_rx_callback(uint16_t port_id, uint16_t queue_id,
 		cb, __ATOMIC_RELEASE);
 	rte_spinlock_unlock(&eth_dev_rx_cb_lock);
 
+	rte_eth_trace_add_first_rx_callback(port_id, queue_id, fn, user_param, cb);
 	return cb;
 }
 
@@ -4971,6 +5090,7 @@  rte_eth_add_tx_callback(uint16_t port_id, uint16_t queue_id,
 	}
 	rte_spinlock_unlock(&eth_dev_tx_cb_lock);
 
+	rte_eth_trace_add_tx_callback(port_id, queue_id, fn, user_param, cb);
 	return cb;
 }
 
@@ -5005,6 +5125,7 @@  rte_eth_remove_rx_callback(uint16_t port_id, uint16_t queue_id,
 	}
 	rte_spinlock_unlock(&eth_dev_rx_cb_lock);
 
+	rte_eth_trace_remove_rx_callback(port_id, queue_id, user_cb, ret);
 	return ret;
 }
 
@@ -5039,6 +5160,7 @@  rte_eth_remove_tx_callback(uint16_t port_id, uint16_t queue_id,
 	}
 	rte_spinlock_unlock(&eth_dev_tx_cb_lock);
 
+	rte_eth_trace_remove_tx_callback(port_id, queue_id, user_cb, ret);
 	return ret;
 }
 
@@ -5085,6 +5207,7 @@  rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
 	qinfo->queue_state = dev->data->rx_queue_state[queue_id];
 
+	rte_eth_trace_rx_queue_info_get(port_id, queue_id, qinfo);
 	return 0;
 }
 
@@ -5131,6 +5254,7 @@  rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
 	qinfo->queue_state = dev->data->tx_queue_state[queue_id];
 
+	rte_eth_trace_tx_queue_info_get(port_id, queue_id, qinfo);
 	return 0;
 }
 
@@ -5158,6 +5282,7 @@  rte_eth_rx_burst_mode_get(uint16_t port_id, uint16_t queue_id,
 	if (*dev->dev_ops->rx_burst_mode_get == NULL)
 		return -ENOTSUP;
 	memset(mode, 0, sizeof(*mode));
+	rte_eth_trace_rx_burst_mode_get(port_id, queue_id, mode);
 	return eth_err(port_id,
 		       dev->dev_ops->rx_burst_mode_get(dev, queue_id, mode));
 }
@@ -5186,6 +5311,7 @@  rte_eth_tx_burst_mode_get(uint16_t port_id, uint16_t queue_id,
 	if (*dev->dev_ops->tx_burst_mode_get == NULL)
 		return -ENOTSUP;
 	memset(mode, 0, sizeof(*mode));
+	rte_eth_trace_tx_burst_mode_get(port_id, queue_id, mode);
 	return eth_err(port_id,
 		       dev->dev_ops->tx_burst_mode_get(dev, queue_id, mode));
 }
@@ -5213,6 +5339,7 @@  rte_eth_get_monitor_addr(uint16_t port_id, uint16_t queue_id,
 
 	if (*dev->dev_ops->get_monitor_addr == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_get_monitor_addr(port_id, queue_id, pmc);
 	return eth_err(port_id,
 		dev->dev_ops->get_monitor_addr(dev->data->rx_queues[queue_id], pmc));
 }
@@ -5229,6 +5356,7 @@  rte_eth_dev_set_mc_addr_list(uint16_t port_id,
 
 	if (*dev->dev_ops->set_mc_addr_list == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_set_mc_addr_list(port_id, mc_addr_set, nb_mc_addr);
 	return eth_err(port_id, dev->dev_ops->set_mc_addr_list(dev,
 						mc_addr_set, nb_mc_addr));
 }
@@ -5243,6 +5371,7 @@  rte_eth_timesync_enable(uint16_t port_id)
 
 	if (*dev->dev_ops->timesync_enable == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_timesync_enable(port_id);
 	return eth_err(port_id, (*dev->dev_ops->timesync_enable)(dev));
 }
 
@@ -5256,6 +5385,7 @@  rte_eth_timesync_disable(uint16_t port_id)
 
 	if (*dev->dev_ops->timesync_disable == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_timesync_disable(port_id);
 	return eth_err(port_id, (*dev->dev_ops->timesync_disable)(dev));
 }
 
@@ -5277,6 +5407,7 @@  rte_eth_timesync_read_rx_timestamp(uint16_t port_id, struct timespec *timestamp,
 
 	if (*dev->dev_ops->timesync_read_rx_timestamp == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_timesync_read_rx_timestamp(port_id, timestamp, flags);
 	return eth_err(port_id, (*dev->dev_ops->timesync_read_rx_timestamp)
 				(dev, timestamp, flags));
 }
@@ -5299,6 +5430,7 @@  rte_eth_timesync_read_tx_timestamp(uint16_t port_id,
 
 	if (*dev->dev_ops->timesync_read_tx_timestamp == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_timesync_read_tx_timestamp(port_id, timestamp);
 	return eth_err(port_id, (*dev->dev_ops->timesync_read_tx_timestamp)
 				(dev, timestamp));
 }
@@ -5313,6 +5445,7 @@  rte_eth_timesync_adjust_time(uint16_t port_id, int64_t delta)
 
 	if (*dev->dev_ops->timesync_adjust_time == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_timesync_adjust_time(port_id, delta);
 	return eth_err(port_id, (*dev->dev_ops->timesync_adjust_time)(dev, delta));
 }
 
@@ -5333,6 +5466,7 @@  rte_eth_timesync_read_time(uint16_t port_id, struct timespec *timestamp)
 
 	if (*dev->dev_ops->timesync_read_time == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_timesync_read_time(port_id, timestamp);
 	return eth_err(port_id, (*dev->dev_ops->timesync_read_time)(dev,
 								timestamp));
 }
@@ -5354,6 +5488,7 @@  rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *timestamp)
 
 	if (*dev->dev_ops->timesync_write_time == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_timesync_write_time(port_id, timestamp);
 	return eth_err(port_id, (*dev->dev_ops->timesync_write_time)(dev,
 								timestamp));
 }
@@ -5374,6 +5509,7 @@  rte_eth_read_clock(uint16_t port_id, uint64_t *clock)
 
 	if (*dev->dev_ops->read_clock == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_read_clock(port_id, clock);
 	return eth_err(port_id, (*dev->dev_ops->read_clock)(dev, clock));
 }
 
@@ -5394,6 +5530,7 @@  rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info)
 
 	if (*dev->dev_ops->get_reg == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_get_reg_info(port_id, info);
 	return eth_err(port_id, (*dev->dev_ops->get_reg)(dev, info));
 }
 
@@ -5407,6 +5544,7 @@  rte_eth_dev_get_eeprom_length(uint16_t port_id)
 
 	if (*dev->dev_ops->get_eeprom_length == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_get_eeprom_length(port_id);
 	return eth_err(port_id, (*dev->dev_ops->get_eeprom_length)(dev));
 }
 
@@ -5427,6 +5565,7 @@  rte_eth_dev_get_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 
 	if (*dev->dev_ops->get_eeprom == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_get_eeprom(port_id, info);
 	return eth_err(port_id, (*dev->dev_ops->get_eeprom)(dev, info));
 }
 
@@ -5447,6 +5586,7 @@  rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 
 	if (*dev->dev_ops->set_eeprom == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_set_eeprom(port_id, info);
 	return eth_err(port_id, (*dev->dev_ops->set_eeprom)(dev, info));
 }
 
@@ -5468,6 +5608,7 @@  rte_eth_dev_get_module_info(uint16_t port_id,
 
 	if (*dev->dev_ops->get_module_info == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_get_module_info(port_id, modinfo);
 	return (*dev->dev_ops->get_module_info)(dev, modinfo);
 }
 
@@ -5503,6 +5644,7 @@  rte_eth_dev_get_module_eeprom(uint16_t port_id,
 
 	if (*dev->dev_ops->get_module_eeprom == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_get_module_eeprom(port_id, info);
 	return (*dev->dev_ops->get_module_eeprom)(dev, info);
 }
 
@@ -5526,6 +5668,7 @@  rte_eth_dev_get_dcb_info(uint16_t port_id,
 
 	if (*dev->dev_ops->get_dcb_info == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_get_dcb_info(port_id, dcb_info);
 	return eth_err(port_id, (*dev->dev_ops->get_dcb_info)(dev, dcb_info));
 }
 
@@ -5562,6 +5705,7 @@  rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
 	if (nb_tx_desc != NULL)
 		eth_dev_adjust_nb_desc(nb_tx_desc, &dev_info.tx_desc_lim);
 
+	rte_ethdev_trace_adjust_nb_rx_tx_desc(port_id, *nb_rx_desc, *nb_tx_desc);
 	return 0;
 }
 
@@ -5584,6 +5728,7 @@  rte_eth_dev_hairpin_capability_get(uint16_t port_id,
 	if (*dev->dev_ops->hairpin_cap_get == NULL)
 		return -ENOTSUP;
 	memset(cap, 0, sizeof(*cap));
+	rte_ethdev_trace_hairpin_capability_get(port_id, cap);
 	return eth_err(port_id, (*dev->dev_ops->hairpin_cap_get)(dev, cap));
 }
 
@@ -5605,6 +5750,7 @@  rte_eth_dev_pool_ops_supported(uint16_t port_id, const char *pool)
 	if (*dev->dev_ops->pool_ops_supported == NULL)
 		return 1; /* all pools are supported */
 
+	rte_ethdev_trace_pool_ops_supported(port_id, pool);
 	return (*dev->dev_ops->pool_ops_supported)(dev, pool);
 }
 
@@ -5901,6 +6047,7 @@  rte_eth_representor_info_get(uint16_t port_id,
 
 	if (*dev->dev_ops->representor_info_get == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_representor_info_get(port_id, info);
 	return eth_err(port_id, (*dev->dev_ops->representor_info_get)(dev, info));
 }
 
@@ -5924,6 +6071,7 @@  rte_eth_rx_metadata_negotiate(uint16_t port_id, uint64_t *features)
 		return -EINVAL;
 	}
 
+	rte_eth_trace_rx_metadata_negotiate(port_id, features, *features);
 	if (*dev->dev_ops->rx_metadata_negotiate == NULL)
 		return -ENOTSUP;
 	return eth_err(port_id,
@@ -5956,6 +6104,7 @@  rte_eth_ip_reassembly_capability_get(uint16_t port_id,
 		return -ENOTSUP;
 	memset(reassembly_capa, 0, sizeof(struct rte_eth_ip_reassembly_params));
 
+	rte_eth_trace_ip_reassembly_capability_get(port_id, reassembly_capa);
 	return eth_err(port_id, (*dev->dev_ops->ip_reassembly_capability_get)
 					(dev, reassembly_capa));
 }
@@ -5985,6 +6134,7 @@  rte_eth_ip_reassembly_conf_get(uint16_t port_id,
 	if (*dev->dev_ops->ip_reassembly_conf_get == NULL)
 		return -ENOTSUP;
 	memset(conf, 0, sizeof(struct rte_eth_ip_reassembly_params));
+	rte_eth_trace_ip_reassembly_conf_get(port_id, conf);
 	return eth_err(port_id,
 		       (*dev->dev_ops->ip_reassembly_conf_get)(dev, conf));
 }
@@ -6022,6 +6172,7 @@  rte_eth_ip_reassembly_conf_set(uint16_t port_id,
 
 	if (*dev->dev_ops->ip_reassembly_conf_set == NULL)
 		return -ENOTSUP;
+	rte_eth_trace_ip_reassembly_conf_set(port_id, conf);
 	return eth_err(port_id,
 		       (*dev->dev_ops->ip_reassembly_conf_set)(dev, conf));
 }
@@ -6041,6 +6192,7 @@  rte_eth_dev_priv_dump(uint16_t port_id, FILE *file)
 
 	if (*dev->dev_ops->eth_dev_priv_dump == NULL)
 		return -ENOTSUP;
+	rte_ethdev_trace_priv_dump(port_id);
 	return eth_err(port_id, (*dev->dev_ops->eth_dev_priv_dump)(dev, file));
 }
 
diff --git a/lib/ethdev/rte_ethdev_trace.h b/lib/ethdev/rte_ethdev_trace.h
index 1491c815c3..802f2c1ae1 100644
--- a/lib/ethdev/rte_ethdev_trace.h
+++ b/lib/ethdev/rte_ethdev_trace.h
@@ -88,6 +88,1200 @@  RTE_TRACE_POINT(
 	rte_trace_point_emit_u16(port_id);
 )
 
+RTE_TRACE_POINT(
+	rte_eth_trace_add_first_rx_callback,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		rte_rx_callback_fn fn, void *user_param,
+		struct rte_eth_rxtx_callback *cb),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(fn);
+	rte_trace_point_emit_ptr(user_param);
+	rte_trace_point_emit_ptr(cb);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_add_rx_callback,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		rte_rx_callback_fn fn, void *user_param,
+		struct rte_eth_rxtx_callback *cb),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(fn);
+	rte_trace_point_emit_ptr(user_param);
+	rte_trace_point_emit_ptr(cb);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_add_tx_callback,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		rte_tx_callback_fn fn, void *user_param,
+		struct rte_eth_rxtx_callback *cb),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(fn);
+	rte_trace_point_emit_ptr(user_param);
+	rte_trace_point_emit_ptr(cb);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_allmulticast_disable,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int all_multicast),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(all_multicast);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_allmulticast_enable,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int all_multicast),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(all_multicast);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_allmulticast_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int all_multicast),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(all_multicast);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_mtu,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t mtu, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(mtu);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_adjust_nb_rx_tx_desc,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t nb_rx_desc,
+		uint16_t nb_tx_desc),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(nb_rx_desc);
+	rte_trace_point_emit_u16(nb_tx_desc);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_callback_register,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, enum rte_eth_event_type event,
+		rte_eth_dev_cb_fn cb_fn, void *cb_arg, uint16_t next_port,
+		uint16_t last_port),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(event);
+	rte_trace_point_emit_ptr(cb_fn);
+	rte_trace_point_emit_ptr(cb_arg);
+	rte_trace_point_emit_u16(next_port);
+	rte_trace_point_emit_u16(last_port);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_callback_unregister,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, enum rte_eth_event_type event,
+		rte_eth_dev_cb_fn cb_fn, void *cb_arg, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(event);
+	rte_trace_point_emit_ptr(cb_fn);
+	rte_trace_point_emit_ptr(cb_arg);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_default_mac_addr_set,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *addr, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(addr);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_flow_ctrl_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_fc_conf *fc_conf),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(fc_conf);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_flow_ctrl_set,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_fc_conf *fc_conf),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u32(fc_conf->high_water);
+	rte_trace_point_emit_u32(fc_conf->low_water);
+	rte_trace_point_emit_u16(fc_conf->pause_time);
+	rte_trace_point_emit_u16(fc_conf->send_xon);
+	rte_trace_point_emit_int(fc_conf->mode);
+	rte_trace_point_emit_u8(fc_conf->mac_ctrl_frame_fwd);
+	rte_trace_point_emit_u8(fc_conf->autoneg);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_fw_version_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, char *fw_version, size_t fw_size),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(fw_version);
+	rte_trace_point_emit_size_t(fw_size);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_dcb_info,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_dcb_info *dcb_info),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(dcb_info);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_eeprom,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_dev_eeprom_info *info),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(info);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_eeprom_length,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_mtu,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t mtu),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(mtu);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_count_avail,
+	RTE_TRACE_POINT_ARGS(uint16_t count),
+	rte_trace_point_emit_u16(count);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_count_total,
+	RTE_TRACE_POINT_ARGS(uint16_t count),
+	rte_trace_point_emit_u16(count);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_name_by_port,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, char *name),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_string(name);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_port_by_name,
+	RTE_TRACE_POINT_ARGS(const char *name, uint16_t port_id),
+	rte_trace_point_emit_string(name);
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_reg_info,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_dev_reg_info *info),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(info);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_sec_ctx,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_supported_ptypes,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t ptype_mask,
+		uint32_t *ptypes, int num, int j),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u32(ptype_mask);
+	rte_trace_point_emit_ptr(ptypes);
+	rte_trace_point_emit_int(num);
+	rte_trace_point_emit_int(j);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_vlan_offload,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_info_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_dev_info *dev_info),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_string(dev_info->driver_name);
+	rte_trace_point_emit_u32(dev_info->if_index);
+	rte_trace_point_emit_u16(dev_info->min_mtu);
+	rte_trace_point_emit_u16(dev_info->max_mtu);
+	rte_trace_point_emit_u32(dev_info->min_rx_bufsize);
+	rte_trace_point_emit_u32(dev_info->max_rx_pktlen);
+	rte_trace_point_emit_u64(dev_info->rx_offload_capa);
+	rte_trace_point_emit_u64(dev_info->tx_offload_capa);
+	rte_trace_point_emit_u64(dev_info->rx_queue_offload_capa);
+	rte_trace_point_emit_u64(dev_info->tx_queue_offload_capa);
+	rte_trace_point_emit_u16(dev_info->reta_size);
+	rte_trace_point_emit_u8(dev_info->hash_key_size);
+	rte_trace_point_emit_u16(dev_info->nb_rx_queues);
+	rte_trace_point_emit_u16(dev_info->nb_tx_queues);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_is_removed,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_is_valid_port,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_mac_addr_add,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *addr,
+		uint32_t pool),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(addr);
+	rte_trace_point_emit_u32(pool);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_mac_addr_remove,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *addr),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(addr);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_pool_ops_supported,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const char *pool),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(pool);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_priority_flow_ctrl_set,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_pfc_conf *pfc_conf),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u32(pfc_conf->fc.high_water);
+	rte_trace_point_emit_u32(pfc_conf->fc.low_water);
+	rte_trace_point_emit_u16(pfc_conf->fc.pause_time);
+	rte_trace_point_emit_u16(pfc_conf->fc.send_xon);
+	rte_trace_point_emit_int(pfc_conf->fc.mode);
+	rte_trace_point_emit_u8(pfc_conf->fc.mac_ctrl_frame_fwd);
+	rte_trace_point_emit_u8(pfc_conf->fc.autoneg);
+	rte_trace_point_emit_u8(pfc_conf->priority);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_reset,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rss_hash_conf_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_rss_conf *rss_conf),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(rss_conf);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rss_hash_update,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_rss_conf *rss_conf),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(rss_conf->rss_key);
+	rte_trace_point_emit_u8(rss_conf->rss_key_len);
+	rte_trace_point_emit_u64(rss_conf->rss_hf);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rss_reta_query,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(reta_conf);
+	rte_trace_point_emit_u16(reta_size);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rss_reta_update,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u64(reta_conf->mask);
+	rte_trace_point_emit_u16(reta_size);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rx_intr_ctl,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int epfd, int op, void *data, int rc),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(epfd);
+	rte_trace_point_emit_int(op);
+	rte_trace_point_emit_ptr(data);
+	rte_trace_point_emit_int(rc);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rx_intr_ctl_q,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id, int epfd,
+		int op, void *data, int rc),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_int(epfd);
+	rte_trace_point_emit_int(op);
+	rte_trace_point_emit_ptr(data);
+	rte_trace_point_emit_int(rc);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rx_intr_ctl_q_get_fd,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id, int fd),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_int(fd);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rx_intr_disable,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rx_intr_enable,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rx_offload_name,
+	RTE_TRACE_POINT_ARGS(uint64_t offload, const char *name),
+	rte_trace_point_emit_u64(offload);
+	rte_trace_point_emit_string(name);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rx_queue_start,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(rx_queue_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_rx_queue_stop,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(rx_queue_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_eeprom,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_dev_eeprom_info *info),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(info->data);
+	rte_trace_point_emit_u32(info->offset);
+	rte_trace_point_emit_u32(info->length);
+	rte_trace_point_emit_u32(info->magic);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_link_down,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_link_up,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_mc_addr_list,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_ether_addr *mc_addr_set,
+		uint32_t nb_mc_addr),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(mc_addr_set);
+	rte_trace_point_emit_u32(nb_mc_addr);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_ptypes,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t ptype_mask,
+		uint32_t *set_ptypes, unsigned int num),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u32(ptype_mask);
+	rte_trace_point_emit_ptr(set_ptypes);
+	rte_trace_point_emit_u32(num);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_rx_queue_stats_mapping,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
+		uint8_t stat_idx),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(rx_queue_id);
+	rte_trace_point_emit_u8(stat_idx);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_tx_queue_stats_mapping,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
+		uint8_t stat_idx),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(tx_queue_id);
+	rte_trace_point_emit_u8(stat_idx);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_vlan_ether_type,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, enum rte_vlan_type vlan_type,
+		uint16_t tag_type),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(vlan_type);
+	rte_trace_point_emit_u16(tag_type);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_vlan_offload,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int offload_mask, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(offload_mask);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_vlan_pvid,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t pvid, int on),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(pvid);
+	rte_trace_point_emit_int(on);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_set_vlan_strip_on_queue,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
+		int on),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(rx_queue_id);
+	rte_trace_point_emit_int(on);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_socket_id,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_tx_offload_name,
+	RTE_TRACE_POINT_ARGS(uint64_t offload, const char *name),
+	rte_trace_point_emit_u64(offload);
+	rte_trace_point_emit_string(name);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_tx_queue_start,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(tx_queue_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_tx_queue_stop,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(tx_queue_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_uc_all_hash_table_set,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint8_t on),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u8(on);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_uc_hash_table_set,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *addr,
+		uint8_t on, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(addr);
+	rte_trace_point_emit_u8(on);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_udp_tunnel_port_add,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_udp_tunnel *tunnel_udp),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(tunnel_udp->udp_port);
+	rte_trace_point_emit_u8(tunnel_udp->prot_type);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_udp_tunnel_port_delete,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_udp_tunnel *tunnel_udp),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(tunnel_udp->udp_port);
+	rte_trace_point_emit_u8(tunnel_udp->prot_type);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_vlan_filter,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t vlan_id, int on, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(vlan_id);
+	rte_trace_point_emit_int(on);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_find_next,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_find_next_of,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id_start,
+		const struct rte_device *parent),
+	rte_trace_point_emit_u16(port_id_start);
+	rte_trace_point_emit_ptr(parent);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_find_next_owned_by,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		const uint64_t owner_id),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u64(owner_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_find_next_sibling,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id_start, uint16_t ref_port_id),
+	rte_trace_point_emit_u16(port_id_start);
+	rte_trace_point_emit_u16(ref_port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_iterator_cleanup,
+	RTE_TRACE_POINT_ARGS(struct rte_dev_iterator *iter),
+	rte_trace_point_emit_ptr(iter);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_iterator_init,
+	RTE_TRACE_POINT_ARGS(struct rte_dev_iterator *iter, const char *devargs),
+	rte_trace_point_emit_ptr(iter);
+	rte_trace_point_emit_ptr(devargs);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_iterator_next,
+	RTE_TRACE_POINT_ARGS(struct rte_dev_iterator *iter),
+	rte_trace_point_emit_ptr(iter);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_led_off,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_led_on,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_link_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_link *link),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u32(link->link_speed);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_link_get_nowait,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_link *link),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u32(link->link_speed);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_macaddr_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *mac_addr),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(mac_addr);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_promiscuous_disable,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int promiscuous),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(promiscuous);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_promiscuous_enable,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int promiscuous),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(promiscuous);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_promiscuous_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int promiscuous),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(promiscuous);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_remove_rx_callback,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		const struct rte_eth_rxtx_callback *user_cb, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(user_cb);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_remove_tx_callback,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		const struct rte_eth_rxtx_callback *user_cb, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(user_cb);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_rx_burst_mode_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		struct rte_eth_burst_mode *mode),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(mode);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_rx_queue_info_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		struct rte_eth_rxq_info *qinfo),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(qinfo->mp);
+	rte_trace_point_emit_u8(qinfo->scattered_rx);
+	rte_trace_point_emit_u8(qinfo->queue_state);
+	rte_trace_point_emit_u16(qinfo->nb_desc);
+	rte_trace_point_emit_u16(qinfo->rx_buf_size);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_rx_queue_setup,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
+		uint16_t nb_rx_desc, unsigned int socket_id,
+		const struct rte_eth_rxconf *rx_conf,
+		struct rte_mempool *mb_pool),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(rx_queue_id);
+	rte_trace_point_emit_u16(nb_rx_desc);
+	rte_trace_point_emit_u32(socket_id);
+	rte_trace_point_emit_ptr(rx_conf);
+	rte_trace_point_emit_ptr(mb_pool);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_set_queue_rate_limit,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_idx,
+		uint16_t tx_rate),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_idx);
+	rte_trace_point_emit_u16(tx_rate);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_speed_bitflag,
+	RTE_TRACE_POINT_ARGS(uint32_t speed, int duplex),
+	rte_trace_point_emit_u32(speed);
+	rte_trace_point_emit_int(duplex);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_stats_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_stats *stats),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(stats);
+	rte_trace_point_emit_u64(stats->rx_nombuf);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_stats_reset,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_timesync_adjust_time,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, int64_t delta),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_i64(delta);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_timesync_disable,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_timesync_enable,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_timesync_read_rx_timestamp,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct timespec *timestamp,
+		uint32_t flags),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(timestamp);
+	rte_trace_point_emit_u32(flags);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_timesync_read_time,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct timespec *time),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(time);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_timesync_read_tx_timestamp,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct timespec *timestamp),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(timestamp);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_timesync_write_time,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const struct timespec *time),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(time);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_tx_buffer_count_callback,
+	RTE_TRACE_POINT_ARGS(struct rte_mbuf **pkts, uint16_t unsent,
+		uint64_t count),
+	rte_trace_point_emit_ptr(pkts);
+	rte_trace_point_emit_u16(unsent);
+	rte_trace_point_emit_u64(count);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_tx_buffer_drop_callback,
+	RTE_TRACE_POINT_ARGS(struct rte_mbuf **pkts, uint16_t unsent),
+	rte_trace_point_emit_ptr(pkts);
+	rte_trace_point_emit_u16(unsent);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_tx_buffer_init,
+	RTE_TRACE_POINT_ARGS(struct rte_eth_dev_tx_buffer *buffer, uint16_t size,
+		int ret),
+	rte_trace_point_emit_ptr(buffer);
+	rte_trace_point_emit_u16(size);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_tx_buffer_set_err_callback,
+	RTE_TRACE_POINT_ARGS(struct rte_eth_dev_tx_buffer *buffer,
+		buffer_tx_error_fn callback, void *userdata),
+	rte_trace_point_emit_ptr(buffer);
+	rte_trace_point_emit_ptr(callback);
+	rte_trace_point_emit_ptr(userdata);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_tx_burst_mode_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		struct rte_eth_burst_mode *mode),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(mode);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_tx_done_cleanup,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt,
+		int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_u32(free_cnt);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_tx_queue_info_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		struct rte_eth_txq_info *qinfo),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_u16(qinfo->nb_desc);
+	rte_trace_point_emit_u8(qinfo->queue_state);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_xstats_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_xstat xstats,
+		int i),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u64(xstats.id);
+	rte_trace_point_emit_u64(xstats.value);
+	rte_trace_point_emit_u32(i);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_xstats_get_by_id,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const uint64_t *ids,
+		uint64_t *values, unsigned int size),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(ids);
+	rte_trace_point_emit_ptr(values);
+	rte_trace_point_emit_u32(size);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_xstats_get_id_by_name,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, const char *xstat_name,
+		uint64_t *id),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_string(xstat_name);
+	rte_trace_point_emit_ptr(id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_xstats_get_names,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_xstat_name *xstats_names,
+		unsigned int size, int cnt_used_entries),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_string(xstats_names->name);
+	rte_trace_point_emit_u32(size);
+	rte_trace_point_emit_int(cnt_used_entries);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_xstats_get_names_by_id,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_xstat_name *xstats_names, uint64_t ids),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_string(xstats_names->name);
+	rte_trace_point_emit_u64(ids);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_xstats_reset,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_owner_delete,
+	RTE_TRACE_POINT_ARGS(const uint64_t owner_id, int ret),
+	rte_trace_point_emit_u64(owner_id);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_owner_get,
+	RTE_TRACE_POINT_ARGS(const uint16_t port_id,
+		struct rte_eth_dev_owner *owner),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u64(owner->id);
+	rte_trace_point_emit_string(owner->name);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_owner_new,
+	RTE_TRACE_POINT_ARGS(uint64_t owner_id),
+	rte_trace_point_emit_u64(owner_id);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_owner_set,
+	RTE_TRACE_POINT_ARGS(const uint16_t port_id,
+		const struct rte_eth_dev_owner *owner, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u64(owner->id);
+	rte_trace_point_emit_string(owner->name);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_owner_unset,
+	RTE_TRACE_POINT_ARGS(const uint16_t port_id,
+		const uint64_t owner_id, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u64(owner_id);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_module_eeprom,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_dev_eeprom_info *info),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(info);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_get_module_info,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_dev_module_info *modinfo),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(modinfo);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_read_clock,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint64_t *clk),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(clk);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_hairpin_capability_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_hairpin_cap *cap),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(cap);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_rx_hairpin_queue_setup,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id,
+		uint16_t nb_rx_desc, const struct rte_eth_hairpin_conf *conf,
+		int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(rx_queue_id);
+	rte_trace_point_emit_u16(nb_rx_desc);
+	rte_trace_point_emit_ptr(conf);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_tx_hairpin_queue_setup,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
+		uint16_t nb_tx_desc, const struct rte_eth_hairpin_conf *conf,
+		int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(tx_queue_id);
+	rte_trace_point_emit_u16(nb_tx_desc);
+	rte_trace_point_emit_ptr(conf);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_hairpin_bind,
+	RTE_TRACE_POINT_ARGS(uint16_t tx_port, uint16_t rx_port, int ret),
+	rte_trace_point_emit_u16(tx_port);
+	rte_trace_point_emit_u16(rx_port);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_hairpin_get_peer_ports,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t *peer_ports,
+		size_t len, uint32_t direction, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(peer_ports);
+	rte_trace_point_emit_size_t(len);
+	rte_trace_point_emit_u32(direction);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_hairpin_unbind,
+	RTE_TRACE_POINT_ARGS(uint16_t tx_port, uint16_t rx_port, int ret),
+	rte_trace_point_emit_u16(tx_port);
+	rte_trace_point_emit_u16(rx_port);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_link_speed_to_str,
+	RTE_TRACE_POINT_ARGS(uint32_t link_speed),
+	rte_trace_point_emit_u32(link_speed);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_link_to_str,
+	RTE_TRACE_POINT_ARGS(char *str, size_t len,
+		const struct rte_eth_link *eth_link),
+	rte_trace_point_emit_ptr(str);
+	rte_trace_point_emit_size_t(len);
+	rte_trace_point_emit_ptr(eth_link);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_fec_get_capability,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_fec_capa *speed_fec_capa,
+		unsigned int num, int ret),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(speed_fec_capa);
+	rte_trace_point_emit_u32(num);
+	rte_trace_point_emit_int(ret);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_fec_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t *fec_capa),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(fec_capa);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_fec_set,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t fec_capa),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u32(fec_capa);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_get_monitor_addr,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		struct rte_power_monitor_cond *pmc),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(pmc);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_representor_info_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_representor_info *info),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(info);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_capability_name,
+	RTE_TRACE_POINT_ARGS(uint64_t capability, const char *name),
+	rte_trace_point_emit_u64(capability);
+	rte_trace_point_emit_string(name);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_conf_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_eth_conf *dev_conf),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(dev_conf);
+	rte_trace_point_emit_u32(dev_conf->link_speeds);
+	rte_trace_point_emit_u64(dev_conf->rxmode.offloads);
+	rte_trace_point_emit_u64(dev_conf->txmode.offloads);
+	rte_trace_point_emit_u32(dev_conf->lpbk_mode);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_macaddrs_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, struct rte_ether_addr *ma,
+		unsigned int num),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(ma);
+	rte_trace_point_emit_u32(num);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_rx_metadata_negotiate,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint64_t *features,
+		uint64_t features_val),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(features);
+	rte_trace_point_emit_u64(features_val);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_priority_flow_ctrl_queue_configure,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_pfc_queue_conf *pfc_queue_conf),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(pfc_queue_conf);
+	rte_trace_point_emit_int(pfc_queue_conf->mode);
+	rte_trace_point_emit_u16(pfc_queue_conf->rx_pause.tx_qid);
+	rte_trace_point_emit_u16(pfc_queue_conf->tx_pause.rx_qid);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_priority_flow_ctrl_queue_info_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_pfc_queue_info *pfc_queue_info),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(pfc_queue_info);
+)
+
+RTE_TRACE_POINT(
+	rte_ethdev_trace_priv_dump,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_ip_reassembly_capability_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_ip_reassembly_params *capa),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(capa);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_ip_reassembly_conf_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		struct rte_eth_ip_reassembly_params *conf),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(conf);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_ip_reassembly_conf_set,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id,
+		const struct rte_eth_ip_reassembly_params *conf),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(conf);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_rx_avail_thresh_query,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_rx_avail_thresh_set,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		uint8_t avail_thresh),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_u8(avail_thresh);
+)
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/ethdev/rte_ethdev_trace_fp.h b/lib/ethdev/rte_ethdev_trace_fp.h
index 40084d1929..ba3fdd04a2 100644
--- a/lib/ethdev/rte_ethdev_trace_fp.h
+++ b/lib/ethdev/rte_ethdev_trace_fp.h
@@ -37,6 +37,25 @@  RTE_TRACE_POINT_FP(
 	rte_trace_point_emit_u16(nb_pkts);
 )
 
+RTE_TRACE_POINT_FP(
+	rte_eth_trace_call_rx_callbacks,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		uint16_t nb_rx, uint16_t nb_pkts),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_u16(nb_rx);
+	rte_trace_point_emit_u16(nb_pkts);
+)
+
+RTE_TRACE_POINT_FP(
+	rte_eth_trace_call_tx_callbacks,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		uint16_t nb_pkts),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_u16(nb_pkts);
+)
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
index 3651ceb234..79d0b2ee1f 100644
--- a/lib/ethdev/version.map
+++ b/lib/ethdev/version.map
@@ -319,4 +319,148 @@  INTERNAL {
 	rte_eth_representor_id_get;
 	rte_eth_switch_domain_alloc;
 	rte_eth_switch_domain_free;
+	__rte_eth_trace_add_first_rx_callback;
+	__rte_eth_trace_add_rx_callback;
+	__rte_eth_trace_add_tx_callback;
+	__rte_eth_trace_allmulticast_disable;
+	__rte_eth_trace_allmulticast_enable;
+	__rte_eth_trace_allmulticast_get;
+	__rte_eth_trace_call_rx_callbacks;
+	__rte_eth_trace_call_tx_callbacks;
+	__rte_ethdev_trace_count_avail;
+	__rte_ethdev_trace_count_total;
+	__rte_ethdev_trace_set_mtu;
+	__rte_ethdev_trace_adjust_nb_rx_tx_desc;
+	__rte_ethdev_trace_callback_register;
+	__rte_ethdev_trace_callback_unregister;
+	__rte_ethdev_trace_default_mac_addr_set;
+	__rte_ethdev_trace_flow_ctrl_get;
+	__rte_ethdev_trace_flow_ctrl_set;
+	__rte_ethdev_trace_fw_version_get;
+	__rte_ethdev_trace_get_dcb_info;
+	__rte_ethdev_trace_get_eeprom;
+	__rte_ethdev_trace_get_eeprom_length;
+	__rte_ethdev_trace_get_mtu;
+	__rte_ethdev_trace_get_name_by_port;
+	__rte_ethdev_trace_get_port_by_name;
+	__rte_ethdev_trace_get_reg_info;
+	__rte_ethdev_trace_get_sec_ctx;
+	__rte_ethdev_trace_get_supported_ptypes;
+	__rte_ethdev_trace_get_vlan_offload;
+	__rte_ethdev_trace_info_get;
+	__rte_ethdev_trace_is_removed;
+	__rte_ethdev_trace_is_valid_port;
+	__rte_ethdev_trace_mac_addr_add;
+	__rte_ethdev_trace_mac_addr_remove;
+	__rte_ethdev_trace_pool_ops_supported;
+	__rte_ethdev_trace_priority_flow_ctrl_set;
+	__rte_ethdev_trace_reset;
+	__rte_ethdev_trace_rss_hash_conf_get;
+	__rte_ethdev_trace_rss_hash_update;
+	__rte_ethdev_trace_rss_reta_query;
+	__rte_ethdev_trace_rss_reta_update;
+	__rte_ethdev_trace_rx_intr_ctl;
+	__rte_ethdev_trace_rx_intr_ctl_q;
+	__rte_ethdev_trace_rx_intr_ctl_q_get_fd;
+	__rte_ethdev_trace_rx_intr_disable;
+	__rte_ethdev_trace_rx_intr_enable;
+	__rte_ethdev_trace_rx_offload_name;
+	__rte_ethdev_trace_rx_queue_start;
+	__rte_ethdev_trace_rx_queue_stop;
+	__rte_ethdev_trace_set_eeprom;
+	__rte_ethdev_trace_set_link_down;
+	__rte_ethdev_trace_set_link_up;
+	__rte_ethdev_trace_set_mc_addr_list;
+	__rte_ethdev_trace_set_ptypes;
+	__rte_ethdev_trace_set_rx_queue_stats_mapping;
+	__rte_ethdev_trace_set_tx_queue_stats_mapping;
+	__rte_ethdev_trace_set_vlan_ether_type;
+	__rte_ethdev_trace_set_vlan_offload;
+	__rte_ethdev_trace_set_vlan_pvid;
+	__rte_ethdev_trace_set_vlan_strip_on_queue;
+	__rte_ethdev_trace_socket_id;
+	__rte_ethdev_trace_tx_offload_name;
+	__rte_ethdev_trace_tx_queue_start;
+	__rte_ethdev_trace_tx_queue_stop;
+	__rte_ethdev_trace_uc_all_hash_table_set;
+	__rte_ethdev_trace_uc_hash_table_set;
+	__rte_ethdev_trace_udp_tunnel_port_add;
+	__rte_ethdev_trace_udp_tunnel_port_delete;
+	__rte_ethdev_trace_vlan_filter;
+	__rte_eth_trace_find_next;
+	__rte_eth_trace_find_next_of;
+	__rte_eth_trace_find_next_owned_by;
+	__rte_eth_trace_find_next_sibling;
+	__rte_eth_trace_iterator_cleanup;
+	__rte_eth_trace_iterator_init;
+	__rte_eth_trace_iterator_next;
+	__rte_eth_trace_led_off;
+	__rte_eth_trace_led_on;
+	__rte_eth_trace_link_get;
+	__rte_eth_trace_link_get_nowait;
+	__rte_eth_trace_macaddr_get;
+	__rte_eth_trace_promiscuous_disable;
+	__rte_eth_trace_promiscuous_enable;
+	__rte_eth_trace_promiscuous_get;
+	__rte_eth_trace_remove_rx_callback;
+	__rte_eth_trace_remove_tx_callback;
+	__rte_eth_trace_rx_burst_mode_get;
+	__rte_eth_trace_rx_queue_info_get;
+	__rte_eth_trace_rx_queue_setup;
+	__rte_eth_trace_set_queue_rate_limit;
+	__rte_eth_trace_speed_bitflag;
+	__rte_eth_trace_stats_get;
+	__rte_eth_trace_stats_reset;
+	__rte_eth_trace_timesync_adjust_time;
+	__rte_eth_trace_timesync_disable;
+	__rte_eth_trace_timesync_enable;
+	__rte_eth_trace_timesync_read_rx_timestamp;
+	__rte_eth_trace_timesync_read_time;
+	__rte_eth_trace_timesync_read_tx_timestamp;
+	__rte_eth_trace_timesync_write_time;
+	__rte_eth_trace_tx_buffer_count_callback;
+	__rte_eth_trace_tx_buffer_drop_callback;
+	__rte_eth_trace_tx_buffer_init;
+	__rte_eth_trace_tx_buffer_set_err_callback;
+	__rte_eth_trace_tx_burst_mode_get;
+	__rte_eth_trace_tx_done_cleanup;
+	__rte_eth_trace_tx_queue_info_get;
+	__rte_eth_trace_xstats_get;
+	__rte_eth_trace_xstats_get_by_id;
+	__rte_eth_trace_xstats_get_id_by_name;
+	__rte_eth_trace_xstats_get_names;
+	__rte_eth_trace_xstats_get_names_by_id;
+	__rte_eth_trace_xstats_reset;
+	__rte_ethdev_trace_owner_delete;
+	__rte_ethdev_trace_owner_get;
+	__rte_ethdev_trace_owner_new;
+	__rte_ethdev_trace_owner_set;
+	__rte_ethdev_trace_owner_unset;
+	__rte_ethdev_trace_get_module_eeprom;
+	__rte_ethdev_trace_get_module_info;
+	__rte_ethdev_trace_hairpin_capability_get;
+	__rte_eth_trace_rx_hairpin_queue_setup;
+	__rte_eth_trace_tx_hairpin_queue_setup;
+	__rte_eth_trace_hairpin_bind;
+	__rte_eth_trace_hairpin_get_peer_ports;
+	__rte_eth_trace_hairpin_unbind;
+	__rte_eth_trace_link_speed_to_str;
+	__rte_eth_trace_link_to_str;
+	__rte_eth_trace_fec_get_capability;
+	__rte_eth_trace_fec_get;
+	__rte_eth_trace_fec_set;
+	__rte_eth_trace_get_monitor_addr;
+	__rte_eth_trace_representor_info_get;
+	__rte_ethdev_trace_capability_name;
+	__rte_ethdev_trace_conf_get;
+	__rte_eth_trace_macaddrs_get;
+	__rte_eth_trace_rx_metadata_negotiate;
+	__rte_ethdev_trace_priority_flow_ctrl_queue_configure;
+	__rte_ethdev_trace_priority_flow_ctrl_queue_info_get;
+	__rte_ethdev_trace_priv_dump;
+	__rte_eth_trace_ip_reassembly_capability_get;
+	__rte_eth_trace_ip_reassembly_conf_get;
+	__rte_eth_trace_ip_reassembly_conf_set;
+	__rte_eth_trace_rx_avail_thresh_query;
+	__rte_eth_trace_rx_avail_thresh_set;
 };