Support any expression as a blob length by using an intermediate
variable in the trace point emitter itself.

This also avoids any side effect on the passed variable.

Signed-off-by: David Marchand <david.march...@redhat.com>
---
Changes since v1:
- removed code relying on arguments in "registering"
  rte_trace_point_emit_blob implementation (see patch 3),
- moved build check in non registering __rte_trace_point_emit,

---
 lib/eal/include/rte_trace_point.h          | 12 ++++++----
 lib/eal/include/rte_trace_point_register.h |  2 +-
 lib/ethdev/ethdev_trace.h                  | 27 ++++++----------------
 3 files changed, 15 insertions(+), 26 deletions(-)

diff --git a/lib/eal/include/rte_trace_point.h 
b/lib/eal/include/rte_trace_point.h
index b24db3b6da..a162502002 100644
--- a/lib/eal/include/rte_trace_point.h
+++ b/lib/eal/include/rte_trace_point.h
@@ -378,6 +378,7 @@ do { \
 
 #define __rte_trace_point_emit(in, type) \
 do { \
+       RTE_BUILD_BUG_ON(sizeof(type) != sizeof(typeof(in))); \
        memcpy(mem, &(in), sizeof(in)); \
        mem = RTE_PTR_ADD(mem, sizeof(in)); \
 } while (0)
@@ -392,13 +393,14 @@ do { \
 
 #define rte_trace_point_emit_blob(in, len) \
 do { \
+       uint8_t size = len; \
        if (unlikely(in == NULL)) \
                return; \
-       if (len > RTE_TRACE_BLOB_LEN_MAX) \
-               len = RTE_TRACE_BLOB_LEN_MAX; \
-       __rte_trace_point_emit(len, uint8_t); \
-       memcpy(mem, in, len); \
-       memset(RTE_PTR_ADD(mem, len), 0, RTE_TRACE_BLOB_LEN_MAX - len); \
+       if (size > RTE_TRACE_BLOB_LEN_MAX) \
+               size = RTE_TRACE_BLOB_LEN_MAX; \
+       __rte_trace_point_emit(size, uint8_t); \
+       memcpy(mem, in, size); \
+       memset(RTE_PTR_ADD(mem, size), 0, RTE_TRACE_BLOB_LEN_MAX - size); \
        mem = RTE_PTR_ADD(mem, RTE_TRACE_BLOB_LEN_MAX); \
 } while (0)
 
diff --git a/lib/eal/include/rte_trace_point_register.h 
b/lib/eal/include/rte_trace_point_register.h
index 748c931830..1d6198b32f 100644
--- a/lib/eal/include/rte_trace_point_register.h
+++ b/lib/eal/include/rte_trace_point_register.h
@@ -37,7 +37,7 @@ RTE_INIT(trace##_init) \
 
 #define __rte_trace_point_emit(in, type) \
 do { \
-       RTE_BUILD_BUG_ON(sizeof(type) != sizeof(typeof(in))); \
+       RTE_SET_USED(in); \
        __rte_trace_point_emit_field(sizeof(type), RTE_STR(in), \
                RTE_STR(type)); \
 } while (0)
diff --git a/lib/ethdev/ethdev_trace.h b/lib/ethdev/ethdev_trace.h
index 5951ae2d99..c65b78590a 100644
--- a/lib/ethdev/ethdev_trace.h
+++ b/lib/ethdev/ethdev_trace.h
@@ -860,10 +860,8 @@ RTE_TRACE_POINT(
        rte_ethdev_trace_mac_addr_add,
        RTE_TRACE_POINT_ARGS(uint16_t port_id,
                const struct rte_ether_addr *addr, uint32_t pool, int ret),
-       uint8_t len = RTE_ETHER_ADDR_LEN;
-
        rte_trace_point_emit_u16(port_id);
-       rte_trace_point_emit_blob(addr->addr_bytes, len);
+       rte_trace_point_emit_blob(addr->addr_bytes, RTE_ETHER_ADDR_LEN);
        rte_trace_point_emit_u32(pool);
        rte_trace_point_emit_int(ret);
 )
@@ -872,20 +870,16 @@ RTE_TRACE_POINT(
        rte_ethdev_trace_mac_addr_remove,
        RTE_TRACE_POINT_ARGS(uint16_t port_id,
                const struct rte_ether_addr *addr),
-       uint8_t len = RTE_ETHER_ADDR_LEN;
-
        rte_trace_point_emit_u16(port_id);
-       rte_trace_point_emit_blob(addr->addr_bytes, len);
+       rte_trace_point_emit_blob(addr->addr_bytes, RTE_ETHER_ADDR_LEN);
 )
 
 RTE_TRACE_POINT(
        rte_ethdev_trace_default_mac_addr_set,
        RTE_TRACE_POINT_ARGS(uint16_t port_id,
                const struct rte_ether_addr *addr),
-       uint8_t len = RTE_ETHER_ADDR_LEN;
-
        rte_trace_point_emit_u16(port_id);
-       rte_trace_point_emit_blob(addr->addr_bytes, len);
+       rte_trace_point_emit_blob(addr->addr_bytes, RTE_ETHER_ADDR_LEN);
 )
 
 RTE_TRACE_POINT(
@@ -1102,11 +1096,9 @@ RTE_TRACE_POINT(
        RTE_TRACE_POINT_ARGS(uint16_t port_id,
                const struct rte_ether_addr *mc_addr_set, uint32_t nb_mc_addr,
                int ret),
-       uint8_t len = nb_mc_addr * RTE_ETHER_ADDR_LEN;
-
        rte_trace_point_emit_u16(port_id);
        rte_trace_point_emit_u32(nb_mc_addr);
-       rte_trace_point_emit_blob(mc_addr_set, len);
+       rte_trace_point_emit_blob(mc_addr_set, nb_mc_addr * RTE_ETHER_ADDR_LEN);
        rte_trace_point_emit_int(ret);
 )
 
@@ -1214,13 +1206,10 @@ RTE_TRACE_POINT(
        rte_ethdev_trace_get_dcb_info,
        RTE_TRACE_POINT_ARGS(uint16_t port_id,
                const struct rte_eth_dcb_info *dcb_info, int ret),
-       uint8_t num_user_priorities = RTE_ETH_DCB_NUM_USER_PRIORITIES;
-       uint8_t num_tcs = RTE_ETH_DCB_NUM_TCS;
-
        rte_trace_point_emit_u16(port_id);
        rte_trace_point_emit_u8(dcb_info->nb_tcs);
-       rte_trace_point_emit_blob(dcb_info->prio_tc, num_user_priorities);
-       rte_trace_point_emit_blob(dcb_info->tc_bws, num_tcs);
+       rte_trace_point_emit_blob(dcb_info->prio_tc, 
RTE_ETH_DCB_NUM_USER_PRIORITIES);
+       rte_trace_point_emit_blob(dcb_info->tc_bws, RTE_ETH_DCB_NUM_TCS);
        rte_trace_point_emit_int(ret);
 )
 
@@ -2126,10 +2115,8 @@ RTE_TRACE_POINT_FP(
        rte_eth_trace_macaddr_get,
        RTE_TRACE_POINT_ARGS(uint16_t port_id,
                const struct rte_ether_addr *mac_addr),
-       uint8_t len = RTE_ETHER_ADDR_LEN;
-
        rte_trace_point_emit_u16(port_id);
-       rte_trace_point_emit_blob(mac_addr->addr_bytes, len);
+       rte_trace_point_emit_blob(mac_addr->addr_bytes, RTE_ETHER_ADDR_LEN);
 )
 
 /* Called in loop in examples/ip_pipeline */
-- 
2.48.1

Reply via email to