[1/6] ethdev: add trace points

Message ID 20220804134430.6192-2-adwivedi@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: Andrew Rybchenko
Headers
Series add trace points in ethdev library |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Ankur Dwivedi Aug. 4, 2022, 1:44 p.m. UTC
  Add trace points for ethdev functions.

Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>
---
 lib/ethdev/ethdev_private.c      |    5 +
 lib/ethdev/ethdev_trace_points.c |  438 +++++++++++
 lib/ethdev/rte_ethdev.c          |  150 ++++
 lib/ethdev/rte_ethdev_trace.h    | 1182 ++++++++++++++++++++++++++++++
 lib/ethdev/version.map           |  147 ++++
 5 files changed, 1922 insertions(+)
  

Comments

Andrew Rybchenko Sept. 12, 2022, 11 a.m. UTC | #1
On 8/4/22 16:44, Ankur Dwivedi wrote:
> Add trace points for ethdev functions.
> 
> Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>
> ---

[snip]

> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
> index 1979dc0850..a6fb370b22 100644
> --- a/lib/ethdev/rte_ethdev.c
> +++ b/lib/ethdev/rte_ethdev.c

[snip]

> @@ -525,6 +536,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);

I'm wondering why trace is sometimes added in the middle of the
function, but in the majority of cases it is added as the first
or the last action. Is there any logical/guidelines behind it?

>   	return ret;
>   }
>   

[snip]

> diff --git a/lib/ethdev/rte_ethdev_trace.h b/lib/ethdev/rte_ethdev_trace.h
> index 1491c815c3..de728d355d 100644
> --- a/lib/ethdev/rte_ethdev_trace.h
> +++ b/lib/ethdev/rte_ethdev_trace.h

[snip]

> +RTE_TRACE_POINT(

Shouldn't it be RTE_TRACE_POINT_FP? Isn't it fast path?

> +	rte_eth_trace_call_rx_callbacks,
> +	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
> +		struct rte_mbuf **rx_pkts, uint16_t nb_rx,
> +		uint16_t nb_pkts, void *opaque),
> +	rte_trace_point_emit_u16(port_id);
> +	rte_trace_point_emit_u16(queue_id);
> +	rte_trace_point_emit_ptr(rx_pkts);
> +	rte_trace_point_emit_u16(nb_rx);
> +	rte_trace_point_emit_u16(nb_pkts);
> +	rte_trace_point_emit_ptr(opaque);
> +)
> +
> +RTE_TRACE_POINT(

same here

> +	rte_eth_trace_call_tx_callbacks,
> +	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
> +		struct rte_mbuf **tx_pkts, uint16_t nb_pkts,
> +		void *opaque),
> +	rte_trace_point_emit_u16(port_id);
> +	rte_trace_point_emit_u16(queue_id);
> +	rte_trace_point_emit_ptr(tx_pkts);
> +	rte_trace_point_emit_u16(nb_pkts);
> +	rte_trace_point_emit_ptr(opaque);
> +)
> +

[snip]

> +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);

How to make a choice which information should be included
above?

> +)
> +

[snip]
  
Ankur Dwivedi Sept. 13, 2022, 6:48 a.m. UTC | #2
Hi Andrew,

>-----Original Message-----
>From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>Sent: Monday, September 12, 2022 4:30 PM
>To: Ankur Dwivedi <adwivedi@marvell.com>; 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>; 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: [EXT] Re: [PATCH 1/6] ethdev: add trace points
>
>External Email
>
>----------------------------------------------------------------------
>On 8/4/22 16:44, Ankur Dwivedi wrote:
>> Add trace points for ethdev functions.
>>
>> Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>
>> ---
>
>[snip]
>
>> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index
>> 1979dc0850..a6fb370b22 100644
>> --- a/lib/ethdev/rte_ethdev.c
>> +++ b/lib/ethdev/rte_ethdev.c
>
>[snip]
>
>> @@ -525,6 +536,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);
>
>I'm wondering why trace is sometimes added in the middle of the function,
>but in the majority of cases it is added as the first or the last action. Is there
>any logical/guidelines behind it?
In this case for printing the return value the trace was added at the end. I can change it if not required.
The logic which I used was to log at least the input arguments of a function and in some cases also log important information(according to me) if possible.For example in rte_eth_tx_buffer_count_callback() I was also logging the count at the end. Similar logic in rte_eth_link_get_nowait().
Please let me know your views.
>
>>   	return ret;
>>   }
>>
>
>[snip]
>
>> diff --git a/lib/ethdev/rte_ethdev_trace.h
>> b/lib/ethdev/rte_ethdev_trace.h index 1491c815c3..de728d355d 100644
>> --- a/lib/ethdev/rte_ethdev_trace.h
>> +++ b/lib/ethdev/rte_ethdev_trace.h
>
>[snip]
>
>> +RTE_TRACE_POINT(
>
>Shouldn't it be RTE_TRACE_POINT_FP? Isn't it fast path?
Yes it is fastpath. Will make it as fastpath in v2.
>
>> +	rte_eth_trace_call_rx_callbacks,
>> +	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>> +		struct rte_mbuf **rx_pkts, uint16_t nb_rx,
>> +		uint16_t nb_pkts, void *opaque),
>> +	rte_trace_point_emit_u16(port_id);
>> +	rte_trace_point_emit_u16(queue_id);
>> +	rte_trace_point_emit_ptr(rx_pkts);
>> +	rte_trace_point_emit_u16(nb_rx);
>> +	rte_trace_point_emit_u16(nb_pkts);
>> +	rte_trace_point_emit_ptr(opaque);
>> +)
>> +
>> +RTE_TRACE_POINT(
>
>same here
Yes it is fastpath. Will make it as fastpath in v2.
>
>> +	rte_eth_trace_call_tx_callbacks,
>> +	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
>> +		struct rte_mbuf **tx_pkts, uint16_t nb_pkts,
>> +		void *opaque),
>> +	rte_trace_point_emit_u16(port_id);
>> +	rte_trace_point_emit_u16(queue_id);
>> +	rte_trace_point_emit_ptr(tx_pkts);
>> +	rte_trace_point_emit_u16(nb_pkts);
>> +	rte_trace_point_emit_ptr(opaque);
>> +)
>> +
>
>[snip]
>
>> +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);
>
>How to make a choice which information should be included above?
In this case dev_info information is logged which might be of interest.
>
>> +)
>> +
>
>[snip]
  
Andrew Rybchenko Sept. 13, 2022, 7:18 a.m. UTC | #3
On 9/13/22 09:48, Ankur Dwivedi wrote:
> Hi Andrew,
> 
>> -----Original Message-----
>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>> Sent: Monday, September 12, 2022 4:30 PM
>> To: Ankur Dwivedi <adwivedi@marvell.com>; 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>; 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: [EXT] Re: [PATCH 1/6] ethdev: add trace points
>>
>> External Email
>>
>> ----------------------------------------------------------------------
>> On 8/4/22 16:44, Ankur Dwivedi wrote:
>>> Add trace points for ethdev functions.
>>>
>>> Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>
>>> ---
>>
>> [snip]
>>
>>> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index
>>> 1979dc0850..a6fb370b22 100644
>>> --- a/lib/ethdev/rte_ethdev.c
>>> +++ b/lib/ethdev/rte_ethdev.c
>>
>> [snip]
>>
>>> @@ -525,6 +536,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);
>>
>> I'm wondering why trace is sometimes added in the middle of the function,
>> but in the majority of cases it is added as the first or the last action. Is there
>> any logical/guidelines behind it?
> In this case for printing the return value the trace was added at the end. I can change it if not required.
> The logic which I used was to log at least the input arguments of a function and in some cases also log important information(according to me) if possible.For example in rte_eth_tx_buffer_count_callback() I was also logging the count at the end. Similar logic in rte_eth_link_get_nowait().
> Please let me know your views.

The answer depends on purposes of tracing. I guess that the
main goal is to understand what the application does. So,
tracing without logging the result does not sound really
useful. What's the point to see that application has tried
to enable promiscuous mode without knowing the result if
the attempt is successful or not? If failures are critical
for the application functionality, hopefully it will
result in error logging which could be used together with
tracing to understand what happens.

If so, it drives us to tracing nearby the end of the function
when the function really has tried to do something. If there is
no branching there we'll have some tracing of failures as well,
but we definitely need to see the result in the trace point.

I almost have no experience with tracing, so my thoughts
could be wrong.
  
Andrew Rybchenko Sept. 26, 2022, 3:03 p.m. UTC | #4
@Jerin, I'd like to know what do you think about my
question/thoughts below.

On 9/13/22 10:18, Andrew Rybchenko wrote:
> On 9/13/22 09:48, Ankur Dwivedi wrote:
>> Hi Andrew,
>>
>>> -----Original Message-----
>>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>>> Sent: Monday, September 12, 2022 4:30 PM
>>> To: Ankur Dwivedi <adwivedi@marvell.com>; 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>; 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: [EXT] Re: [PATCH 1/6] ethdev: add trace points
>>>
>>> External Email
>>>
>>> ----------------------------------------------------------------------
>>> On 8/4/22 16:44, Ankur Dwivedi wrote:
>>>> Add trace points for ethdev functions.
>>>>
>>>> Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>
>>>> ---
>>>
>>> [snip]
>>>
>>>> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index
>>>> 1979dc0850..a6fb370b22 100644
>>>> --- a/lib/ethdev/rte_ethdev.c
>>>> +++ b/lib/ethdev/rte_ethdev.c
>>>
>>> [snip]
>>>
>>>> @@ -525,6 +536,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);
>>>
>>> I'm wondering why trace is sometimes added in the middle of the 
>>> function,
>>> but in the majority of cases it is added as the first or the last 
>>> action. Is there
>>> any logical/guidelines behind it?
>> In this case for printing the return value the trace was added at the 
>> end. I can change it if not required.
>> The logic which I used was to log at least the input arguments of a 
>> function and in some cases also log important information(according to 
>> me) if possible.For example in rte_eth_tx_buffer_count_callback() I 
>> was also logging the count at the end. Similar logic in 
>> rte_eth_link_get_nowait().
>> Please let me know your views.
> 
> The answer depends on purposes of tracing. I guess that the
> main goal is to understand what the application does. So,
> tracing without logging the result does not sound really
> useful. What's the point to see that application has tried
> to enable promiscuous mode without knowing the result if
> the attempt is successful or not? If failures are critical
> for the application functionality, hopefully it will
> result in error logging which could be used together with
> tracing to understand what happens.
> 
> If so, it drives us to tracing nearby the end of the function
> when the function really has tried to do something. If there is
> no branching there we'll have some tracing of failures as well,
> but we definitely need to see the result in the trace point.
> 
> I almost have no experience with tracing, so my thoughts
> could be wrong.

Meanwhile I've updated the patch series as "Requested Changes"
since some fixes were promissed in v2.
  
Jerin Jacob Sept. 28, 2022, 4:02 a.m. UTC | #5
> @Jerin, I'd like to know what do you think about my question/thoughts below

@Andrew Rybchenko see below.

>
> On 9/13/22 10:18, Andrew Rybchenko wrote:
> > On 9/13/22 09:48, Ankur Dwivedi wrote:
> >> Hi Andrew,
> >>
> >>> -----Original Message-----
> >>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> >>> Sent: Monday, September 12, 2022 4:30 PM
> >>> To: Ankur Dwivedi <adwivedi@marvell.com>; 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>; 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: [EXT] Re: [PATCH 1/6] ethdev: add trace points
> >>>
> >>> External Email
> >>>
> >>> ----------------------------------------------------------------------
> >>> On 8/4/22 16:44, Ankur Dwivedi wrote:
> >>>> Add trace points for ethdev functions.
> >>>>
> >>>> Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com>
> >>>> ---
> >>>
> >>> [snip]
> >>>
> >>>> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index
> >>>> 1979dc0850..a6fb370b22 100644
> >>>> --- a/lib/ethdev/rte_ethdev.c
> >>>> +++ b/lib/ethdev/rte_ethdev.c
> >>>
> >>> [snip]
> >>>
> >>>> @@ -525,6 +536,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);
> >>>
> >>> I'm wondering why trace is sometimes added in the middle of the
> >>> function,
> >>> but in the majority of cases it is added as the first or the last
> >>> action. Is there
> >>> any logical/guidelines behind it?
> >> In this case for printing the return value the trace was added at the
> >> end. I can change it if not required.
> >> The logic which I used was to log at least the input arguments of a
> >> function and in some cases also log important information(according to
> >> me) if possible.For example in rte_eth_tx_buffer_count_callback() I
> >> was also logging the count at the end. Similar logic in
> >> rte_eth_link_get_nowait().
> >> Please let me know your views.
> >
> > The answer depends on purposes of tracing. I guess that the
> > main goal is to understand what the application does. So,
> > tracing without logging the result does not sound really
> > useful. What's the point to see that application has tried
> > to enable promiscuous mode without knowing the result if
> > the attempt is successful or not? If failures are critical
> > for the application functionality, hopefully it will
> > result in error logging which could be used together with
> > tracing to understand what happens.
> >
> > If so, it drives us to tracing nearby the end of the function
> > when the function really has tried to do something. If there is
> > no branching there we'll have some tracing of failures as well,
> > but we definitely need to see the result in the trace point.

Yes. It make sense to include the result. For example, rte_malloc etc
we are already adding the result so the consumer of trace can get
better view.

> >
> > I almost have no experience with tracing, so my thoughts
> > could be wrong.
>
> Meanwhile I've updated the patch series as "Requested Changes"
> since some fixes were promissed in v2.
  

Patch

diff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c
index 48090c879a..e483145816 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"
 
@@ -291,6 +292,8 @@  rte_eth_call_rx_callbacks(uint16_t port_id, uint16_t queue_id,
 {
 	const struct rte_eth_rxtx_callback *cb = opaque;
 
+	rte_eth_trace_call_rx_callbacks(port_id, queue_id, rx_pkts, nb_rx,
+					nb_pkts, opaque);
 	while (cb != NULL) {
 		nb_rx = cb->fn.rx(port_id, queue_id, rx_pkts, nb_rx,
 				nb_pkts, cb->param);
@@ -306,6 +309,8 @@  rte_eth_call_tx_callbacks(uint16_t port_id, uint16_t queue_id,
 {
 	const struct rte_eth_rxtx_callback *cb = opaque;
 
+	rte_eth_trace_call_tx_callbacks(port_id, queue_id, tx_pkts, nb_pkts,
+					opaque);
 	while (cb != NULL) {
 		nb_pkts = cb->fn.tx(port_id, queue_id, tx_pkts, nb_pkts,
 				cb->param);
diff --git a/lib/ethdev/ethdev_trace_points.c b/lib/ethdev/ethdev_trace_points.c
index 2919409a15..2e80401771 100644
--- a/lib/ethdev/ethdev_trace_points.c
+++ b/lib/ethdev/ethdev_trace_points.c
@@ -29,3 +29,441 @@  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_tx_queue_setup,
+	lib.ethdev.tx_queue_setup)
+
+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 1979dc0850..a6fb370b22 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -167,6 +167,7 @@  rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str)
 	char *cls_str = NULL;
 	int str_size;
 
+	rte_eth_trace_iterator_init(iter, devargs_str);
 	if (iter == NULL) {
 		RTE_ETHDEV_LOG(ERR, "Cannot initialize NULL iterator\n");
 		return -EINVAL;
@@ -273,6 +274,7 @@  rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str)
 uint16_t
 rte_eth_iterator_next(struct rte_dev_iterator *iter)
 {
+	rte_eth_trace_iterator_next(iter);
 	if (iter == NULL) {
 		RTE_ETHDEV_LOG(ERR,
 			"Cannot get next device from NULL iterator\n");
@@ -308,6 +310,7 @@  rte_eth_iterator_next(struct rte_dev_iterator *iter)
 void
 rte_eth_iterator_cleanup(struct rte_dev_iterator *iter)
 {
+	rte_eth_trace_iterator_cleanup(iter);
 	if (iter == NULL) {
 		RTE_ETHDEV_LOG(ERR, "Cannot do clean up from NULL iterator\n");
 		return;
@@ -323,6 +326,7 @@  rte_eth_iterator_cleanup(struct rte_dev_iterator *iter)
 uint16_t
 rte_eth_find_next(uint16_t port_id)
 {
+	rte_eth_trace_find_next(port_id);
 	while (port_id < RTE_MAX_ETHPORTS &&
 			rte_eth_devices[port_id].state == RTE_ETH_DEV_UNUSED)
 		port_id++;
@@ -345,6 +349,7 @@  rte_eth_find_next(uint16_t port_id)
 uint16_t
 rte_eth_find_next_of(uint16_t port_id, const struct rte_device *parent)
 {
+	rte_eth_trace_find_next_of(port_id, parent);
 	port_id = rte_eth_find_next(port_id);
 	while (port_id < RTE_MAX_ETHPORTS &&
 			rte_eth_devices[port_id].device != parent)
@@ -356,6 +361,7 @@  rte_eth_find_next_of(uint16_t port_id, const struct rte_device *parent)
 uint16_t
 rte_eth_find_next_sibling(uint16_t port_id, uint16_t ref_port_id)
 {
+	rte_eth_trace_find_next_sibling(port_id, ref_port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(ref_port_id, RTE_MAX_ETHPORTS);
 	return rte_eth_find_next_of(port_id,
 			rte_eth_devices[ref_port_id].device);
@@ -370,6 +376,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;
@@ -389,6 +396,7 @@  eth_is_valid_owner_id(uint64_t owner_id)
 uint64_t
 rte_eth_find_next_owned_by(uint16_t port_id, const uint64_t owner_id)
 {
+	rte_eth_trace_find_next_owned_by(port_id, owner_id);
 	port_id = rte_eth_find_next(port_id);
 	while (port_id < RTE_MAX_ETHPORTS &&
 			rte_eth_devices[port_id].data->owner.id != owner_id)
@@ -412,6 +420,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;
 }
 
@@ -468,6 +477,7 @@  rte_eth_dev_owner_set(const uint16_t port_id,
 {
 	int ret;
 
+	rte_ethdev_trace_owner_set(port_id, owner);
 	eth_dev_shared_data_prepare();
 
 	rte_spinlock_lock(&eth_dev_shared_data->ownership_lock);
@@ -485,6 +495,7 @@  rte_eth_dev_owner_unset(const uint16_t port_id, const uint64_t owner_id)
 			{.id = RTE_ETH_DEV_NO_OWNER, .name = ""};
 	int ret;
 
+	rte_ethdev_trace_owner_unset(port_id, owner_id);
 	eth_dev_shared_data_prepare();
 
 	rte_spinlock_lock(&eth_dev_shared_data->ownership_lock);
@@ -525,6 +536,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;
 }
 
@@ -554,12 +566,14 @@  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;
 }
 
 int
 rte_eth_dev_socket_id(uint16_t port_id)
 {
+	rte_ethdev_trace_socket_id(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
 	return rte_eth_devices[port_id].data->numa_node;
 }
@@ -567,6 +581,7 @@  rte_eth_dev_socket_id(uint16_t port_id)
 void *
 rte_eth_dev_get_sec_ctx(uint16_t port_id)
 {
+	rte_ethdev_trace_get_sec_ctx(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, NULL);
 	return rte_eth_devices[port_id].security_ctx;
 }
@@ -582,6 +597,7 @@  rte_eth_dev_count_avail(void)
 	RTE_ETH_FOREACH_DEV(p)
 		count++;
 
+	rte_ethdev_trace_count_avail(count);
 	return count;
 }
 
@@ -593,6 +609,7 @@  rte_eth_dev_count_total(void)
 	RTE_ETH_FOREACH_VALID_DEV(port)
 		count++;
 
+	rte_ethdev_trace_count_total(count);
 	return count;
 }
 
@@ -613,6 +630,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;
 }
 
@@ -635,6 +653,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;
 		}
 
@@ -705,6 +724,7 @@  rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id)
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_rx_queue_start(port_id, rx_queue_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -744,6 +764,7 @@  rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id)
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_rx_queue_stop(port_id, rx_queue_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -776,6 +797,7 @@  rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id)
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_tx_queue_start(port_id, tx_queue_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -815,6 +837,7 @@  rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id)
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_tx_queue_stop(port_id, tx_queue_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -844,6 +867,7 @@  rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t 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;
@@ -889,6 +913,7 @@  rte_eth_dev_rx_offload_name(uint64_t offload)
 		}
 	}
 
+	rte_ethdev_trace_rx_offload_name(offload, name);
 	return name;
 }
 
@@ -905,6 +930,7 @@  rte_eth_dev_tx_offload_name(uint64_t offload)
 		}
 	}
 
+	rte_ethdev_trace_tx_offload_name(offload, name);
 	return name;
 }
 
@@ -921,6 +947,7 @@  rte_eth_dev_capability_name(uint64_t capability)
 		}
 	}
 
+	rte_ethdev_trace_capability_name(capability, name);
 	return name;
 }
 
@@ -1538,6 +1565,7 @@  rte_eth_dev_set_link_up(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_set_link_up(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -1550,6 +1578,7 @@  rte_eth_dev_set_link_down(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_set_link_down(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -1596,6 +1625,7 @@  rte_eth_dev_reset(uint16_t port_id)
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_reset(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -1631,6 +1661,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;
 }
 
@@ -1910,6 +1941,8 @@  rte_eth_rx_hairpin_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 	int i;
 	int count;
 
+	rte_eth_trace_rx_hairpin_queue_setup(port_id, rx_queue_id, nb_rx_desc,
+					     conf);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -1985,6 +2018,8 @@  rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
+	rte_eth_trace_tx_queue_setup(port_id, tx_queue_id, nb_tx_desc,
+				     socket_id, tx_conf);
 	if (tx_queue_id >= dev->data->nb_tx_queues) {
 		RTE_ETHDEV_LOG(ERR, "Invalid Tx queue_id=%u\n", tx_queue_id);
 		return -EINVAL;
@@ -2076,6 +2111,7 @@  rte_eth_tx_hairpin_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 	int count;
 	int ret;
 
+	rte_eth_trace_tx_hairpin_queue_setup(port_id, tx_queue_id, nb_tx_desc, conf);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -2144,6 +2180,7 @@  rte_eth_hairpin_bind(uint16_t tx_port, uint16_t rx_port)
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_eth_trace_hairpin_bind(tx_port, rx_port);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port, -ENODEV);
 	dev = &rte_eth_devices[tx_port];
 
@@ -2168,6 +2205,7 @@  rte_eth_hairpin_unbind(uint16_t tx_port, uint16_t rx_port)
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_eth_trace_hairpin_unbind(tx_port, rx_port);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port, -ENODEV);
 	dev = &rte_eth_devices[tx_port];
 
@@ -2193,6 +2231,7 @@  rte_eth_hairpin_get_peer_ports(uint16_t port_id, uint16_t *peer_ports,
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_eth_trace_hairpin_get_peer_ports(port_id, peer_ports, len, direction);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -2226,6 +2265,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);
 }
 
@@ -2237,12 +2277,14 @@  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
 rte_eth_tx_buffer_set_err_callback(struct rte_eth_dev_tx_buffer *buffer,
 		buffer_tx_error_fn cbfn, void *userdata)
 {
+	rte_eth_trace_tx_buffer_set_err_callback(buffer, cbfn, userdata);
 	if (buffer == NULL) {
 		RTE_ETHDEV_LOG(ERR,
 			"Cannot set Tx buffer error callback to NULL buffer\n");
@@ -2259,6 +2301,7 @@  rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer *buffer, uint16_t size)
 {
 	int ret = 0;
 
+	rte_eth_trace_tx_buffer_init(buffer, size);
 	if (buffer == NULL) {
 		RTE_ETHDEV_LOG(ERR, "Cannot initialize NULL buffer\n");
 		return -EINVAL;
@@ -2279,6 +2322,7 @@  rte_eth_tx_done_cleanup(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt)
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_eth_trace_tx_done_cleanup(port_id, queue_id, free_cnt);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -2296,6 +2340,7 @@  rte_eth_promiscuous_enable(uint16_t port_id)
 	struct rte_eth_dev *dev;
 	int diag = 0;
 
+	rte_eth_trace_promiscuous_enable(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -2316,6 +2361,7 @@  rte_eth_promiscuous_disable(uint16_t port_id)
 	struct rte_eth_dev *dev;
 	int diag = 0;
 
+	rte_eth_trace_promiscuous_disable(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -2337,6 +2383,7 @@  rte_eth_promiscuous_get(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_promiscuous_get(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -2349,6 +2396,7 @@  rte_eth_allmulticast_enable(uint16_t port_id)
 	struct rte_eth_dev *dev;
 	int diag;
 
+	rte_eth_trace_allmulticast_enable(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -2368,6 +2416,7 @@  rte_eth_allmulticast_disable(uint16_t port_id)
 	struct rte_eth_dev *dev;
 	int diag;
 
+	rte_eth_trace_allmulticast_disable(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -2388,6 +2437,7 @@  rte_eth_allmulticast_get(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_allmulticast_get(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -2416,6 +2466,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;
 }
 
@@ -2441,12 +2492,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";
@@ -2470,6 +2523,7 @@  rte_eth_link_speed_to_str(uint32_t link_speed)
 int
 rte_eth_link_to_str(char *str, size_t len, const struct rte_eth_link *eth_link)
 {
+	rte_eth_trace_link_to_str(str, len, eth_link);
 	if (str == NULL) {
 		RTE_ETHDEV_LOG(ERR, "Cannot convert link to NULL string\n");
 		return -EINVAL;
@@ -2502,6 +2556,7 @@  rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_stats_get(port_id, stats);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -2524,6 +2579,7 @@  rte_eth_stats_reset(uint16_t port_id)
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_eth_trace_stats_reset(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -2598,6 +2654,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) {
@@ -2770,6 +2827,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);
@@ -2809,6 +2868,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;
 }
 
@@ -2884,6 +2944,7 @@  rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
+	rte_eth_trace_xstats_get_by_id(port_id, ids, values, size);
 	ret = eth_dev_get_xstats_count(port_id);
 	if (ret < 0)
 		return ret;
@@ -3005,6 +3066,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;
 }
 
@@ -3017,6 +3080,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));
@@ -3051,6 +3115,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));
@@ -3060,6 +3126,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));
@@ -3070,6 +3138,7 @@  rte_eth_dev_fw_version_get(uint16_t port_id, char *fw_version, size_t fw_size)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_fw_version_get(port_id, fw_version, fw_size);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3141,6 +3210,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;
 }
 
@@ -3149,6 +3219,7 @@  rte_eth_dev_conf_get(uint16_t port_id, struct rte_eth_conf *dev_conf)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_conf_get(port_id, dev_conf);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3172,6 +3243,7 @@  rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,
 	struct rte_eth_dev *dev;
 	const uint32_t *all_ptypes;
 
+	rte_ethdev_trace_get_supported_ptypes(port_id, ptype_mask, ptypes, num);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3217,6 +3289,7 @@  rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t ptype_mask,
 	unsigned int i, j;
 	int ret;
 
+	rte_ethdev_trace_set_ptypes(port_id, ptype_mask, set_ptypes, num);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3296,6 +3369,7 @@  rte_eth_macaddrs_get(uint16_t port_id, struct rte_ether_addr *ma,
 	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
 
+	rte_eth_trace_macaddrs_get(port_id, ma, num);
 	if (ma == NULL) {
 		RTE_ETHDEV_LOG(ERR, "%s: invalid parameters\n", __func__);
 		return -EINVAL;
@@ -3318,6 +3392,7 @@  rte_eth_macaddr_get(uint16_t port_id, struct rte_ether_addr *mac_addr)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_macaddr_get(port_id, mac_addr);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3348,6 +3423,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;
 }
 
@@ -3389,6 +3465,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);
 }
 
@@ -3398,6 +3475,7 @@  rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on)
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_vlan_filter(port_id, vlan_id, on);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3440,6 +3518,7 @@  rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_set_vlan_strip_on_queue(port_id, rx_queue_id, on);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3461,6 +3540,7 @@  rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_set_vlan_ether_type(port_id, vlan_type, tpid);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3481,6 +3561,7 @@  rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
 	uint64_t dev_offloads;
 	uint64_t new_offloads;
 
+	rte_ethdev_trace_set_vlan_offload(port_id, offload_mask);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3583,6 +3664,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;
 }
 
@@ -3591,6 +3673,7 @@  rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_set_vlan_pvid(port_id, pvid, on);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3603,6 +3686,7 @@  rte_eth_dev_flow_ctrl_get(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_flow_ctrl_get(port_id, fc_conf);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3623,6 +3707,7 @@  rte_eth_dev_flow_ctrl_set(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_flow_ctrl_set(port_id, fc_conf);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3648,6 +3733,7 @@  rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_priority_flow_ctrl_set(port_id, pfc_conf);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3735,6 +3821,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));
@@ -3750,6 +3837,8 @@  rte_eth_dev_priority_flow_ctrl_queue_configure(uint16_t port_id,
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_priority_flow_ctrl_queue_configure(port_id,
+							     pfc_queue_conf);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3865,6 +3954,7 @@  rte_eth_dev_rss_reta_update(uint16_t port_id,
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_rss_reta_update(port_id, reta_conf, reta_size);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3912,6 +4002,7 @@  rte_eth_dev_rss_reta_query(uint16_t port_id,
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_rss_reta_query(port_id, reta_conf, reta_size);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3941,6 +4032,7 @@  rte_eth_dev_rss_hash_update(uint16_t port_id,
 	enum rte_eth_rx_mq_mode mq_mode;
 	int ret;
 
+	rte_ethdev_trace_rss_hash_update(port_id, rss_conf);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -3982,6 +4074,7 @@  rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_rss_hash_conf_get(port_id, rss_conf);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4003,6 +4096,7 @@  rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_udp_tunnel_port_add(port_id, udp_tunnel);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4029,6 +4123,7 @@  rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_udp_tunnel_port_delete(port_id, udp_tunnel);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4054,6 +4149,7 @@  rte_eth_led_on(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_led_on(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4066,6 +4162,7 @@  rte_eth_led_off(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_led_off(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4081,6 +4178,7 @@  rte_eth_fec_get_capability(uint16_t port_id,
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_eth_trace_fec_get_capability(port_id, speed_fec_capa, num);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4102,6 +4200,7 @@  rte_eth_fec_get(uint16_t port_id, uint32_t *fec_capa)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_fec_get(port_id, fec_capa);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4121,6 +4220,7 @@  rte_eth_fec_set(uint16_t port_id, uint32_t fec_capa)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_fec_set(port_id, fec_capa);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4163,6 +4263,7 @@  rte_eth_dev_mac_addr_add(uint16_t port_id, struct rte_ether_addr *addr,
 	uint64_t pool_mask;
 	int ret;
 
+	rte_ethdev_trace_mac_addr_add(port_id, addr, pool);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4221,6 +4322,7 @@  rte_eth_dev_mac_addr_remove(uint16_t port_id, struct rte_ether_addr *addr)
 	struct rte_eth_dev *dev;
 	int index;
 
+	rte_ethdev_trace_mac_addr_remove(port_id, addr);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4260,6 +4362,7 @@  rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr)
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_default_mac_addr_set(port_id, addr);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4322,6 +4425,7 @@  rte_eth_dev_uc_hash_table_set(uint16_t port_id, struct rte_ether_addr *addr,
 	int ret;
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_uc_hash_table_set(port_id, addr, on);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4379,6 +4483,7 @@  rte_eth_dev_uc_all_hash_table_set(uint16_t port_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_uc_all_hash_table_set(port_id, on);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4395,6 +4500,7 @@  int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
 	struct rte_eth_link link;
 	int ret;
 
+	rte_eth_trace_set_queue_rate_limit(port_id, queue_idx, tx_rate);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4428,6 +4534,7 @@  int rte_eth_rx_avail_thresh_set(uint16_t port_id, uint16_t queue_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_rx_avail_thresh_set(port_id, queue_id, avail_thresh);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4462,6 +4569,7 @@  int rte_eth_rx_avail_thresh_query(uint16_t port_id, uint16_t *queue_id,
 	if (*queue_id >= dev->data->nb_rx_queues)
 		*queue_id = 0;
 
+	rte_eth_trace_rx_avail_thresh_query(port_id, *queue_id);
 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_avail_thresh_query, -ENOTSUP);
 	return eth_err(port_id, (*dev->dev_ops->rx_queue_avail_thresh_query)(dev,
 							     queue_id, avail_thresh));
@@ -4493,6 +4601,7 @@  rte_eth_dev_callback_register(uint16_t port_id,
 	uint16_t next_port;
 	uint16_t last_port;
 
+	rte_ethdev_trace_callback_register(port_id, event, cb_fn, cb_arg);
 	if (cb_fn == NULL) {
 		RTE_ETHDEV_LOG(ERR,
 			"Cannot register ethdev port %u callback from NULL\n",
@@ -4560,6 +4669,7 @@  rte_eth_dev_callback_unregister(uint16_t port_id,
 	uint16_t next_port;
 	uint16_t last_port;
 
+	rte_ethdev_trace_callback_unregister(port_id, event, cb_fn, cb_arg);
 	if (cb_fn == NULL) {
 		RTE_ETHDEV_LOG(ERR,
 			"Cannot unregister ethdev port %u callback from NULL\n",
@@ -4619,6 +4729,7 @@  rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
 	uint16_t qid;
 	int rc;
 
+	rte_ethdev_trace_rx_intr_ctl(port_id, epfd, op, data);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4679,6 +4790,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;
 }
 
@@ -4691,6 +4803,7 @@  rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 	struct rte_intr_handle *intr_handle;
 	int rc;
 
+	rte_ethdev_trace_rx_intr_ctl_q(port_id, queue_id, epfd, op, data);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4729,6 +4842,7 @@  rte_eth_dev_rx_intr_enable(uint16_t port_id,
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_rx_intr_enable(port_id, queue_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4747,6 +4861,7 @@  rte_eth_dev_rx_intr_disable(uint16_t port_id,
 	struct rte_eth_dev *dev;
 	int ret;
 
+	rte_ethdev_trace_rx_intr_disable(port_id, queue_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -4769,6 +4884,7 @@  rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id,
 #endif
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_add_rx_callback(port_id, queue_id, fn, user_param);
 	/* check input parameters */
 	if (!rte_eth_dev_is_valid_port(port_id) || fn == NULL ||
 		    queue_id >= rte_eth_devices[port_id].data->nb_rx_queues) {
@@ -4824,6 +4940,7 @@  rte_eth_add_first_rx_callback(uint16_t port_id, uint16_t queue_id,
 	rte_errno = ENOTSUP;
 	return NULL;
 #endif
+	rte_eth_trace_add_first_rx_callback(port_id, queue_id, fn, user_param);
 	/* check input parameters */
 	if (!rte_eth_dev_is_valid_port(port_id) || fn == NULL ||
 		queue_id >= rte_eth_devices[port_id].data->nb_rx_queues) {
@@ -4865,6 +4982,7 @@  rte_eth_add_tx_callback(uint16_t port_id, uint16_t queue_id,
 #endif
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_add_tx_callback(port_id, queue_id, fn, user_param);
 	/* check input parameters */
 	if (!rte_eth_dev_is_valid_port(port_id) || fn == NULL ||
 		    queue_id >= rte_eth_devices[port_id].data->nb_tx_queues) {
@@ -4932,6 +5050,7 @@  rte_eth_remove_rx_callback(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_rxtx_callback **prev_cb;
 	int ret = -EINVAL;
 
+	rte_eth_trace_remove_rx_callback(port_id, queue_id, user_cb);
 	rte_spinlock_lock(&eth_dev_rx_cb_lock);
 	prev_cb = &dev->post_rx_burst_cbs[queue_id];
 	for (; *prev_cb != NULL; prev_cb = &cb->next) {
@@ -4966,6 +5085,7 @@  rte_eth_remove_tx_callback(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_rxtx_callback *cb;
 	struct rte_eth_rxtx_callback **prev_cb;
 
+	rte_eth_trace_remove_tx_callback(port_id, queue_id, user_cb);
 	rte_spinlock_lock(&eth_dev_tx_cb_lock);
 	prev_cb = &dev->pre_tx_burst_cbs[queue_id];
 	for (; *prev_cb != NULL; prev_cb = &cb->next) {
@@ -5024,6 +5144,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;
 }
 
@@ -5069,6 +5190,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;
 }
 
@@ -5078,6 +5200,7 @@  rte_eth_rx_burst_mode_get(uint16_t port_id, uint16_t queue_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_rx_burst_mode_get(port_id, queue_id, mode);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5105,6 +5228,7 @@  rte_eth_tx_burst_mode_get(uint16_t port_id, uint16_t queue_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_tx_burst_mode_get(port_id, queue_id, mode);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5132,6 +5256,7 @@  rte_eth_get_monitor_addr(uint16_t port_id, uint16_t queue_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_get_monitor_addr(port_id, queue_id, pmc);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5159,6 +5284,7 @@  rte_eth_dev_set_mc_addr_list(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_set_mc_addr_list(port_id, mc_addr_set, nb_mc_addr);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5172,6 +5298,7 @@  rte_eth_timesync_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_timesync_enable(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5184,6 +5311,7 @@  rte_eth_timesync_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_timesync_disable(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5197,6 +5325,7 @@  rte_eth_timesync_read_rx_timestamp(uint16_t port_id, struct timespec *timestamp,
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_timesync_read_rx_timestamp(port_id, timestamp, flags);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5218,6 +5347,7 @@  rte_eth_timesync_read_tx_timestamp(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_timesync_read_tx_timestamp(port_id, timestamp);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5238,6 +5368,7 @@  rte_eth_timesync_adjust_time(uint16_t port_id, int64_t delta)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_timesync_adjust_time(port_id, delta);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5250,6 +5381,7 @@  rte_eth_timesync_read_time(uint16_t port_id, struct timespec *timestamp)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_timesync_read_time(port_id, timestamp);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5270,6 +5402,7 @@  rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *timestamp)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_timesync_write_time(port_id, timestamp);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5290,6 +5423,7 @@  rte_eth_read_clock(uint16_t port_id, uint64_t *clock)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_read_clock(port_id, clock);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5308,6 +5442,7 @@  rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_get_reg_info(port_id, info);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5327,6 +5462,7 @@  rte_eth_dev_get_eeprom_length(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_get_eeprom_length(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5339,6 +5475,7 @@  rte_eth_dev_get_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_get_eeprom(port_id, info);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5358,6 +5495,7 @@  rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_set_eeprom(port_id, info);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5378,6 +5516,7 @@  rte_eth_dev_get_module_info(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_get_module_info(port_id, modinfo);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5398,6 +5537,7 @@  rte_eth_dev_get_module_eeprom(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_get_module_eeprom(port_id, info);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5432,6 +5572,7 @@  rte_eth_dev_get_dcb_info(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_get_dcb_info(port_id, dcb_info);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5481,6 +5622,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;
 }
 
@@ -5490,6 +5632,7 @@  rte_eth_dev_hairpin_capability_get(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_hairpin_capability_get(port_id, cap);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5510,6 +5653,7 @@  rte_eth_dev_pool_ops_supported(uint16_t port_id, const char *pool)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_pool_ops_supported(port_id, pool);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5772,6 +5916,7 @@  rte_eth_representor_info_get(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_representor_info_get(port_id, info);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5784,6 +5929,7 @@  rte_eth_rx_metadata_negotiate(uint16_t port_id, uint64_t *features)
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_rx_metadata_negotiate(port_id, features);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5810,6 +5956,7 @@  rte_eth_ip_reassembly_capability_get(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_ip_reassembly_capability_get(port_id, reassembly_capa);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5840,6 +5987,7 @@  rte_eth_ip_reassembly_conf_get(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_ip_reassembly_conf_get(port_id, conf);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5869,6 +6017,7 @@  rte_eth_ip_reassembly_conf_set(uint16_t port_id,
 {
 	struct rte_eth_dev *dev;
 
+	rte_eth_trace_ip_reassembly_conf_set(port_id, conf);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
@@ -5905,6 +6054,7 @@  rte_eth_dev_priv_dump(uint16_t port_id, FILE *file)
 {
 	struct rte_eth_dev *dev;
 
+	rte_ethdev_trace_priv_dump(port_id);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
diff --git a/lib/ethdev/rte_ethdev_trace.h b/lib/ethdev/rte_ethdev_trace.h
index 1491c815c3..de728d355d 100644
--- a/lib/ethdev/rte_ethdev_trace.h
+++ b/lib/ethdev/rte_ethdev_trace.h
@@ -88,6 +88,1188 @@  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),
+	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(
+	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),
+	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(
+	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),
+	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(
+	rte_eth_trace_allmulticast_disable,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_allmulticast_enable,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_allmulticast_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_call_rx_callbacks,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		struct rte_mbuf **rx_pkts, uint16_t nb_rx,
+		uint16_t nb_pkts, void *opaque),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(rx_pkts);
+	rte_trace_point_emit_u16(nb_rx);
+	rte_trace_point_emit_u16(nb_pkts);
+	rte_trace_point_emit_ptr(opaque);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_call_tx_callbacks,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id,
+		struct rte_mbuf **tx_pkts, uint16_t nb_pkts,
+		void *opaque),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(tx_pkts);
+	rte_trace_point_emit_u16(nb_pkts);
+	rte_trace_point_emit_ptr(opaque);
+)
+
+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),
+	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(
+	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),
+	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(
+	rte_ethdev_trace_default_mac_addr_set,
+	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_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),
+	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(
+	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),
+	rte_trace_point_emit_u16(port_id);
+)
+
+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),
+	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(
+	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),
+	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(
+	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),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_int(offload_mask);
+)
+
+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),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(addr);
+	rte_trace_point_emit_u8(on);
+)
+
+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),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(vlan_id);
+	rte_trace_point_emit_int(on);
+)
+
+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),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_promiscuous_enable,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+RTE_TRACE_POINT(
+	rte_eth_trace_promiscuous_get,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id),
+	rte_trace_point_emit_u16(port_id);
+)
+
+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),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(user_cb);
+)
+
+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),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_ptr(user_cb);
+)
+
+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(
+	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),
+	rte_trace_point_emit_ptr(buffer);
+	rte_trace_point_emit_u16(size);
+)
+
+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),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_u16(queue_id);
+	rte_trace_point_emit_u32(free_cnt);
+)
+
+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_tx_queue_setup,
+	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id,
+		uint16_t nb_tx_desc, unsigned int socket_id,
+		const struct rte_eth_txconf *tx_conf),
+	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_u32(socket_id);
+	rte_trace_point_emit_ptr(tx_conf);
+)
+
+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),
+	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_unset,
+	RTE_TRACE_POINT_ARGS(const 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_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),
+	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(
+	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),
+	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(
+	rte_eth_trace_hairpin_bind,
+	RTE_TRACE_POINT_ARGS(uint16_t tx_port, uint16_t rx_port),
+	rte_trace_point_emit_u16(tx_port);
+	rte_trace_point_emit_u16(rx_port);
+)
+
+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),
+	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(
+	rte_eth_trace_hairpin_unbind,
+	RTE_TRACE_POINT_ARGS(uint16_t tx_port, uint16_t rx_port),
+	rte_trace_point_emit_u16(tx_port);
+	rte_trace_point_emit_u16(rx_port);
+)
+
+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),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(speed_fec_capa);
+	rte_trace_point_emit_u32(num);
+)
+
+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(
+	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),
+	rte_trace_point_emit_u16(port_id);
+	rte_trace_point_emit_ptr(features);
+)
+
+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(
+	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/version.map b/lib/ethdev/version.map
index d46f31b63f..79bf947042 100644
--- a/lib/ethdev/version.map
+++ b/lib/ethdev/version.map
@@ -285,6 +285,153 @@  EXPERIMENTAL {
 	rte_mtr_color_in_protocol_priority_get;
 	rte_mtr_color_in_protocol_set;
 	rte_mtr_meter_vlan_table_update;
+
+	# added in 22.11
+	__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_tx_queue_setup;
+	__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;
 };
 
 INTERNAL {