From 731917af63bd3d787b3a7d734439b2b5e3a76d3c Mon Sep 17 00:00:00 2001 From: Frank Du Date: Mon, 15 Jan 2024 14:04:35 +0800 Subject: [PATCH 1/4] rx/timing_parser: add compensation for the burst time jitter Signed-off-by: Frank Du --- include/st20_api.h | 3 + include/st_pipeline_api.h | 3 + lib/src/mt_main.h | 10 +++ lib/src/st2110/pipeline/st20_pipeline_rx.c | 1 + lib/src/st2110/st_header.h | 10 ++- lib/src/st2110/st_rx_video_session.c | 74 +++++++++++++++++++--- lib/src/st2110/st_rx_video_session.h | 2 - python/example/misc_util.py | 1 + python/example/rx_timing_parser.py | 1 + 9 files changed, 91 insertions(+), 14 deletions(-) diff --git a/include/st20_api.h b/include/st20_api.h index 0177e79df..7c72223f7 100644 --- a/include/st20_api.h +++ b/include/st20_api.h @@ -1420,6 +1420,9 @@ struct st20_rx_ops { /** Optional. Flags to control session behaviors. See ST20_RX_FLAG_* for possible value */ uint32_t flags; + /* Optional, the size for each mt_rxq_burst, leave to zero to let system select a + * default value */ + uint16_t rx_burst_size; /** * Mandatory for ST20_TYPE_FRAME_LEVEL/ST20_TYPE_SLICE_LEVEL. diff --git a/include/st_pipeline_api.h b/include/st_pipeline_api.h index e72b34612..cb66fd401 100644 --- a/include/st_pipeline_api.h +++ b/include/st_pipeline_api.h @@ -873,6 +873,9 @@ struct st20p_rx_ops { /** Optional. Flags to control session behaviors. See ST20P_RX_FLAG_* for possible value */ uint32_t flags; + /* Optional, the size for each mt_rxq_burst, leave to zero to let system select a + * default value */ + uint16_t rx_burst_size; /** * Optional. Callback when frame available in the lib. * And only non-block method can be used within this callback as it run from lcore diff --git a/lib/src/mt_main.h b/lib/src/mt_main.h index df97b8b80..89bb92b57 100644 --- a/lib/src/mt_main.h +++ b/lib/src/mt_main.h @@ -1839,6 +1839,16 @@ static inline uint32_t st_rx_mbuf_get_len(struct rte_mbuf* mbuf) { return priv->rx_priv.len; } +static inline void st_rx_mbuf_set_ptp(struct rte_mbuf* mbuf, uint64_t time_stamp) { + struct mt_muf_priv_data* priv = rte_mbuf_to_priv(mbuf); + priv->rx_priv.ptp_time_stamp = time_stamp; +} + +static inline uint64_t st_rx_mbuf_get_ptp(struct rte_mbuf* mbuf) { + struct mt_muf_priv_data* priv = rte_mbuf_to_priv(mbuf); + return priv->rx_priv.ptp_time_stamp; +} + #ifdef ST_PCAPNG_ENABLED struct rte_mbuf* mt_pcapng_copy(struct mtl_main_impl* impl, enum mtl_port port, struct mt_rxq_entry* rxq, const struct rte_mbuf* m, diff --git a/lib/src/st2110/pipeline/st20_pipeline_rx.c b/lib/src/st2110/pipeline/st20_pipeline_rx.c index 25446f69a..ca360de29 100644 --- a/lib/src/st2110/pipeline/st20_pipeline_rx.c +++ b/lib/src/st2110/pipeline/st20_pipeline_rx.c @@ -459,6 +459,7 @@ static int rx_st20p_create_transport(struct mtl_main_impl* impl, struct st20p_rx ops_rx.ssrc = ops->port.ssrc; ops_rx.type = ST20_TYPE_FRAME_LEVEL; ops_rx.framebuff_cnt = ops->framebuff_cnt; + ops_rx.rx_burst_size = ops->rx_burst_size; ops_rx.notify_frame_ready = rx_st20p_frame_ready; ops_rx.notify_event = rx_st20p_notify_event; if (ctx->derive) { diff --git a/lib/src/st2110/st_header.h b/lib/src/st2110/st_header.h index a0537856d..badee4300 100644 --- a/lib/src/st2110/st_header.h +++ b/lib/src/st2110/st_header.h @@ -98,12 +98,11 @@ struct st_tx_muf_priv_data { uint32_t idx; /* index of current frame */ }; -/* info passing between dma and rx */ struct st_rx_muf_priv_data { + uint64_t ptp_time_stamp; /* ptp time stamp of current mbuf */ uint32_t offset; uint32_t len; uint32_t lender; - uint32_t padding; }; /* the frame is malloc by rte malloc, not ext or head split */ @@ -549,6 +548,7 @@ struct st_rx_video_tp { /* for the status */ struct st_rv_tp_stat stat[MTL_SESSION_PORT_MAX]; + uint32_t stat_adjust; }; struct st_rx_video_session_impl { @@ -558,6 +558,7 @@ struct st_rx_video_session_impl { struct st_rx_video_sessions_mgr* parent; struct st_rx_session_priv priv[MTL_SESSION_PORT_MAX]; bool time_measure; + uint16_t rx_burst_size; struct st20_rx_ops ops; char ops_name[ST_MAX_NAME_LEN]; @@ -707,6 +708,11 @@ struct st_rx_video_session_impl { double stat_cpu_busy_score; /* for tasklet session time measure */ struct mt_stat_u64 stat_time; + /* for rx burst */ + uint64_t last_burst_time[MTL_SESSION_PORT_MAX]; + int stat_burst_succ_cnt; + uint16_t stat_burst_pkts_max; + uint64_t stat_burst_pkts_sum; }; struct st_rx_video_sessions_mgr { diff --git a/lib/src/st2110/st_rx_video_session.c b/lib/src/st2110/st_rx_video_session.c index 099068adc..804cbfe86 100644 --- a/lib/src/st2110/st_rx_video_session.c +++ b/lib/src/st2110/st_rx_video_session.c @@ -1336,7 +1336,7 @@ static int rv_start_pcapng(struct mtl_main_impl* impl, struct st_rx_video_sessio static int rv_dma_dequeue(struct st_rx_video_session_impl* s) { struct mtl_dma_lender_dev* dma_dev = s->dma_dev; - uint16_t nb_dq = mt_dma_completed(dma_dev, ST_RX_VIDEO_BURST_SIZE, NULL, NULL); + uint16_t nb_dq = mt_dma_completed(dma_dev, s->rx_burst_size, NULL, NULL); if (nb_dq) { dbg("%s(%d), nb_dq %u\n", __func__, s->idx, nb_dq); @@ -1369,10 +1369,7 @@ static inline void rv_tp_pkt_handle(struct st_rx_video_session_impl* s, struct rte_mbuf* mbuf, enum mtl_session_port s_port, struct st_rx_video_slot_impl* slot, uint32_t tmstamp, int pkt_idx) { - struct mtl_main_impl* impl = rv_get_impl(s); - enum mtl_port port = mt_port_logic2phy(s->port_maps, s_port); - - uint64_t pkt_ns = mt_mbuf_time_stamp(impl, mbuf, port); + uint64_t pkt_ns = st_rx_mbuf_get_ptp(mbuf); struct st_rv_tp_slot* tp_slot = &s->tp->slots[slot->idx][s_port]; dbg("%s(%d,%d), tmstamp %u pkt_ns %" PRIu64 " pkt_idx %d\n", __func__, s->idx, s_port, tmstamp, pkt_ns, pkt_idx); @@ -2217,7 +2214,7 @@ static int rv_init_pkt_lcore(struct mtl_main_impl* impl, snprintf(ring_name, 32, "%sM%dS%d_PKT", ST_RX_VIDEO_PREFIX, mgr_idx, idx); flags = RING_F_SP_ENQ | RING_F_SC_DEQ; /* single-producer and single-consumer */ - count = ST_RX_VIDEO_BURST_SIZE * 4; + count = s->rx_burst_size; ring = rte_ring_create(ring_name, count, mt_socket_id(impl, port), flags); if (!ring) { err("%s(%d,%d), ring create fail\n", __func__, mgr_idx, idx); @@ -2642,7 +2639,7 @@ static int rv_handle_mbuf(void* priv, struct rte_mbuf** mbuf, uint16_t nb) { } static int rv_pkt_rx_tasklet(struct st_rx_video_session_impl* s) { - struct rte_mbuf* mbuf[ST_RX_VIDEO_BURST_SIZE]; + struct rte_mbuf* mbuf[s->rx_burst_size]; uint16_t rv; int num_port = s->ops.num_port; @@ -2658,13 +2655,44 @@ static int rv_pkt_rx_tasklet(struct st_rx_video_session_impl* s) { for (int s_port = 0; s_port < num_port; s_port++) { if (!s->rxq[s_port]) continue; - rv = mt_rxq_burst(s->rxq[s_port], &mbuf[0], ST_RX_VIDEO_BURST_SIZE); + rv = mt_rxq_burst(s->rxq[s_port], &mbuf[0], s->rx_burst_size); + uint64_t burst_time = mt_get_tsc(s->impl); if (rv) { + s->stat_burst_succ_cnt++; + s->stat_burst_pkts_sum += rv; + if (rv > s->stat_burst_pkts_max) s->stat_burst_pkts_max = rv; + + struct st_rx_video_tp* tp = s->tp; + if (s->enable_timing_parser && tp) { + /* compensation for the burst time jitter */ + bool adjust = false; + uint64_t diff = burst_time - s->last_burst_time[s_port]; + enum mtl_port port = mt_port_logic2phy(s->port_maps, s_port); + + if (diff > (tp->pass.cinst_max_narrow * tp->trs)) adjust = true; + + if (adjust) { + double pkt_ns = mt_mbuf_time_stamp(s->impl, mbuf[rv - 1], port); + pkt_ns -= s->tp->trs * (rv - 1); /* set to start */ + for (uint16_t i = 0; i < rv; i++) { + st_rx_mbuf_set_ptp(mbuf[i], pkt_ns); + pkt_ns += s->tp->trs; + } + tp->stat_adjust++; + } else { + for (uint16_t i = 0; i < rv; i++) { + st_rx_mbuf_set_ptp(mbuf[i], mt_mbuf_time_stamp(s->impl, mbuf[i], port)); + } + } + } + rv_handle_mbuf(&s->priv[s_port], &mbuf[0], rv); rte_pktmbuf_free_bulk(&mbuf[0], rv); + + done = false; } - if (rv) done = false; + s->last_burst_time[s_port] = burst_time; } /* submit if any */ @@ -2967,10 +2995,21 @@ static int rv_attach(struct mtl_main_impl* impl, struct st_rx_video_sessions_mgr s->st20_dst_port[i] = (ops->udp_port[i]) ? (ops->udp_port[i]) : (10000 + idx * 2); } - /* init trs */ + /* init estimated trs */ int estimated_total_pkts = s->st20_frame_size / ST_VIDEO_BPM_SIZE; s->trs = s->frame_time / estimated_total_pkts; + if (s->trs < 2000) /* 2us per pkt */ + s->rx_burst_size = 128 * 4; + else if (s->trs < 3000) + s->rx_burst_size = 128 * 2; + else + s->rx_burst_size = 128 * 1; + if (ops->rx_burst_size) { + s->rx_burst_size = ops->rx_burst_size; + info("%s(%d), user customized rx_burst_size %u\n", __func__, idx, s->rx_burst_size); + } + /* init simulated packet loss for test usage */ if (s->ops.flags & ST20_RX_FLAG_SIMULATE_PKT_LOSS) { uint16_t burst_loss_max = 1; @@ -3081,6 +3120,7 @@ static int rv_attach(struct mtl_main_impl* impl, struct st_rx_video_sessions_mgr __func__, idx, ops->width, ops->height, st20_frame_fmt_name(ops->fmt), ops->packing, ops->payload_type, ops->flags, s->frame_time / NS_PER_MS, st_frame_rate(s->ops.fps)); + info("%s(%d), rx_burst_size %u\n", __func__, idx, s->rx_burst_size); return 0; } @@ -3366,6 +3406,20 @@ static void rv_stat(struct st_rx_video_sessions_mgr* mgr, s->stat_st22_boxes); s->stat_st22_boxes = 0; } + if (s->stat_burst_succ_cnt) { + notice("RX_VIDEO_SESSION(%d,%d): succ burst max %u, avg %f\n", m_idx, idx, + s->stat_burst_pkts_max, + (float)s->stat_burst_pkts_sum / s->stat_burst_succ_cnt); + s->stat_burst_pkts_max = 0; + s->stat_burst_succ_cnt = 0; + s->stat_burst_pkts_sum = 0; + } + + struct st_rx_video_tp* tp = s->tp; + if (tp && tp->stat_adjust) { + info("%s(%d), time adjust %u for timing parser\n", __func__, idx, tp->stat_adjust); + tp->stat_adjust = 0; + } if (s->enable_timing_parser_stat) rv_tp_stat(s); if (s->time_measure) { diff --git a/lib/src/st2110/st_rx_video_session.h b/lib/src/st2110/st_rx_video_session.h index a21b0d33f..6b109d772 100644 --- a/lib/src/st2110/st_rx_video_session.h +++ b/lib/src/st2110/st_rx_video_session.h @@ -7,8 +7,6 @@ #include "st_main.h" -#define ST_RX_VIDEO_BURST_SIZE (128) - #define ST_RX_VIDEO_DMA_MIN_SIZE (1024) #define ST_RV_TP_TSC_SYNC_MS (100) /* sync tsc with ptp period(ms) */ diff --git a/python/example/misc_util.py b/python/example/misc_util.py index 8b861b248..34a0d21df 100644 --- a/python/example/misc_util.py +++ b/python/example/misc_util.py @@ -53,6 +53,7 @@ def parse_args(is_tx): # nb_tx_desc & nb_rx_desc parser.add_argument("--nb_tx_desc", type=int, default=0, help="nb_tx_desc") parser.add_argument("--nb_rx_desc", type=int, default=0, help="nb_rx_desc") + parser.add_argument("--rx_burst_size", type=int, default=0, help="rx_burst_size") # p_tx_ip parser.add_argument( "--p_tx_ip", diff --git a/python/example/rx_timing_parser.py b/python/example/rx_timing_parser.py index af41631e1..700886445 100644 --- a/python/example/rx_timing_parser.py +++ b/python/example/rx_timing_parser.py @@ -200,6 +200,7 @@ def main(): rx_para.framebuff_cnt = 3 rx_para.transport_fmt = mtl.ST20_FMT_YUV_422_10BIT rx_para.output_fmt = args.pipeline_fmt + rx_para.rx_burst_size = args.rx_burst_size # rx port rx_port = mtl.st_rx_port() mtl.st_rxp_para_port_set( From c03c4ea96548329de9338ca79a241923f864860c Mon Sep 17 00:00:00 2001 From: Frank Du Date: Mon, 15 Jan 2024 14:43:07 +0800 Subject: [PATCH 2/4] mark burst as untrusted time Signed-off-by: Frank Du --- app/sample/rx_st20p_timing_parser_sample.c | 1 + app/sample/sample_util.c | 5 +++ app/sample/sample_util.h | 1 + lib/src/mt_main.h | 10 ----- lib/src/st2110/st_header.h | 8 ++-- lib/src/st2110/st_rx_timing_parser.c | 14 +++---- lib/src/st2110/st_rx_video_session.c | 48 ++++++++-------------- 7 files changed, 32 insertions(+), 55 deletions(-) diff --git a/app/sample/rx_st20p_timing_parser_sample.c b/app/sample/rx_st20p_timing_parser_sample.c index 98012d7d8..7c99988a0 100644 --- a/app/sample/rx_st20p_timing_parser_sample.c +++ b/app/sample/rx_st20p_timing_parser_sample.c @@ -209,6 +209,7 @@ int main(int argc, char** argv) { ops_rx.output_fmt = ctx.output_fmt; ops_rx.device = ST_PLUGIN_DEVICE_AUTO; ops_rx.framebuff_cnt = app[i]->fb_cnt; + ops_rx.rx_burst_size = ctx.rx_burst_size; ops_rx.flags = ST20P_RX_FLAG_BLOCK_GET; ops_rx.flags |= ST20P_RX_FLAG_TIMING_PARSER_META; diff --git a/app/sample/sample_util.c b/app/sample/sample_util.c index 61b68ed99..b9479c54d 100644 --- a/app/sample/sample_util.c +++ b/app/sample/sample_util.c @@ -45,6 +45,7 @@ enum sample_args_cmd { SAMPLE_ARG_RSS_MODE, SAMPLE_ARG_NB_TX_DESC, SAMPLE_ARG_NB_RX_DESC, + SAMPLE_ARG_RX_BURST_SZ, SAMPLE_ARG_DHCP, SAMPLE_ARG_TX_VIDEO_URL = 0x200, @@ -102,6 +103,7 @@ static struct option sample_args_options[] = { {"nb_tx_desc", required_argument, 0, SAMPLE_ARG_NB_TX_DESC}, {"nb_rx_desc", required_argument, 0, SAMPLE_ARG_NB_RX_DESC}, {"dhcp", no_argument, 0, SAMPLE_ARG_DHCP}, + {"rx_burst_size", required_argument, 0, SAMPLE_ARG_RX_BURST_SZ}, {"tx_url", required_argument, 0, SAMPLE_ARG_TX_VIDEO_URL}, {"rx_url", required_argument, 0, SAMPLE_ARG_RX_VIDEO_URL}, @@ -265,6 +267,9 @@ static int _sample_parse_args(struct st_sample_context* ctx, int argc, char** ar case SAMPLE_ARG_NB_RX_DESC: p->nb_rx_desc = atoi(optarg); break; + case SAMPLE_ARG_RX_BURST_SZ: + ctx->rx_burst_size = atoi(optarg); + break; case SAMPLE_ARG_QUEUES_CNT: for (int i = 0; i < MTL_PORT_MAX; i++) { p->rx_queues_cnt[i] = atoi(optarg); diff --git a/app/sample/sample_util.h b/app/sample/sample_util.h index 26649b0e6..12095e01d 100644 --- a/app/sample/sample_util.h +++ b/app/sample/sample_util.h @@ -94,6 +94,7 @@ struct st_sample_context { bool ext_frame; bool hdr_split; bool rx_dump; + uint16_t rx_burst_size; char logo_url[ST_SAMPLE_URL_MAX_LEN]; uint32_t logo_width; diff --git a/lib/src/mt_main.h b/lib/src/mt_main.h index 89bb92b57..df97b8b80 100644 --- a/lib/src/mt_main.h +++ b/lib/src/mt_main.h @@ -1839,16 +1839,6 @@ static inline uint32_t st_rx_mbuf_get_len(struct rte_mbuf* mbuf) { return priv->rx_priv.len; } -static inline void st_rx_mbuf_set_ptp(struct rte_mbuf* mbuf, uint64_t time_stamp) { - struct mt_muf_priv_data* priv = rte_mbuf_to_priv(mbuf); - priv->rx_priv.ptp_time_stamp = time_stamp; -} - -static inline uint64_t st_rx_mbuf_get_ptp(struct rte_mbuf* mbuf) { - struct mt_muf_priv_data* priv = rte_mbuf_to_priv(mbuf); - return priv->rx_priv.ptp_time_stamp; -} - #ifdef ST_PCAPNG_ENABLED struct rte_mbuf* mt_pcapng_copy(struct mtl_main_impl* impl, enum mtl_port port, struct mt_rxq_entry* rxq, const struct rte_mbuf* m, diff --git a/lib/src/st2110/st_header.h b/lib/src/st2110/st_header.h index badee4300..09c089323 100644 --- a/lib/src/st2110/st_header.h +++ b/lib/src/st2110/st_header.h @@ -99,10 +99,10 @@ struct st_tx_muf_priv_data { }; struct st_rx_muf_priv_data { - uint64_t ptp_time_stamp; /* ptp time stamp of current mbuf */ uint32_t offset; uint32_t len; uint32_t lender; + uint32_t padding; }; /* the frame is malloc by rte malloc, not ext or head split */ @@ -509,8 +509,6 @@ struct st_rv_tp_slot { /* Cinst, packet level check */ int64_t cinst_sum; /* vrx, packet level check */ - int32_t vrx_drained_prev; - int32_t vrx_prev; int64_t vrx_sum; /* Inter-packet time(ns), packet level check */ int64_t ipt_sum; @@ -548,7 +546,7 @@ struct st_rx_video_tp { /* for the status */ struct st_rv_tp_stat stat[MTL_SESSION_PORT_MAX]; - uint32_t stat_adjust; + uint32_t stat_untrusted_pkts; }; struct st_rx_video_session_impl { @@ -559,6 +557,7 @@ struct st_rx_video_session_impl { struct st_rx_session_priv priv[MTL_SESSION_PORT_MAX]; bool time_measure; uint16_t rx_burst_size; + uint16_t cur_succ_burst_cnt; struct st20_rx_ops ops; char ops_name[ST_MAX_NAME_LEN]; @@ -709,7 +708,6 @@ struct st_rx_video_session_impl { /* for tasklet session time measure */ struct mt_stat_u64 stat_time; /* for rx burst */ - uint64_t last_burst_time[MTL_SESSION_PORT_MAX]; int stat_burst_succ_cnt; uint16_t stat_burst_pkts_max; uint64_t stat_burst_pkts_sum; diff --git a/lib/src/st2110/st_rx_timing_parser.c b/lib/src/st2110/st_rx_timing_parser.c index f99c140a6..30e8b0fb0 100644 --- a/lib/src/st2110/st_rx_timing_parser.c +++ b/lib/src/st2110/st_rx_timing_parser.c @@ -15,7 +15,7 @@ void rv_tp_on_packet(struct st_rx_video_session_impl* s, enum mtl_session_port s int pkt_idx) { struct st_rx_video_tp* tp = s->tp; uint64_t epoch_tmstamp; - double tvd, packet_delta_ns, trs = tp->trs; + double tvd, trs = tp->trs; if (!slot->cur_epochs) { /* the first packet */ uint64_t epochs = (double)pkt_time / s->frame_time; @@ -23,8 +23,9 @@ void rv_tp_on_packet(struct st_rx_video_session_impl* s, enum mtl_session_port s slot->cur_epochs = epochs; slot->rtp_tmstamp = rtp_tmstamp; - slot->first_pkt_time = pkt_time; - slot->meta.fpt = pkt_time - epoch_tmstamp; + double first_pkt_time = (double)pkt_time - (trs * pkt_idx); + slot->first_pkt_time = first_pkt_time; + slot->meta.fpt = first_pkt_time - epoch_tmstamp; uint64_t tmstamp64 = epochs * s->frame_time_sampling; uint32_t tmstamp32 = tmstamp64; @@ -40,16 +41,13 @@ void rv_tp_on_packet(struct st_rx_video_session_impl* s, enum mtl_session_port s epoch_tmstamp = (uint64_t)(slot->cur_epochs * s->frame_time); tvd = epoch_tmstamp + tp->pass.tr_offset; + double expect_time = tvd + trs * (pkt_idx + 1); /* Calculate vrx */ - packet_delta_ns = (double)pkt_time - tvd; - int32_t drained = (packet_delta_ns + trs) / trs; - int32_t vrx_cur = slot->vrx_prev + 1 - (drained - slot->vrx_drained_prev); + int32_t vrx_cur = (expect_time - pkt_time) / trs; slot->vrx_sum += vrx_cur; slot->meta.vrx_min = RTE_MIN(vrx_cur, slot->meta.vrx_min); slot->meta.vrx_max = RTE_MAX(vrx_cur, slot->meta.vrx_max); - slot->vrx_prev = vrx_cur; - slot->vrx_drained_prev = drained; /* Calculate C-inst */ int exp_cin_pkts = ((pkt_time - slot->first_pkt_time) / trs) * ST_TP_CINST_DRAIN_FACTOR; diff --git a/lib/src/st2110/st_rx_video_session.c b/lib/src/st2110/st_rx_video_session.c index 804cbfe86..8987fc3f5 100644 --- a/lib/src/st2110/st_rx_video_session.c +++ b/lib/src/st2110/st_rx_video_session.c @@ -1369,8 +1369,17 @@ static inline void rv_tp_pkt_handle(struct st_rx_video_session_impl* s, struct rte_mbuf* mbuf, enum mtl_session_port s_port, struct st_rx_video_slot_impl* slot, uint32_t tmstamp, int pkt_idx) { - uint64_t pkt_ns = st_rx_mbuf_get_ptp(mbuf); - struct st_rv_tp_slot* tp_slot = &s->tp->slots[slot->idx][s_port]; + struct st_rx_video_tp* tp = s->tp; + if (s->cur_succ_burst_cnt > (tp->pass.cinst_max_narrow / 2)) { + /* untrusted result */ + tp->stat_untrusted_pkts++; + return; + } + struct mtl_main_impl* impl = rv_get_impl(s); + enum mtl_port port = mt_port_logic2phy(s->port_maps, s_port); + + uint64_t pkt_ns = mt_mbuf_time_stamp(impl, mbuf, port); + struct st_rv_tp_slot* tp_slot = &tp->slots[slot->idx][s_port]; dbg("%s(%d,%d), tmstamp %u pkt_ns %" PRIu64 " pkt_idx %d\n", __func__, s->idx, s_port, tmstamp, pkt_ns, pkt_idx); rv_tp_on_packet(s, s_port, tp_slot, tmstamp, pkt_ns, pkt_idx); @@ -2656,43 +2665,17 @@ static int rv_pkt_rx_tasklet(struct st_rx_video_session_impl* s) { if (!s->rxq[s_port]) continue; rv = mt_rxq_burst(s->rxq[s_port], &mbuf[0], s->rx_burst_size); - uint64_t burst_time = mt_get_tsc(s->impl); + s->cur_succ_burst_cnt = rv; if (rv) { s->stat_burst_succ_cnt++; s->stat_burst_pkts_sum += rv; if (rv > s->stat_burst_pkts_max) s->stat_burst_pkts_max = rv; - struct st_rx_video_tp* tp = s->tp; - if (s->enable_timing_parser && tp) { - /* compensation for the burst time jitter */ - bool adjust = false; - uint64_t diff = burst_time - s->last_burst_time[s_port]; - enum mtl_port port = mt_port_logic2phy(s->port_maps, s_port); - - if (diff > (tp->pass.cinst_max_narrow * tp->trs)) adjust = true; - - if (adjust) { - double pkt_ns = mt_mbuf_time_stamp(s->impl, mbuf[rv - 1], port); - pkt_ns -= s->tp->trs * (rv - 1); /* set to start */ - for (uint16_t i = 0; i < rv; i++) { - st_rx_mbuf_set_ptp(mbuf[i], pkt_ns); - pkt_ns += s->tp->trs; - } - tp->stat_adjust++; - } else { - for (uint16_t i = 0; i < rv; i++) { - st_rx_mbuf_set_ptp(mbuf[i], mt_mbuf_time_stamp(s->impl, mbuf[i], port)); - } - } - } - rv_handle_mbuf(&s->priv[s_port], &mbuf[0], rv); rte_pktmbuf_free_bulk(&mbuf[0], rv); done = false; } - - s->last_burst_time[s_port] = burst_time; } /* submit if any */ @@ -3416,9 +3399,10 @@ static void rv_stat(struct st_rx_video_sessions_mgr* mgr, } struct st_rx_video_tp* tp = s->tp; - if (tp && tp->stat_adjust) { - info("%s(%d), time adjust %u for timing parser\n", __func__, idx, tp->stat_adjust); - tp->stat_adjust = 0; + if (tp && tp->stat_untrusted_pkts) { + info("%s(%d), untrusted pkts time %u for timing parser\n", __func__, idx, + tp->stat_untrusted_pkts); + tp->stat_untrusted_pkts = 0; } if (s->enable_timing_parser_stat) rv_tp_stat(s); From 2eba5641eb5ea4bfa39b18c82012b7561acbba0f Mon Sep 17 00:00:00 2001 From: Frank Du Date: Mon, 15 Jan 2024 14:57:40 +0800 Subject: [PATCH 3/4] fix Signed-off-by: Frank Du --- lib/src/st2110/st_rx_video_session.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/src/st2110/st_rx_video_session.c b/lib/src/st2110/st_rx_video_session.c index 8987fc3f5..310de6519 100644 --- a/lib/src/st2110/st_rx_video_session.c +++ b/lib/src/st2110/st_rx_video_session.c @@ -2982,15 +2982,11 @@ static int rv_attach(struct mtl_main_impl* impl, struct st_rx_video_sessions_mgr int estimated_total_pkts = s->st20_frame_size / ST_VIDEO_BPM_SIZE; s->trs = s->frame_time / estimated_total_pkts; - if (s->trs < 2000) /* 2us per pkt */ - s->rx_burst_size = 128 * 4; - else if (s->trs < 3000) - s->rx_burst_size = 128 * 2; - else - s->rx_burst_size = 128 * 1; if (ops->rx_burst_size) { s->rx_burst_size = ops->rx_burst_size; info("%s(%d), user customized rx_burst_size %u\n", __func__, idx, s->rx_burst_size); + } else { + s->rx_burst_size = 128; } /* init simulated packet loss for test usage */ @@ -3103,7 +3099,6 @@ static int rv_attach(struct mtl_main_impl* impl, struct st_rx_video_sessions_mgr __func__, idx, ops->width, ops->height, st20_frame_fmt_name(ops->fmt), ops->packing, ops->payload_type, ops->flags, s->frame_time / NS_PER_MS, st_frame_rate(s->ops.fps)); - info("%s(%d), rx_burst_size %u\n", __func__, idx, s->rx_burst_size); return 0; } From 63853c80cf60a323aae057c2961e1b8c4fda8810 Mon Sep 17 00:00:00 2001 From: Frank Du Date: Mon, 15 Jan 2024 15:53:06 +0800 Subject: [PATCH 4/4] add Signed-off-by: Frank Du --- app/src/app_base.h | 1 + app/src/args.c | 5 +++++ app/src/rx_st20p_app.c | 1 + app/src/rx_video_app.c | 1 + 4 files changed, 8 insertions(+) diff --git a/app/src/app_base.h b/app/src/app_base.h index 024c47084..7bd65d046 100644 --- a/app/src/app_base.h +++ b/app/src/app_base.h @@ -504,6 +504,7 @@ struct st_app_context { bool enable_timing_parser; bool tx_display; bool rx_display; + uint16_t rx_burst_size; bool ptp_systime_sync; int ptp_sync_cnt; diff --git a/app/src/args.c b/app/src/args.c index da24ab148..28b67056f 100644 --- a/app/src/args.c +++ b/app/src/args.c @@ -65,6 +65,7 @@ enum st_args_cmd { ST_ARG_PTP_UNICAST_ADDR, ST_ARG_CNI_THREAD, ST_ARG_RX_TIMING_PARSER, + ST_ARG_RX_BURST_SZ, ST_ARG_USER_LCORES, ST_ARG_SCH_DATA_QUOTA, ST_ARG_SCH_SESSION_QUOTA, @@ -189,6 +190,7 @@ static struct option st_app_args_options[] = { {"ptp_unicast", no_argument, 0, ST_ARG_PTP_UNICAST_ADDR}, {"cni_thread", no_argument, 0, ST_ARG_CNI_THREAD}, {"rx_timing_parser", no_argument, 0, ST_ARG_RX_TIMING_PARSER}, + {"rx_burst_size", required_argument, 0, ST_ARG_RX_BURST_SZ}, {"lcores", required_argument, 0, ST_ARG_USER_LCORES}, {"sch_data_quota", required_argument, 0, ST_ARG_SCH_DATA_QUOTA}, {"sch_session_quota", required_argument, 0, ST_ARG_SCH_SESSION_QUOTA}, @@ -574,6 +576,9 @@ int st_app_parse_args(struct st_app_context* ctx, struct mtl_init_params* p, int ctx->enable_timing_parser = true; p->flags |= MTL_FLAG_ENABLE_HW_TIMESTAMP; break; + case ST_ARG_RX_BURST_SZ: + ctx->rx_burst_size = atoi(optarg); + break; case ST_ARG_RX_MONO_POOL: p->flags |= MTL_FLAG_RX_MONO_POOL; break; diff --git a/app/src/rx_st20p_app.c b/app/src/rx_st20p_app.c index 5f2f438a0..87236ae82 100644 --- a/app/src/rx_st20p_app.c +++ b/app/src/rx_st20p_app.c @@ -218,6 +218,7 @@ static int app_rx_st20p_init(struct st_app_context* ctx, ops.port.payload_type = st20p ? st20p->base.payload_type : ST_APP_PAYLOAD_TYPE_VIDEO; ops.device = st20p ? st20p->info.device : ST_PLUGIN_DEVICE_AUTO; ops.flags |= ST20P_RX_FLAG_BLOCK_GET; + ops.rx_burst_size = ctx->rx_burst_size; ops.framebuff_cnt = s->framebuff_cnt; /* always try to enable DMA offload */ ops.flags |= ST20P_RX_FLAG_DMA_OFFLOAD; diff --git a/app/src/rx_video_app.c b/app/src/rx_video_app.c index d63c00ea4..87d930242 100644 --- a/app/src/rx_video_app.c +++ b/app/src/rx_video_app.c @@ -563,6 +563,7 @@ static int app_rx_video_init(struct st_app_context* ctx, st_json_video_session_t ops.rtcp.nack_interval_us = 250; } if (ctx->enable_timing_parser) ops.flags |= ST20_RX_FLAG_TIMING_PARSER_STAT; + ops.rx_burst_size = ctx->rx_burst_size; st_pthread_mutex_init(&s->st20_wake_mutex, NULL); st_pthread_cond_init(&s->st20_wake_cond, NULL);