From 9058ee9a5bd758962ab7a67b641d87f1fd7d3453 Mon Sep 17 00:00:00 2001 From: faluco Date: Tue, 5 Oct 2021 14:19:49 +0200 Subject: [PATCH] Move gNB metrics processing to the stack thread avoiding concurrency issues in MAC and RRC. --- srsenb/hdr/stack/gnb_stack_nr.h | 5 ++++- srsenb/src/stack/gnb_stack_nr.cc | 33 ++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/srsenb/hdr/stack/gnb_stack_nr.h b/srsenb/hdr/stack/gnb_stack_nr.h index cb0af14e9..0a48d1201 100644 --- a/srsenb/hdr/stack/gnb_stack_nr.h +++ b/srsenb/hdr/stack/gnb_stack_nr.h @@ -120,7 +120,10 @@ private: // task scheduling static const int STACK_MAIN_THREAD_PRIO = 4; srsran::task_scheduler task_sched; - srsran::task_multiqueue::queue_handle sync_task_queue, ue_task_queue, gtpu_task_queue, mac_task_queue; + srsran::task_multiqueue::queue_handle sync_task_queue, ue_task_queue, gtpu_task_queue, mac_task_queue, + metrics_task_queue; + + srsran::dyn_blocking_queue pending_stack_metrics; // derived srsenb::mac_nr mac; diff --git a/srsenb/src/stack/gnb_stack_nr.cc b/srsenb/src/stack/gnb_stack_nr.cc index ed973f3ba..62016bd32 100644 --- a/srsenb/src/stack/gnb_stack_nr.cc +++ b/srsenb/src/stack/gnb_stack_nr.cc @@ -25,15 +25,17 @@ gnb_stack_nr::gnb_stack_nr(srslog::sink& log_sink) : pdcp_logger(srslog::fetch_basic_logger("PDCP-NR", log_sink, false)), rrc_logger(srslog::fetch_basic_logger("RRC-NR", log_sink, false)), stack_logger(srslog::fetch_basic_logger("STCK-NR", log_sink, false)), + pending_stack_metrics(64), mac(&task_sched), rrc(&task_sched), pdcp(&task_sched, pdcp_logger), rlc(rlc_logger) { - ue_task_queue = task_sched.make_task_queue(); - sync_task_queue = task_sched.make_task_queue(); - gtpu_task_queue = task_sched.make_task_queue(); - mac_task_queue = task_sched.make_task_queue(); + ue_task_queue = task_sched.make_task_queue(); + sync_task_queue = task_sched.make_task_queue(); + gtpu_task_queue = task_sched.make_task_queue(); + mac_task_queue = task_sched.make_task_queue(); + metrics_task_queue = task_sched.make_task_queue(); } gnb_stack_nr::~gnb_stack_nr() @@ -129,9 +131,7 @@ void gnb_stack_nr::tti_clock_impl() task_sched.tic(); } -void gnb_stack_nr::process_pdus() -{ -} +void gnb_stack_nr::process_pdus() {} /******************************************************** * @@ -141,9 +141,22 @@ void gnb_stack_nr::process_pdus() bool gnb_stack_nr::get_metrics(srsenb::stack_metrics_t* metrics) { - mac.get_metrics(metrics->mac); - rrc.get_metrics(metrics->rrc); - return true; + // use stack thread to query metrics + auto ret = metrics_task_queue.try_push([this]() { + srsenb::stack_metrics_t metrics{}; + mac.get_metrics(metrics.mac); + rrc.get_metrics(metrics.rrc); + if (not pending_stack_metrics.try_push(std::move(metrics))) { + stack_logger.error("Unable to push metrics to queue"); + } + }); + + if (ret.has_value()) { + // wait for result + *metrics = pending_stack_metrics.pop_blocking(); + return true; + } + return false; } // Temporary GW interface