Hi Morten,

Thanks for your comments and suggestions. My comments are inline.

>-----Original Message-----
>From: Morten Brørup <m...@smartsharesystems.com>
>Sent: Thursday, December 22, 2022 4:03 PM
>To: Ankur Dwivedi <adwiv...@marvell.com>; dev@dpdk.org
>Cc: tho...@monjalon.net; david.march...@redhat.com; m...@ashroe.eu;
>or...@nvidia.com; ferruh.yi...@amd.com; ch...@att.com;
>humi...@huawei.com; linvi...@tuxdriver.com; ciara.lof...@intel.com;
>qi.z.zh...@intel.com; m...@semihalf.com; m...@semihalf.com;
>shaib...@amazon.com; evge...@amazon.com; igo...@amazon.com;
>cha...@amd.com; Igor Russkikh <irussk...@marvell.com>;
>shepard.sie...@atomicrules.com; ed.cz...@atomicrules.com;
>john.mil...@atomicrules.com; ajit.khapa...@broadcom.com;
>somnath.ko...@broadcom.com; Jerin Jacob Kollanukkaran
><jer...@marvell.com>; Maciej Czekaj [C] <mcze...@marvell.com>; Shijith
>Thotton <sthot...@marvell.com>; Srisivasubramanian Srinivasan
><sriniva...@marvell.com>; Harman Kalra <hka...@marvell.com>;
>rahul.lakkire...@chelsio.com; johnd...@cisco.com; hyon...@cisco.com;
>liudongdo...@huawei.com; yisen.zhu...@huawei.com;
>xuanziya...@huawei.com; cloud.wangxiao...@huawei.com;
>zhouguoy...@huawei.com; simei...@intel.com; wenjun1...@intel.com;
>qiming.y...@intel.com; yuying.zh...@intel.com; beilei.x...@intel.com;
>xiao.w.w...@intel.com; jingjing...@intel.com; junfeng....@intel.com;
>rosen...@intel.com; Nithin Kumar Dabilpuram <ndabilpu...@marvell.com>;
>Kiran Kumar Kokkilagadda <kirankum...@marvell.com>; Sunil Kumar Kori
><sk...@marvell.com>; Satha Koteswara Rao Kottidi
><skotesh...@marvell.com>; Liron Himi <lir...@marvell.com>;
>z...@semihalf.com; Radha Chintakuntla <rad...@marvell.com>;
>Veerasenareddy Burru <vbu...@marvell.com>; Sathesh B Edara
><sed...@marvell.com>; ma...@nvidia.com; viachesl...@nvidia.com;
>lon...@microsoft.com; spin...@cesnet.cz; chaoyong...@corigine.com;
>niklas.soderl...@corigine.com; hemant.agra...@nxp.com;
>sachin.sax...@oss.nxp.com; g.si...@nxp.com; apeksha.gu...@nxp.com;
>sachin.sax...@nxp.com; abo...@pensando.io; Rasesh Mody
><rm...@marvell.com>; Shahed Shaikh <shsha...@marvell.com>; Devendra
>Singh Rawat <dsinghra...@marvell.com>; andrew.rybche...@oktetlabs.ru;
>jiawe...@trustnetic.com; jianw...@trustnetic.com; jbehr...@vmware.com;
>maxime.coque...@redhat.com; chenbo....@intel.com;
>steven.webs...@windriver.com; matt.pet...@windriver.com;
>bruce.richard...@intel.com; mtetsu...@gmail.com; gr...@u256.net;
>jasvinder.si...@intel.com; cristian.dumitre...@intel.com; jgraj...@cisco.com;
>Jerin Jacob Kollanukkaran <jer...@marvell.com>
>Subject: [EXT] RE: [PATCH v4 1/6] eal: trace: add trace point emit for array
>
>External Email
>
>----------------------------------------------------------------------
>> From: Ankur Dwivedi [mailto:adwiv...@marvell.com]
>> Sent: Thursday, 22 December 2022 07.33
>>
>> Adds a trace point emit function for array. The maximum array bytes
>> which can be captured is set to 32.
>
>This seems very useful.
>
>Disclaimer: I am not familiar with the trace library or the CTF file format, 
>so my
>feedback below may be completely wrong and impossible - please keep in mind
>when reading.
>
>>
>> Also adds test case for emit array tracepoint function.
>>
>> Signed-off-by: Ankur Dwivedi <adwiv...@marvell.com>
>> ---
>>  app/test/test_trace.c                      |  3 +++
>>  lib/eal/common/eal_common_trace_points.c   |  2 ++
>>  lib/eal/include/rte_eal_trace.h            |  6 ++++++
>>  lib/eal/include/rte_trace_point.h          | 20 ++++++++++++++++++++
>>  lib/eal/include/rte_trace_point_register.h |  8 ++++++++
>>  5 files changed, 39 insertions(+)
>>
>> diff --git a/app/test/test_trace.c b/app/test/test_trace.c index
>> 6bedf14024..99cd0762d1 100644
>> --- a/app/test/test_trace.c
>> +++ b/app/test/test_trace.c
>> @@ -177,6 +177,7 @@ test_fp_trace_points(void)  static int
>>  test_generic_trace_points(void)
>>  {
>> +    uint8_t arr[32] = {0};
>>      int tmp;
>>
>>      rte_eal_trace_generic_void();
>> @@ -195,6 +196,8 @@ test_generic_trace_points(void)
>>      rte_eal_trace_generic_ptr(&tmp);
>>      rte_eal_trace_generic_str("my string");
>>      rte_eal_trace_generic_size_t(sizeof(void *));
>
>Please also test smaller, unaligned length, e.g.:
>rte_eal_trace_generic_char_array(arr, 17);
Ok.
>
>Please also test variable len, unknown at build time, e.g.:
>rte_eal_trace_generic_char_array(arr, rand() % 31);
Ok.
>
>> +    rte_eal_trace_generic_char_array(arr, 32);
>> +    rte_eal_trace_generic_char_array(arr, 64);
>>      RTE_EAL_TRACE_GENERIC_FUNC;
>>
>>      return TEST_SUCCESS;
>> diff --git a/lib/eal/common/eal_common_trace_points.c
>> b/lib/eal/common/eal_common_trace_points.c
>> index 0b0b254615..93fdaa634e 100644
>> --- a/lib/eal/common/eal_common_trace_points.c
>> +++ b/lib/eal/common/eal_common_trace_points.c
>> @@ -40,6 +40,8 @@
>> RTE_TRACE_POINT_REGISTER(rte_eal_trace_generic_size_t,
>>      lib.eal.generic.size_t)
>>  RTE_TRACE_POINT_REGISTER(rte_eal_trace_generic_func,
>>      lib.eal.generic.func)
>> +RTE_TRACE_POINT_REGISTER(rte_eal_trace_generic_char_array,
>> +    lib.eal.generic.char.array)
>>
>>  RTE_TRACE_POINT_REGISTER(rte_eal_trace_alarm_set,
>>      lib.eal.alarm.set)
>> diff --git a/lib/eal/include/rte_eal_trace.h
>> b/lib/eal/include/rte_eal_trace.h index 5ef4398230..34fdd5331f 100644
>> --- a/lib/eal/include/rte_eal_trace.h
>> +++ b/lib/eal/include/rte_eal_trace.h
>> @@ -143,6 +143,12 @@ RTE_TRACE_POINT(
>>      rte_trace_point_emit_string(func);
>>  )
>>
>> +RTE_TRACE_POINT(
>> +    rte_eal_trace_generic_char_array,
>> +    RTE_TRACE_POINT_ARGS(void *in, uint8_t len),
>> +    rte_trace_point_emit_char_array(in, len);
>> +)
>> +
>>  #define RTE_EAL_TRACE_GENERIC_FUNC
>> rte_eal_trace_generic_func(__func__)
>>
>>  /* Interrupt */
>> diff --git a/lib/eal/include/rte_trace_point.h
>> b/lib/eal/include/rte_trace_point.h
>> index 0f8700974f..9d9a9e0aaa 100644
>> --- a/lib/eal/include/rte_trace_point.h
>> +++ b/lib/eal/include/rte_trace_point.h
>> @@ -144,6 +144,8 @@ _tp _args \
>>  #define rte_trace_point_emit_ptr(val)
>>  /** Tracepoint function payload for string datatype */  #define
>> rte_trace_point_emit_string(val)
>> +/** Tracepoint function payload for char array */ #define
>> +rte_trace_point_emit_char_array(val, len)
>>
>>  #endif /* __DOXYGEN__ */
>>
>> @@ -151,6 +153,8 @@ _tp _args \
>>  #define __RTE_TRACE_EMIT_STRING_LEN_MAX 32
>>  /** @internal Macro to define event header size. */  #define
>> __RTE_TRACE_EVENT_HEADER_SZ sizeof(uint64_t)
>> +/** @internal Macro to define maximum emit length of array. */
>> +#define __RTE_TRACE_EMIT_ARRAY_LEN_MAX 32
>>
>>  /**
>>   * Enable recording events of the given tracepoint in the trace
>> buffer.
>> @@ -374,12 +378,28 @@ do { \
>>      mem = RTE_PTR_ADD(mem, __RTE_TRACE_EMIT_STRING_LEN_MAX); \
>} while
>> (0)
>>
>> +#define rte_trace_point_emit_char_array(in, len) \ do { \
>> +    if (unlikely(in == NULL)) \
>> +            return; \
>> +    if (len > __RTE_TRACE_EMIT_ARRAY_LEN_MAX) \
>> +            return; \
>> +    memcpy(mem, in, len); \
>> +    mem = RTE_PTR_ADD(mem, len); \
>
>This does not work for len < 32, because the trace format is defined to emit an
>array of 32 byte. You must always increment mem by 32:
I have tried smaller byte lengths such as mac address (6 bytes). It was working 
correctly. There were
stale values in rest of the bytes (byte 6 -byte 31).
>
>mem = RTE_PTR_ADD(mem, __RTE_TRACE_EMIT_ARRAY_LEN_MAX); \
>
>Also, instead of silently ignoring len > __RTE_TRACE_EMIT_ARRAY_LEN_MAX,
>you should:
Ok.
>
>if (len < __RTE_TRACE_EMIT_ARRAY_LEN_MAX) { \
>       memcpy(mem, in, len); \
>       memset(RTE_PTR_ADD(mem, len), 0,
>__RTE_TRACE_EMIT_ARRAY_LEN_MAX - len); \ } else { \
>       memcpy(mem, in, __RTE_TRACE_EMIT_ARRAY_LEN_MAX); \ } \
>
>If not emitting the length value (see my comments at the end), you should clear
>the unused part of the array; notice the added memset().
memset will help in clearing the stale values in unused bytes.
>
>> +} while (0)
>> +
>>  #else
>>
>>  #define __rte_trace_point_emit_header_generic(t) RTE_SET_USED(t)
>> #define __rte_trace_point_emit_header_fp(t) RTE_SET_USED(t)  #define
>> __rte_trace_point_emit(in, type) RTE_SET_USED(in)  #define
>> rte_trace_point_emit_string(in) RTE_SET_USED(in)
>> +#define rte_trace_point_emit_char_array(in, len) \ do { \
>> +    RTE_SET_USED(in); \
>> +    RTE_SET_USED(len); \
>> +} while (0)
>> +
>>
>>  #endif /* ALLOW_EXPERIMENTAL_API */
>>  #endif /* _RTE_TRACE_POINT_REGISTER_H_ */
>> diff --git a/lib/eal/include/rte_trace_point_register.h
>> b/lib/eal/include/rte_trace_point_register.h
>> index a32f4d731b..c76fe4dd48 100644
>> --- a/lib/eal/include/rte_trace_point_register.h
>> +++ b/lib/eal/include/rte_trace_point_register.h
>> @@ -47,6 +47,14 @@ do { \
>>              RTE_STR(in)"[32]", "string_bounded_t"); \
>>  } while (0)
>>
>> +#define rte_trace_point_emit_char_array(in, len) \
>> +do { \
>> +    RTE_SET_USED(in); \
>> +    if (len > __RTE_TRACE_EMIT_ARRAY_LEN_MAX) \
>> +            return; \
>> +    __rte_trace_point_emit_field(len, RTE_STR(in)"[32]", "uint8_t");
>> \
>> +} while (0)
>> +
>>  #ifdef __cplusplus
>>  }
>>  #endif
>> --
>> 2.25.1
>>
>
>This emits 0..32 byte of binary data into a 32 byte array to the trace. But 
>there is
>no way to read the length from the trace file, i.e. how many of the 32 bytes
>contain data.
Yes, that's correct.
>
>If length is required to be constant at build time, perhaps the "[32]" in
>rte_trace_point_register.h can be modified to emit the length as the array 
>size.
>(If so, the requirement for the length to be constant must be documented.)
>
>Suggestion (not a requirement):
>
>Instead of simply emitting an array, consider emitting a structure where the 
>first
>field is the length, and the second field is an array of 32 bytes of data:
>
>struct {
>    integer {
>        size = 8;
>    } len;
>    integer {
>        size = 8;
>    } data[32];
>}
>
>Or even better, emit a sequence [1]:
>
>struct {
>    integer {
>        size = 16;
>    } length;
>    integer {
>        size = 8;
>    } data[length];
>}
>
>[1]: https://urldefense.proofpoint.com/v2/url?u=https-3A__diamon.org_ctf_-
>23spec4.2.4&d=DwIFAw&c=nKjWec2b6R0mOyPaz7xtfQ&r=ILjiNF3GF25y6QdHZ
>UxMl6JrStU0MIuCtO5dMzn3Ybk&m=ctL43w6fn6cvuduQqeqQ0Scs3RQQIiv5uba
>Lz9le2xyd8EJBURdSXD8IFLo7k-6H&s=vBCuOfVlqnotYr2SsovxiI7JRawt-uDVCDay-
>_B1VD4&e=
I will look into the above link.
>
>If emitting a sequence, the length does not have to be limited to 32 byte, but
>could be up to 65535 byte.
>
>
>And a personal preference about the name: I would prefer _blob instead of
>_char_array.
Will think about this.

Reply via email to