2121 */
2222
2323#include " worker_manager.h"
24+ #include " apps/helpers/metrics/metrics_helpers.h"
2425#include " srsran/adt/byte_buffer.h"
2526#include " srsran/du/du_high/du_high_executor_mapper.h"
27+ #include " srsran/srslog/srslog.h"
28+ #include " srsran/support/executors/concurrent_metrics_executor.h"
2629#include " srsran/support/executors/inline_task_executor.h"
2730
2831using namespace srsran ;
@@ -269,7 +272,8 @@ void worker_manager::create_cu_up_executors(const worker_manager_config::cu_up_c
269272 *exec_map.at (" low_prio_exec" ),
270273 config.dedicated_io_ul_strand ,
271274 &timers,
272- config.executor_tracing_enable });
275+ config.executor_tracing_enable ,
276+ config.metrics_period });
273277}
274278
275279void worker_manager::create_du_executors (const worker_manager_config::du_high_config& du_hi,
@@ -336,7 +340,7 @@ execution_config_helper::worker_pool worker_manager::create_low_prio_workers(uns
336340 // Left empty, is filled later.
337341 {},
338342 std::chrono::microseconds{100 },
339- os_thread_realtime_priority::no_realtime (),
343+ os_thread_realtime_priority::min (),
340344 std::vector<os_sched_affinity_bitmask>{low_prio_mask}};
341345
342346 return non_rt_pool;
@@ -480,10 +484,6 @@ worker_manager::create_du_crit_path_prio_executors(unsigned
480484 report_fatal_error (" Failed to instantiate {} execution context" , ul_worker_pool.name );
481485 }
482486
483- upper_pucch_exec.push_back (exec_mng.executors ().at (l1_pucch_exec_name));
484- upper_pusch_exec.push_back (exec_mng.executors ().at (l1_pusch_exec_name));
485- upper_srs_exec.push_back (exec_mng.executors ().at (l1_srs_exec_name));
486-
487487 // Instantiate dedicated worker pool for high priority tasks such as L2, the upper physical layer downlink
488488 // processing, and the PRACH detector. This worker pool comprises four different priority queues where the L2 and
489489 // the PRACH detector queues have the highest priority.
@@ -504,9 +504,58 @@ worker_manager::create_du_crit_path_prio_executors(unsigned
504504 report_fatal_error (" Failed to instantiate {} execution context" , dl_worker_pool.name );
505505 }
506506
507- du_low_dl_executors.push_back (exec_mng.executors ().at (l1_dl_exec_name));
508- upper_prach_exec.push_back (exec_mng.executors ().at (l1_prach_exec_name));
509- upper_pdsch_exec.push_back (exec_mng.executors ().at (l1_pdsch_exec_name));
507+ // TODO: move this to a dedicated worker mapper.
508+ task_executor* cell_upper_dl_exec = exec_mng.executors ().at (l1_dl_exec_name);
509+ task_executor* cell_upper_pucch_exec = exec_mng.executors ().at (l1_pucch_exec_name);
510+ task_executor* cell_upper_pusch_exec = exec_mng.executors ().at (l1_pusch_exec_name);
511+ task_executor* cell_upper_srs_exec = exec_mng.executors ().at (l1_srs_exec_name);
512+ task_executor* cell_upper_prach_exec = exec_mng.executors ().at (l1_prach_exec_name);
513+ task_executor* cell_upper_pdsch_exec = exec_mng.executors ().at (l1_pdsch_exec_name);
514+
515+ // Wrap executors with metrics.
516+ if (du_low.value ().metrics_period .has_value ()) {
517+ srslog::log_channel& metrics_logger = app_helpers::fetch_logger_metrics_log_channel ();
518+
519+ std::chrono::milliseconds metrics_period = du_low.value ().metrics_period .value ();
520+ std::unique_ptr<task_executor> executor;
521+
522+ executor = make_concurrent_metrics_executor_ptr (
523+ l1_dl_exec_name, *cell_upper_dl_exec, *metrics_exec, metrics_logger, metrics_period);
524+ cell_upper_dl_exec = executor.get ();
525+ executor_decorators_exec.emplace_back (std::move (executor));
526+
527+ executor = make_concurrent_metrics_executor_ptr (
528+ l1_pucch_exec_name, *cell_upper_pucch_exec, *metrics_exec, metrics_logger, metrics_period);
529+ cell_upper_pucch_exec = executor.get ();
530+ executor_decorators_exec.emplace_back (std::move (executor));
531+
532+ executor = make_concurrent_metrics_executor_ptr (
533+ l1_pusch_exec_name, *cell_upper_pusch_exec, *metrics_exec, metrics_logger, metrics_period);
534+ cell_upper_pusch_exec = executor.get ();
535+ executor_decorators_exec.emplace_back (std::move (executor));
536+
537+ executor = make_concurrent_metrics_executor_ptr (
538+ l1_srs_exec_name, *cell_upper_srs_exec, *metrics_exec, metrics_logger, metrics_period);
539+ cell_upper_srs_exec = executor.get ();
540+ executor_decorators_exec.emplace_back (std::move (executor));
541+
542+ executor = make_concurrent_metrics_executor_ptr (
543+ l1_prach_exec_name, *cell_upper_prach_exec, *metrics_exec, metrics_logger, metrics_period);
544+ cell_upper_prach_exec = executor.get ();
545+ executor_decorators_exec.emplace_back (std::move (executor));
546+
547+ executor = make_concurrent_metrics_executor_ptr (
548+ l1_pdsch_exec_name, *cell_upper_pdsch_exec, *metrics_exec, metrics_logger, metrics_period);
549+ cell_upper_pdsch_exec = executor.get ();
550+ executor_decorators_exec.emplace_back (std::move (executor));
551+ }
552+
553+ du_low_dl_executors.push_back (cell_upper_dl_exec);
554+ upper_pucch_exec.push_back (cell_upper_pucch_exec);
555+ upper_pusch_exec.push_back (cell_upper_pusch_exec);
556+ upper_srs_exec.push_back (cell_upper_srs_exec);
557+ upper_prach_exec.push_back (cell_upper_prach_exec);
558+ upper_pdsch_exec.push_back (cell_upper_pdsch_exec);
510559 l2_execs.push_back (exec_mng.executors ().at (l2_exec_name));
511560 }
512561
@@ -554,7 +603,21 @@ worker_manager::create_du_crit_path_prio_executors(unsigned
554603 report_fatal_error (" Failed to instantiate {} execution context" , pusch_decoder_worker_pool.name );
555604 }
556605
557- upper_pusch_decoder_exec.push_back (exec_mng.executors ().at (pusch_decoder_exec_name));
606+ task_executor* cell_upper_pusch_decoder_exec = exec_mng.executors ().at (pusch_decoder_exec_name);
607+ if (du_low.value ().metrics_period .has_value ()) {
608+ srslog::log_channel& metrics_logger = app_helpers::fetch_logger_metrics_log_channel ();
609+
610+ std::unique_ptr<task_executor> concurrent_metrics_executor =
611+ make_concurrent_metrics_executor_ptr (pusch_decoder_exec_name,
612+ *cell_upper_pusch_decoder_exec,
613+ *metrics_exec,
614+ metrics_logger,
615+ du_low.value ().metrics_period .value ());
616+ cell_upper_pusch_decoder_exec = concurrent_metrics_executor.get ();
617+ executor_decorators_exec.emplace_back (std::move (concurrent_metrics_executor));
618+ }
619+
620+ upper_pusch_decoder_exec.push_back (cell_upper_pusch_decoder_exec);
558621 }
559622
560623 return desc;
0 commit comments