summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
author童宗振 <[email protected]>2024-03-13 10:46:27 +0000
committer童宗振 <[email protected]>2024-03-13 10:46:27 +0000
commit468c21fa9ca6c37b66839635dbf8cac8479c0c6c (patch)
tree7615fd431a39a0b54cea96fdc3b46103aca73ca7 /app
parentdde974556876ed3e6e10b8051dff9dbead329f69 (diff)
Dp trace perf opti
Diffstat (limited to 'app')
-rw-r--r--app/include/mrdp_trace.h4
-rw-r--r--app/src/dp_trace.c63
-rw-r--r--app/src/monit.c216
-rw-r--r--app/src/mrb.c7
-rw-r--r--app/src/rawio.c13
5 files changed, 188 insertions, 115 deletions
diff --git a/app/include/mrdp_trace.h b/app/include/mrdp_trace.h
index ff95c9f..7bcfef5 100644
--- a/app/include/mrdp_trace.h
+++ b/app/include/mrdp_trace.h
@@ -6,4 +6,6 @@ int marsio_dp_trace_init(struct mr_instance * instance);
void marsio_dp_trace_record_write(struct mr_instance * instance, marsio_buff_t * mbuf);
void marsio_rte_pktmbuf_free(struct rte_mbuf * m);
void marsio_rte_mempool_generic_put(struct rte_mempool * mp, void * const * obj_table, unsigned int n,
- struct rte_mempool_cache * cache); \ No newline at end of file
+ struct rte_mempool_cache * cache);
+thread_id_t marsio_thread_id_get();
+cJSON * marsio_dp_trace_monit_loop(struct mr_instance * instance); \ No newline at end of file
diff --git a/app/src/dp_trace.c b/app/src/dp_trace.c
index cd55012..ab16f25 100644
--- a/app/src/dp_trace.c
+++ b/app/src/dp_trace.c
@@ -1,6 +1,8 @@
#include "mrapp.h"
#include "mrdp_trace.h"
+extern __thread struct mr_thread_info thread_info;
+
int marsio_dp_trace_init(struct mr_instance * mr_instance)
{
mr_instance->trace = dp_trace_process_create(DP_TRACE_PROCESS_APP);
@@ -20,7 +22,7 @@ int marsio_dp_trace_record_emit_str(struct mr_instance * mr_instance, marsio_buf
struct dp_record_meta meta = {};
snprintf(meta.appsym, sizeof(meta.appsym), "%s", mr_instance->appsym);
snprintf(meta.module, sizeof(meta.module), "%s", module);
- return dp_trace_record_emit_str(mr_instance->trace, (struct rte_mbuf *)mbuf, &meta, str);
+ return dp_trace_record_emit_str(mr_instance->trace, (struct rte_mbuf *)mbuf, marsio_thread_id_get(), &meta, str);
}
int marsio_dp_trace_record_emit_fmt(struct mr_instance * mr_instance, marsio_buff_t * mbuf, const char * module,
@@ -36,7 +38,8 @@ int marsio_dp_trace_record_emit_fmt(struct mr_instance * mr_instance, marsio_buf
if (unlikely(ret < 0 || ret >= sizeof(buffer)))
{
- rte_atomic64_inc(&trace->inst->statistics.record_emit_failed_trace_length_too_long);
+ thread_id_t thread_id = marsio_thread_id_get();
+ trace->statistics[thread_id].record_emit_failed_trace_oversize++;
return -1;
}
@@ -44,18 +47,18 @@ int marsio_dp_trace_record_emit_fmt(struct mr_instance * mr_instance, marsio_buf
snprintf(meta.appsym, sizeof(meta.appsym), "%s", mr_instance->appsym);
snprintf(meta.module, sizeof(meta.module), "%s", module);
- ret = dp_trace_record_emit_str(trace, (struct rte_mbuf *)mbuf, &meta, buffer);
+ ret = dp_trace_record_emit_str(trace, (struct rte_mbuf *)mbuf, marsio_thread_id_get(), &meta, buffer);
return ret;
}
void marsio_dp_trace_filter_exec(struct mr_instance * instance, marsio_buff_t * mbuf)
{
- dp_trace_filter_exec(instance->trace, (struct rte_mbuf *)mbuf, 0);
+ dp_trace_filter_exec(instance->trace, (struct rte_mbuf *)mbuf, 0, marsio_thread_id_get());
}
void marsio_dp_trace_record_write(struct mr_instance * mr_instance, marsio_buff_t * mbuf)
{
- return dp_trace_record_write(mr_instance->trace, (struct rte_mbuf *)mbuf);
+ return dp_trace_record_write(mr_instance->trace, (struct rte_mbuf *)mbuf, marsio_thread_id_get());
}
void marsio_rte_pktmbuf_free(struct rte_mbuf * m)
@@ -76,4 +79,54 @@ void marsio_rte_mempool_generic_put(struct rte_mempool * mp, void * const * obj_
marsio_dp_trace_record_write(mr_instance, (struct rte_mbuf *)obj_table[i]);
}
rte_mempool_generic_put(mp, obj_table, n, cache);
+}
+
+thread_id_t marsio_thread_id_get()
+{
+ return thread_info.thread_id;
+}
+
+cJSON * marsio_dp_trace_monit_loop(struct mr_instance * instance)
+{
+ cJSON * json_root = cJSON_CreateObject();
+ struct dp_trace_process * trace = instance->trace;
+
+ struct dp_trace_stat monit_statistics = {};
+
+ for (unsigned int i = 0; i < RTE_MAX_LCORE; i++)
+ {
+ struct dp_trace_stat * statistics_i = &trace->statistics[i];
+ monit_statistics.filter_exec_hit += statistics_i->filter_exec_hit;
+ monit_statistics.filter_exec_miss += statistics_i->filter_exec_miss;
+ monit_statistics.reach_pkt_cnt_limit += statistics_i->reach_pkt_cnt_limit;
+ monit_statistics.record_buf_alloc_failed_no_mem += statistics_i->record_buf_alloc_failed_no_mem;
+ monit_statistics.record_buf_alloc_success += statistics_i->record_buf_alloc_success;
+ monit_statistics.ring_enqueue_failed += statistics_i->ring_enqueue_failed;
+ monit_statistics.ring_enqueue_success += statistics_i->ring_enqueue_success;
+ monit_statistics.record_emit_failed_trace_oversize += statistics_i->record_emit_failed_trace_oversize;
+ monit_statistics.record_emit_failed_no_space_in_buf += statistics_i->record_emit_failed_no_space_in_buf;
+ monit_statistics.record_emit_success += statistics_i->record_emit_success;
+ }
+
+ cJSON_AddBoolToObject(json_root, "trace_enable", trace->inst->enable);
+
+ cJSON_AddNumberToObject(json_root, "filter_exec_hit", monit_statistics.filter_exec_hit);
+ cJSON_AddNumberToObject(json_root, "filter_exec_miss", monit_statistics.filter_exec_miss);
+
+ cJSON_AddNumberToObject(json_root, "reach_pkt_cnt_limit", monit_statistics.reach_pkt_cnt_limit);
+
+ cJSON_AddNumberToObject(json_root, "record_buf_alloc_failed_no_mem",
+ monit_statistics.record_buf_alloc_failed_no_mem);
+ cJSON_AddNumberToObject(json_root, "record_buf_alloc_success", monit_statistics.record_buf_alloc_success);
+
+ cJSON_AddNumberToObject(json_root, "ring_enqueue_failed", monit_statistics.ring_enqueue_failed);
+ cJSON_AddNumberToObject(json_root, "ring_enqueue_success", monit_statistics.ring_enqueue_success);
+
+ cJSON_AddNumberToObject(json_root, "record_emit_failed_trace_oversize",
+ monit_statistics.record_emit_failed_trace_oversize);
+ cJSON_AddNumberToObject(json_root, "record_emit_failed_no_space_in_buf",
+ monit_statistics.record_emit_failed_no_space_in_buf);
+ cJSON_AddNumberToObject(json_root, "record_emit_success", monit_statistics.record_emit_success);
+
+ return json_root;
} \ No newline at end of file
diff --git a/app/src/monit.c b/app/src/monit.c
index a169ab7..e543b0f 100644
--- a/app/src/monit.c
+++ b/app/src/monit.c
@@ -1,11 +1,12 @@
/* \brief 应用状态监测数据输出
-*
-* \author Lu Qiuwen<[email protected]>
-* \date 2016-11-30
-*/
+ *
+ * \author Lu Qiuwen<[email protected]>
+ * \date 2016-11-30
+ */
-#include <mrapp.h>
#include <cJSON.h>
+#include <mrapp.h>
+#include <mrdp_trace.h>
unsigned int g_monit_interval = 1;
@@ -18,12 +19,12 @@ int vdev_instance_stats_get(struct vdev_instance * vdi, struct vdev_stat_info *
stat_info->nr_rxstream = vdi->nr_rxstream;
stat_info->nr_txstream = vdi->nr_txstream;
- if(vdi->nr_rxstream > 0)
+ if (vdi->nr_rxstream > 0)
{
st_cons_rx = vnode_mirror_cons_stat_get(vdi->vnode_rx_cons);
}
- if(vdi->nr_txstream > 0)
+ if (vdi->nr_txstream > 0)
{
st_prod_tx = vnode_mirror_prod_stat_get(vdi->vnode_tx_prod);
st_prod_ftx = vnode_mirror_prod_stat_get(vdi->vnode_ftx_prod);
@@ -68,14 +69,14 @@ void vdev_instance_stats_last_get(struct vdev_instance * vdi, struct vdev_stat_i
static cJSON * __create_uint64_array(const uint64_t * value, int nr_value)
{
- struct cJSON * uint64_array = cJSON_CreateArray();
- for (int i = 0; i < nr_value; i++)
- cJSON_AddItemToArray(uint64_array, cJSON_CreateNumber(value[i]));
- return uint64_array;
+ struct cJSON * uint64_array = cJSON_CreateArray();
+ for (int i = 0; i < nr_value; i++)
+ cJSON_AddItemToArray(uint64_array, cJSON_CreateNumber(value[i]));
+ return uint64_array;
}
-static cJSON * __create_uint64_delta_array(const uint64_t * value_large,
- const uint64_t * value_small, int nr_value, int interval)
+static cJSON * __create_uint64_delta_array(const uint64_t * value_large, const uint64_t * value_small, int nr_value,
+ int interval)
{
struct cJSON * uint64_array = cJSON_CreateArray();
for (int i = 0; i < nr_value; i++)
@@ -108,19 +109,21 @@ static cJSON * __create_vdev_stats(struct vdev_instance * vdi)
/* Gauge */
struct cJSON * j_vdev_gauge = cJSON_CreateObject();
-#define __JOIN_VDEV_VALUE_STATS_ITEM(item, streams) do { \
- cJSON_AddItemToObject(j_vdev_value, #item, \
- __create_uint64_array(_stat_info.item, streams)); \
-} while(0)
-
-#define __JOIN_VDEV_VALUE_BYTES_TO_BITS_STAT_ITEM(item, streams) do { \
- uint64_t __bits_item[MR_SID_MAX]; \
- for (int i = 0; i < streams; i++) \
- __bits_item[i] = _stat_info.item[i] * 8; \
- \
- cJSON_AddItemToObject(j_vdev_value, #item, __create_uint64_array( \
- __bits_item, streams)); \
-} while(0)
+#define __JOIN_VDEV_VALUE_STATS_ITEM(item, streams) \
+ do \
+ { \
+ cJSON_AddItemToObject(j_vdev_value, #item, __create_uint64_array(_stat_info.item, streams)); \
+ } while (0)
+
+#define __JOIN_VDEV_VALUE_BYTES_TO_BITS_STAT_ITEM(item, streams) \
+ do \
+ { \
+ uint64_t __bits_item[MR_SID_MAX]; \
+ for (int i = 0; i < streams; i++) \
+ __bits_item[i] = _stat_info.item[i] * 8; \
+ \
+ cJSON_AddItemToObject(j_vdev_value, #item, __create_uint64_array(__bits_item, streams)); \
+ } while (0)
__JOIN_VDEV_VALUE_STATS_ITEM(rx_on_line, nr_rx_stream);
__JOIN_VDEV_VALUE_STATS_ITEM(rx_deliver, nr_rx_stream);
@@ -142,25 +145,28 @@ static cJSON * __create_vdev_stats(struct vdev_instance * vdi)
__JOIN_VDEV_VALUE_STATS_ITEM(ltx_missed, nr_tx_stream);
__JOIN_VDEV_VALUE_BYTES_TO_BITS_STAT_ITEM(ltx_total_len, nr_tx_stream);
-#define __JOIN_VDEV_SPEED_STATS_ITEM(item, streams) do { \
- cJSON_AddItemToObject(j_vdev_speed, #item, \
- __create_uint64_delta_array(_stat_info.item, \
- _stat_info_last.item, streams, g_monit_interval)); \
-} while(0)
-
-#define __JOIN_VDEV_SPEED_BYTES_TO_BITS_STAT_ITEM(item, streams) do { \
- uint64_t __bits_item[MR_SID_MAX]; \
- for (int i = 0; i < streams; i++) \
- __bits_item[i] = _stat_info.item[i] * 8; \
- \
- uint64_t __bits_item_last[MR_SID_MAX]; \
- for (int i = 0; i < streams; i++) \
- __bits_item_last[i] = _stat_info_last.item[i] * 8; \
- \
- cJSON_AddItemToObject(j_vdev_speed, #item, \
- __create_uint64_delta_array(__bits_item, \
- __bits_item_last, streams, g_monit_interval)); \
-} while(0)
+#define __JOIN_VDEV_SPEED_STATS_ITEM(item, streams) \
+ do \
+ { \
+ cJSON_AddItemToObject( \
+ j_vdev_speed, #item, \
+ __create_uint64_delta_array(_stat_info.item, _stat_info_last.item, streams, g_monit_interval)); \
+ } while (0)
+
+#define __JOIN_VDEV_SPEED_BYTES_TO_BITS_STAT_ITEM(item, streams) \
+ do \
+ { \
+ uint64_t __bits_item[MR_SID_MAX]; \
+ for (int i = 0; i < streams; i++) \
+ __bits_item[i] = _stat_info.item[i] * 8; \
+ \
+ uint64_t __bits_item_last[MR_SID_MAX]; \
+ for (int i = 0; i < streams; i++) \
+ __bits_item_last[i] = _stat_info_last.item[i] * 8; \
+ \
+ cJSON_AddItemToObject(j_vdev_speed, #item, \
+ __create_uint64_delta_array(__bits_item, __bits_item_last, streams, g_monit_interval)); \
+ } while (0)
__JOIN_VDEV_SPEED_STATS_ITEM(rx_on_line, nr_rx_stream);
__JOIN_VDEV_SPEED_STATS_ITEM(rx_deliver, nr_rx_stream);
@@ -183,14 +189,14 @@ static cJSON * __create_vdev_stats(struct vdev_instance * vdi)
__JOIN_VDEV_SPEED_BYTES_TO_BITS_STAT_ITEM(ltx_total_len, nr_tx_stream);
cJSON * rx_q_len_array = cJSON_CreateArray();
- for(unsigned int i = 0; i < nr_rx_stream; i++)
+ for (unsigned int i = 0; i < nr_rx_stream; i++)
{
cJSON_AddItemToArray(rx_q_len_array, cJSON_CreateNumber(_stat_info.rx_q_len_max[i]));
}
cJSON_AddItemToObject(j_vdev_gauge, "rx_q_len", rx_q_len_array);
cJSON * rx_q_avg_len_array = cJSON_CreateArray();
- for(unsigned int i = 0; i < nr_rx_stream; i++)
+ for (unsigned int i = 0; i < nr_rx_stream; i++)
{
cJSON_AddItemToArray(rx_q_avg_len_array, cJSON_CreateNumber(_stat_info.rx_q_len_avg_max[i]));
}
@@ -207,35 +213,36 @@ static cJSON * __create_vdev_stats(struct vdev_instance * vdi)
// 运行时原始报文设备统计计数
static cJSON * monit_vdev(struct mr_instance * instance)
{
- struct cJSON * j_vdev_array = cJSON_CreateArray();
- for(int i = 0; i < instance->nr_vdevs; i++)
- {
+ struct cJSON * j_vdev_array = cJSON_CreateArray();
+ for (int i = 0; i < instance->nr_vdevs; i++)
+ {
struct mr_vdev * vdev = &instance->vdevs[i];
- if (vdev == NULL) continue;
-
- cJSON * j_vdev = cJSON_CreateObject();
- cJSON_AddStringToObject(j_vdev, "symbol", vdev->devsym);
- cJSON_AddNumberToObject(j_vdev, "rxstreams", vdev->nr_rxstream);
- cJSON_AddNumberToObject(j_vdev, "txstreams", vdev->nr_txstream);
- cJSON_AddItemToObject(j_vdev, "stats", __create_vdev_stats(vdev->vdi));
- cJSON_AddItemToArray(j_vdev_array, j_vdev);
- }
+ if (vdev == NULL)
+ continue;
+
+ cJSON * j_vdev = cJSON_CreateObject();
+ cJSON_AddStringToObject(j_vdev, "symbol", vdev->devsym);
+ cJSON_AddNumberToObject(j_vdev, "rxstreams", vdev->nr_rxstream);
+ cJSON_AddNumberToObject(j_vdev, "txstreams", vdev->nr_txstream);
+ cJSON_AddItemToObject(j_vdev, "stats", __create_vdev_stats(vdev->vdi));
+ cJSON_AddItemToArray(j_vdev_array, j_vdev);
+ }
- return j_vdev_array;
+ return j_vdev_array;
}
static cJSON * monit_app_stat(struct mr_instance * instance)
{
struct cJSON * j_root = cJSON_CreateObject();
-#define _trans_app_stat(item) \
- uint64_t __trans_##item[MR_SID_MAX]; \
- for(int i = 0; i < instance->nr_dataplane_thread; i++) \
- { \
- __trans_##item[i] = instance->stat[i].item; \
- } \
+#define _trans_app_stat(item) \
+ uint64_t __trans_##item[MR_SID_MAX]; \
+ for (int i = 0; i < instance->nr_dataplane_thread; i++) \
+ { \
+ __trans_##item[i] = instance->stat[i].item; \
+ }
-#define _trans_app_stat_array(item) __trans_##item
+#define _trans_app_stat_array(item) __trans_##item
_trans_app_stat(packet_recv_count);
_trans_app_stat(packet_recv_length);
@@ -252,17 +259,17 @@ static cJSON * monit_app_stat(struct mr_instance * instance)
uint64_t __trans_mbuf_in_use_count[MR_SID_MAX];
for (int i = 0; i < instance->nr_dataplane_thread; i++)
{
- __trans_mbuf_in_use_count[i] = __trans_packet_recv_count[i] +
- __trans_mbuf_alloc_count[i] - __trans_packet_send_count[i] -
- __trans_mbuf_free_count[i];
+ __trans_mbuf_in_use_count[i] = __trans_packet_recv_count[i] + __trans_mbuf_alloc_count[i] -
+ __trans_packet_send_count[i] - __trans_mbuf_free_count[i];
}
-#define _json_generate(item) \
-do { \
- cJSON_AddItemToObject(j_root, #item, __create_uint64_array( \
- _trans_app_stat_array(item), instance->nr_dataplane_thread)); \
-} while(0) \
-
+#define _json_generate(item) \
+ do \
+ { \
+ cJSON_AddItemToObject(j_root, #item, \
+ __create_uint64_array(_trans_app_stat_array(item), instance->nr_dataplane_thread)); \
+ } while (0)
+
_json_generate(packet_recv_count);
_json_generate(packet_recv_length);
_json_generate(packet_send_count);
@@ -282,45 +289,46 @@ do { \
return j_root;
}
-
static cJSON * monit_app_info(struct mr_instance * instance)
{
- struct cJSON * j_root = cJSON_CreateObject();
- cJSON_AddStringToObject(j_root, "symbol", instance->appsym);
- return j_root;
+ struct cJSON * j_root = cJSON_CreateObject();
+ cJSON_AddStringToObject(j_root, "symbol", instance->appsym);
+ return j_root;
}
static cJSON * monit_root(struct mr_instance * instance)
{
- struct cJSON * j_root = cJSON_CreateObject();
- cJSON_AddItemToObject(j_root, "appinfo", monit_app_info(instance));
- cJSON_AddItemToObject(j_root, "raw", monit_vdev(instance));
+ struct cJSON * j_root = cJSON_CreateObject();
+ cJSON_AddItemToObject(j_root, "appinfo", monit_app_info(instance));
+ cJSON_AddItemToObject(j_root, "raw", monit_vdev(instance));
cJSON_AddItemToObject(j_root, "appstat", monit_app_stat(instance));
+ cJSON_AddItemToObject(j_root, "dp-trace-path", marsio_dp_trace_monit_loop(instance));
+
+ if (instance->neigh != NULL)
+ {
+ struct cJSON * j_monit_neigh = neighbour_manager_monit(instance->neigh);
+ cJSON_AddItemToObject(j_root, "neigh", j_monit_neigh);
+ }
- if (instance->neigh != NULL)
- {
- struct cJSON * j_monit_neigh = neighbour_manager_monit(instance->neigh);
- cJSON_AddItemToObject(j_root, "neigh", j_monit_neigh);
- }
-
- return j_root;
+ return j_root;
}
int mrapp_monit_loop(struct mr_instance * instance)
{
- cJSON * j_root = monit_root(instance);
- char * str_json_print = cJSON_Print(j_root);
-
- FILE * fp_monit = fopen(instance->monit_file_path, "w");
- if (fp_monit == NULL)
- {
- MR_WARNING("monit file %s open failed, cannot dump program stat info : %s",
- instance->monit_file_path, strerror(errno)); return 0;
- }
-
- fprintf(fp_monit, "%s", str_json_print);
- cJSON_Delete(j_root);
+ cJSON * j_root = monit_root(instance);
+ char * str_json_print = cJSON_Print(j_root);
+
+ FILE * fp_monit = fopen(instance->monit_file_path, "w");
+ if (fp_monit == NULL)
+ {
+ MR_WARNING("monit file %s open failed, cannot dump program stat info : %s", instance->monit_file_path,
+ strerror(errno));
+ return 0;
+ }
+
+ fprintf(fp_monit, "%s", str_json_print);
+ cJSON_Delete(j_root);
free(str_json_print);
- fclose(fp_monit);
- return 0;
+ fclose(fp_monit);
+ return 0;
} \ No newline at end of file
diff --git a/app/src/mrb.c b/app/src/mrb.c
index 504bbb3..c6a22c6 100644
--- a/app/src/mrb.c
+++ b/app/src/mrb.c
@@ -151,8 +151,11 @@ void marsio_buff_free_v2(struct mr_instance * instance, marsio_buff_t * buff[],
struct rte_mbuf * m = (struct rte_mbuf *)buff[i];
struct rte_mbuf * m_next = NULL;
- marsio_dp_trace_record_emit_str(instance, m, NULL, "packet dropped by application");
- dp_trace_record_write(instance->trace, m);
+ if (marsio_dp_trace_record_can_emit(m))
+ {
+ marsio_dp_trace_record_emit_str(instance, m, NULL, "packet dropped by application");
+ dp_trace_record_write(instance->trace, m, marsio_thread_id_get());
+ }
__rte_mbuf_sanity_check(m, 1);
while (m != NULL)
diff --git a/app/src/rawio.c b/app/src/rawio.c
index d2e0dfa..2c3010d 100644
--- a/app/src/rawio.c
+++ b/app/src/rawio.c
@@ -96,7 +96,11 @@ int marsio_recv_burst(struct mr_vdev * vdev, queue_id_t qid, marsio_buff_t * mbu
for (int i = 0; i < nr_mbufs_out; i++)
{
mbufs[i] = rx_buffer->mbufs[rx_buffer->curser + i];
- marsio_dp_trace_record_emit_fmt(vdev->instance, mbufs[i], NULL, "packet rx, dev=%s, qid=%u", vdev->devsym, qid);
+ if (unlikely(marsio_dp_trace_record_can_emit(mbufs[i])))
+ {
+ marsio_dp_trace_record_emit_fmt(vdev->instance, mbufs[i], NULL, "packet rx, dev=%s, qid=%u", vdev->devsym,
+ qid);
+ }
}
rx_buffer->curser += nr_mbufs_out;
@@ -135,8 +139,11 @@ int marsio_send_buffer_flush(struct mr_vdev * vdev, queue_id_t sid)
#if 1
// hash[i] = hash_txq & 0x8000 ? hash_txq & 0x7FFF : hash_usr;
hash[i] = tx_buffer->mbufs[i]->hash.usr;
- marsio_dp_trace_record_emit_fmt(vdev->instance, tx_buffer->mbufs[i], NULL,
- "packet tx, dev=%s , qid=%u, hash=%u", vdev->devsym, sid, hash[i]);
+ if (marsio_dp_trace_record_can_emit(tx_buffer->mbufs[i]))
+ {
+ marsio_dp_trace_record_emit_fmt(vdev->instance, tx_buffer->mbufs[i], NULL,
+ "packet tx, dev=%s , qid=%u, hash=%u", vdev->devsym, sid, hash[i]);
+ }
#else
/* round-robin */
hash[i] = round_robin_counter++;