Skip to content

Commit 593c1b3

Browse files
committed
Add: handling case where RL is lower then expected
Signed-off-by: Kasiewicz, Marek <marek.kasiewicz@intel.com>
1 parent b9e266d commit 593c1b3

File tree

5 files changed

+47
-36
lines changed

5 files changed

+47
-36
lines changed

lib/src/mt_main.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -616,13 +616,9 @@ struct mt_sch_mgr {
616616
enum mt_lcore_type local_lcores_type[RTE_MAX_LCORE];
617617
};
618618

619-
struct mt_audio_pacing_train_result {
620-
uint64_t input_bps; /* input, byte per sec */
621-
uint64_t profiled_bps; /* profiled result */
622-
};
623-
624619
struct mt_pacing_train_result {
625-
uint64_t rl_bps; /* input, byte per sec */
620+
uint64_t input_bps; /* input, byte per sec */
621+
uint64_t profiled_bps; /* profiled result */
626622
float pacing_pad_interval; /* result */
627623
};
628624

@@ -740,8 +736,6 @@ struct mt_interface {
740736
bool tx_rl_root_active;
741737
/* video rl pacing train result */
742738
struct mt_pacing_train_result pt_results[MT_MAX_RL_ITEMS];
743-
/* audio rl pacing train result */
744-
struct mt_audio_pacing_train_result audio_pt_results[MT_MAX_RL_ITEMS];
745739

746740
/* function ops per interface(pf/vf) */
747741
uint64_t (*ptp_get_time_fn)(struct mtl_main_impl* impl, enum mtl_port port);

lib/src/mt_util.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,13 @@ int mt_build_port_map(struct mtl_main_impl* impl, char** ports, enum mtl_port* m
251251
return 0;
252252
}
253253

254-
int mt_pacing_train_result_add(struct mtl_main_impl* impl, enum mtl_port port,
255-
uint64_t rl_bps, float pad_interval) {
254+
int mt_pacing_train_pad_result_add(struct mtl_main_impl* impl, enum mtl_port port,
255+
uint64_t input_bps, float pad_interval) {
256256
struct mt_pacing_train_result* ptr = &mt_if(impl, port)->pt_results[0];
257257

258258
for (int i = 0; i < MT_MAX_RL_ITEMS; i++) {
259-
if (ptr[i].rl_bps) continue;
260-
ptr[i].rl_bps = rl_bps;
259+
if (ptr[i].input_bps) continue;
260+
ptr[i].input_bps = input_bps;
261261
ptr[i].pacing_pad_interval = pad_interval;
262262
return 0;
263263
}
@@ -266,12 +266,12 @@ int mt_pacing_train_result_add(struct mtl_main_impl* impl, enum mtl_port port,
266266
return -ENOMEM;
267267
}
268268

269-
int mt_pacing_train_result_search(struct mtl_main_impl* impl, enum mtl_port port,
269+
int mt_pacing_train_pad_result_search(struct mtl_main_impl* impl, enum mtl_port port,
270270
uint64_t rl_bps, float* pad_interval) {
271271
struct mt_pacing_train_result* ptr = &mt_if(impl, port)->pt_results[0];
272272

273273
for (int i = 0; i < MT_MAX_RL_ITEMS; i++) {
274-
if (rl_bps == ptr[i].rl_bps) {
274+
if (rl_bps == ptr[i].input_bps && ptr[i].pacing_pad_interval) {
275275
*pad_interval = ptr[i].pacing_pad_interval;
276276
return 0;
277277
}
@@ -281,9 +281,9 @@ int mt_pacing_train_result_search(struct mtl_main_impl* impl, enum mtl_port port
281281
return -EINVAL;
282282
}
283283

284-
int mt_audio_pacing_train_result_add(struct mtl_main_impl* impl, enum mtl_port port,
284+
int mt_pacing_train_bps_result_add(struct mtl_main_impl* impl, enum mtl_port port,
285285
uint64_t input_bps, uint64_t profiled_bps) {
286-
struct mt_audio_pacing_train_result* ptr = &mt_if(impl, port)->audio_pt_results[0];
286+
struct mt_pacing_train_result* ptr = &mt_if(impl, port)->pt_results[0];
287287

288288
for (int i = 0; i < MT_MAX_RL_ITEMS; i++) {
289289
if (ptr[i].input_bps) continue;
@@ -296,12 +296,12 @@ int mt_audio_pacing_train_result_add(struct mtl_main_impl* impl, enum mtl_port p
296296
return -ENOMEM;
297297
}
298298

299-
int mt_audio_pacing_train_result_search(struct mtl_main_impl* impl, enum mtl_port port,
299+
int mt_pacing_train_bps_result_search(struct mtl_main_impl* impl, enum mtl_port port,
300300
uint64_t input_bps, uint64_t* profiled_bps) {
301-
struct mt_audio_pacing_train_result* ptr = &mt_if(impl, port)->audio_pt_results[0];
301+
struct mt_pacing_train_result* ptr = &mt_if(impl, port)->pt_results[0];
302302

303303
for (int i = 0; i < MT_MAX_RL_ITEMS; i++) {
304-
if (input_bps == ptr[i].input_bps) {
304+
if (input_bps == ptr[i].input_bps && ptr[i].profiled_bps) {
305305
*profiled_bps = ptr[i].profiled_bps;
306306
return 0;
307307
}

lib/src/mt_util.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,15 @@ int mt_ring_dequeue_clean(struct rte_ring* ring);
5656

5757
void mt_mbuf_sanity_check(struct rte_mbuf** mbufs, uint16_t nb, char* tag);
5858

59-
int mt_pacing_train_result_add(struct mtl_main_impl* impl, enum mtl_port port,
60-
uint64_t rl_bps, float pad_interval);
61-
int mt_pacing_train_result_search(struct mtl_main_impl* impl, enum mtl_port port,
62-
uint64_t rl_bps, float* pad_interval);
63-
64-
int mt_audio_pacing_train_result_add(struct mtl_main_impl* impl, enum mtl_port port,
65-
uint64_t input_bps, uint64_t profiled_bps);
66-
int mt_audio_pacing_train_result_search(struct mtl_main_impl* impl, enum mtl_port port,
67-
uint64_t input_bps, uint64_t* profiled_bps);
59+
int mt_pacing_train_pad_result_add(struct mtl_main_impl* impl, enum mtl_port port,
60+
uint64_t input_bps, float pad_interval);
61+
int mt_pacing_train_pad_result_search(struct mtl_main_impl* impl, enum mtl_port port,
62+
uint64_t input_bps, float* pad_interval);
63+
64+
int mt_pacing_train_bps_result_add(struct mtl_main_impl* impl, enum mtl_port port,
65+
uint64_t input_bps, uint64_t profiled_bps);
66+
int mt_pacing_train_bps_result_search(struct mtl_main_impl* impl, enum mtl_port port,
67+
uint64_t input_bps, uint64_t* profiled_bps);
6868

6969
enum mtl_port mt_port_by_name(struct mtl_main_impl* impl, const char* name);
7070
int mt_build_port_map(struct mtl_main_impl* impl, char** ports, enum mtl_port* maps,

lib/src/st2110/st_tx_audio_session.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,7 +1247,7 @@ static int tx_audio_session_init_rl(struct mtl_main_impl* impl,
12471247
port = mt_port_logic2phy(s->port_maps, i);
12481248

12491249
uint64_t initial_bytes_per_sec = tx_audio_session_initial_rl_bps(s);
1250-
int profiled = mt_audio_pacing_train_result_search(impl, port, initial_bytes_per_sec,
1250+
int profiled = mt_pacing_train_bps_result_search(impl, port, initial_bytes_per_sec,
12511251
&profiled_per_sec);
12521252

12531253
/* pad pkt */
@@ -1287,7 +1287,7 @@ static int tx_audio_session_init_rl(struct mtl_main_impl* impl,
12871287
return -EIO;
12881288
}
12891289

1290-
mt_audio_pacing_train_result_add(impl, port, initial_bytes_per_sec, trained);
1290+
mt_pacing_train_bps_result_add(impl, port, initial_bytes_per_sec, trained);
12911291
info("%s(%d), trained bytes_per_sec %" PRIu64 "\n", __func__, idx, trained);
12921292
int ret = mt_txq_set_tx_bps(rl_port->queue[j], trained);
12931293
if (ret < 0) {

lib/src/st2110/st_tx_video_session.c

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ static int tv_train_pacing(struct mtl_main_impl* impl, struct st_tx_video_sessio
322322
float pad_interval;
323323
uint64_t rl_bps = tv_rl_bps(s);
324324
uint64_t train_start_time, train_end_time;
325+
double measured_bps;
326+
uint64_t bps_to_set;
325327

326328
uint16_t resolved = s->ops.pad_interval;
327329
if (resolved) {
@@ -338,7 +340,7 @@ static int tv_train_pacing(struct mtl_main_impl* impl, struct st_tx_video_sessio
338340
}
339341
}
340342

341-
ret = mt_pacing_train_result_search(impl, port, rl_bps, &pad_interval);
343+
ret = mt_pacing_train_pad_result_search(impl, port, rl_bps, &pad_interval);
342344
if (ret >= 0) {
343345
s->pacing.pad_interval = pad_interval;
344346
info("%s(%d), use pre-train pad_interval %f\n", __func__, idx, pad_interval);
@@ -423,10 +425,23 @@ static int tv_train_pacing(struct mtl_main_impl* impl, struct st_tx_video_sessio
423425
reactive = (s->ops.height == 480) ? 487.0 / 525.0 : 576.0 / 625.0;
424426
}
425427
pkts_per_frame = pkts_per_frame * reactive;
426-
if (pkts_per_frame < s->st20_total_pkts) {
427-
err("%s(%d), error pkts_per_frame %f, st20_total_pkts %d\n", __func__, idx,
428-
pkts_per_frame, s->st20_total_pkts);
429-
return -EINVAL;
428+
measured_bps = s->st20_pkt_size * pkts_per_sec * reactive;
429+
430+
if (measured_bps < rl_bps) {
431+
/* The measured speed is lower then expected. Set higher bps and retrain to add padding */
432+
info("%s(%d), measured bps %ld, set bps %ld, increasing rl bps\n", __func__, idx,
433+
(uint64_t)measured_bps, rl_bps);
434+
435+
if (!mt_pacing_train_bps_result_search(impl, port, rl_bps, &bps_to_set)) {
436+
err("%s(%d), measured speed is too low on already trained bps\n", __func__, idx);
437+
return -EINVAL;
438+
}
439+
440+
bps_to_set = rl_bps / measured_bps * rl_bps;
441+
mt_pacing_train_bps_result_add(impl, port, rl_bps, bps_to_set);
442+
mt_txq_set_tx_bps(queue, bps_to_set);
443+
ret = tv_train_pacing(impl, s, s_port);
444+
return ret;
430445
}
431446

432447
pad_interval = (float)s->st20_total_pkts / (pkts_per_frame - s->st20_total_pkts);
@@ -437,7 +452,7 @@ static int tv_train_pacing(struct mtl_main_impl* impl, struct st_tx_video_sessio
437452
}
438453

439454
s->pacing.pad_interval = pad_interval;
440-
mt_pacing_train_result_add(impl, port, rl_bps, pad_interval);
455+
mt_pacing_train_pad_result_add(impl, port, rl_bps, pad_interval);
441456
train_end_time = mt_get_tsc(impl);
442457
info("%s(%d,%d), trained pad_interval %f pkts_per_frame %f with time %fs\n", __func__,
443458
idx, s_port, pad_interval, pkts_per_frame,
@@ -2526,6 +2541,7 @@ static int tv_init_hw(struct mtl_main_impl* impl, struct st_tx_video_sessions_mg
25262541
struct mt_txq_flow flow;
25272542
memset(&flow, 0, sizeof(flow));
25282543
flow.bytes_per_sec = tv_rl_bps(s);
2544+
mt_pacing_train_bps_result_search(impl, i, flow.bytes_per_sec, &flow.bytes_per_sec);
25292545
mtl_memcpy(&flow.dip_addr, &s->ops.dip_addr[i], MTL_IP_ADDR_LEN);
25302546
flow.dst_port = s->ops.udp_port[i];
25312547
if (ST21_TX_PACING_WAY_TSN == s->pacing_way[i])
@@ -3858,6 +3874,7 @@ int st20_tx_queue_fatal_error(struct mtl_main_impl* impl,
38583874
struct mt_txq_flow flow;
38593875
memset(&flow, 0, sizeof(flow));
38603876
flow.bytes_per_sec = tv_rl_bps(s);
3877+
mt_pacing_train_bps_result_search(impl, s_port, flow.bytes_per_sec, &flow.bytes_per_sec);
38613878
mtl_memcpy(&flow.dip_addr, &s->ops.dip_addr[s_port], MTL_IP_ADDR_LEN);
38623879
flow.dst_port = s->ops.udp_port[s_port];
38633880
s->queue[s_port] = mt_txq_get(impl, port, &flow);

0 commit comments

Comments
 (0)