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