From 2a6b18863504393340362c92718971604ce169c1 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 27 Apr 2023 15:17:07 +0200 Subject: [PATCH] removed temporary "USE_MSGQ" definition. Now, with reorder_thread_disable we use the native message queue and L1_rx_thread instead of the thread-pool for the main L1 thread. There is a single TX thread (no slot parallelization) --- executables/nr-gnb.c | 59 +++++++++++------------ executables/nr-ru.c | 24 +++++---- openair1/SCHED_NR/fapi_nr_l1.c | 27 ++++------- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 11 ++--- 4 files changed, 52 insertions(+), 69 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index d2cd85be59..7161125f89 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -88,7 +88,6 @@ #include #include -#define USE_MSGQ 1 //#define USRP_DEBUG 1 // Fix per CC openair rf/if device update // extern openair0_device openair0; @@ -264,24 +263,22 @@ void rx_func(void *param) processingData_L1tx_t *syncMsg; // Its a FIFO so it maitains the order in which the MAC fills the messages // so no need for checking for right slot - #ifndef USE_MSGQ - if (get_softmodem_params()->reorder_thread_disable) - res = pullTpool(&gNB->L1_tx_out, &gNB->threadPool); - else + if (get_softmodem_params()->reorder_thread_disable) { + // call the TX function directly from this thread + syncMsg = gNB->msgDataTx; + syncMsg->gNB = gNB; + syncMsg->timestamp_tx = info->timestamp_tx; + tx_func(syncMsg); + } else { res = pullTpool(&gNB->L1_tx_filled, &gNB->threadPool); - if (res == NULL) - return; // Tpool has been stopped - syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res); - syncMsg->gNB = gNB; - syncMsg->timestamp_tx = info->timestamp_tx; - res->key = slot_tx; - pushTpool(&gNB->threadPool, res); -#else - syncMsg = gNB->msgDataTx; - syncMsg->gNB = gNB; - syncMsg->timestamp_tx = info->timestamp_tx; - tx_func(syncMsg); -#endif + if (res == NULL) + return; // Tpool has been stopped + syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res); + syncMsg->gNB = gNB; + syncMsg->timestamp_tx = info->timestamp_tx; + res->key = slot_tx; + pushTpool(&gNB->threadPool, res); + } } else if (get_softmodem_params()->continuous_tx) { notifiedFIFO_elt_t *res = pullTpool(&gNB->L1_tx_free, &gNB->threadPool); if (res == NULL) @@ -476,32 +473,30 @@ void init_gNB_Tpool(int inst) { // L1 RX result FIFO initNotifiedFIFO(&gNB->resp_L1); -#ifndef USE_MSGQ - notifiedFIFO_elt_t *msg = newNotifiedFIFO_elt(sizeof(processingData_L1_t), 0, &gNB->resp_L1, rx_func); - pushNotifiedFIFO(&gNB->resp_L1, msg); // to unblock the process in the beginning -#endif + if (!get_softmodem_params()->reorder_thread_disable) { + notifiedFIFO_elt_t *msg = newNotifiedFIFO_elt(sizeof(processingData_L1_t), 0, &gNB->resp_L1, rx_func); + pushNotifiedFIFO(&gNB->resp_L1, msg); // to unblock the process in the beginning + } // L1 TX result FIFO initNotifiedFIFO(&gNB->L1_tx_free); initNotifiedFIFO(&gNB->L1_tx_filled); initNotifiedFIFO(&gNB->L1_tx_out); -#ifdef USE_MSGQ - threadCreate(&gNB->L1_rx_thread, L1_rx_thread, (void *)gNB, "L1_rx_thread", - gNB->L1_rx_thread_core, OAI_PRIORITY_RT_MAX); -// threadCreate(&gNB->L1_tx_thread, L1_tx_thread, (void *)gNB, "L1_tx_thread", -// gNB->L1_tx_thread_core, OAI_PRIORITY_RT_MAX); -#endif if (get_softmodem_params()->reorder_thread_disable) { + // create the RX thread responsible for triggering RX processing and then TX processing if a single thread is used + threadCreate(&gNB->L1_rx_thread, L1_rx_thread, (void *)gNB, "L1_rx_thread", + gNB->L1_rx_thread_core, OAI_PRIORITY_RT_MAX); + // if separate threads are used for RX and TX, create the TX thread + // threadCreate(&gNB->L1_tx_thread, L1_tx_thread, (void *)gNB, "L1_tx_thread", + // gNB->L1_tx_thread_core, OAI_PRIORITY_RT_MAX); + notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t), 0, &gNB->L1_tx_out, tx_func); processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx); memset(msgDataTx, 0, sizeof(processingData_L1tx_t)); init_DLSCH_struct(gNB, msgDataTx); memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t)); -#ifndef USE_MSGQ - pushNotifiedFIFO(&gNB->L1_tx_out, msgL1Tx); // to unblock the process in the beginning -#else + // this will be removed when the msgDataTx is not necessary anymore gNB->msgDataTx = msgDataTx; -#endif } else { // we create 2 threads for L1 tx processing for (int i=0; i < 2; i++) { diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 4017c8e9ac..01a5e7fea8 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -60,7 +60,6 @@ unsigned short config_frames[4] = {2,9,11,13}; #endif -#define USE_MSGQ 1 /* these variables have to be defined before including ENB_APP/enb_paramdef.h and GNB_APP/gnb_paramdef.h */ static int DEFBANDS[] = {7}; @@ -1285,13 +1284,13 @@ void *ru_thread( void *param ) { } // end if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) { // At this point, all information for subframe has been received on FH interface -#ifndef USE_MSGQ - res = pullTpool(&gNB->resp_L1, &gNB->threadPool); - if (res == NULL) - break; // Tpool has been stopped -#else - res=newNotifiedFIFO_elt(sizeof(processingData_L1_t),0, &gNB->resp_L1,NULL); -#endif + if (!get_softmodem_params()->reorder_thread_disable) { + res = pullTpool(&gNB->resp_L1, &gNB->threadPool); + if (res == NULL) + break; // Tpool has been stopped + } else { + res=newNotifiedFIFO_elt(sizeof(processingData_L1_t),0, &gNB->resp_L1,NULL); + } syncMsg = (processingData_L1_t *)NotifiedFifoData(res); syncMsg->gNB = gNB; syncMsg->frame_rx = proc->frame_rx; @@ -1300,11 +1299,10 @@ void *ru_thread( void *param ) { syncMsg->slot_tx = proc->tti_tx; syncMsg->timestamp_tx = proc->timestamp_tx; res->key = proc->tti_rx; -#ifndef USE_MSGQ - pushTpool(&gNB->threadPool, res); -#else - pushNotifiedFIFO(&gNB->resp_L1, res); -#endif + if (!get_softmodem_params()->reorder_thread_disable) + pushTpool(&gNB->threadPool, res); + else + pushNotifiedFIFO(&gNB->resp_L1, res); } printf( "Exiting ru_thread \n"); diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c index d72eb208c3..9662780737 100644 --- a/openair1/SCHED_NR/fapi_nr_l1.c +++ b/openair1/SCHED_NR/fapi_nr_l1.c @@ -37,7 +37,6 @@ #include "nfapi/oai_integration/vendor_ext.h" #include "openair2/NR_PHY_INTERFACE/nr_sched_response.h" -#define USE_MSGQ 1 extern int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req); extern int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req); @@ -159,18 +158,16 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO) if (NFAPI_MODE == NFAPI_MONOLITHIC){ if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) { - notifiedFIFO_elt_t *res; -#ifndef USE_MSGQ - if (gNB->reorder_thread_disable) - res = pullTpool(&gNB->L1_tx_out, &gNB->threadPool); - else + notifiedFIFO_elt_t *res=NULL; + processingData_L1tx_t *msgTx=NULL; + if (!gNB->reorder_thread_disable) { res = pullTpool(&gNB->L1_tx_free, &gNB->threadPool); - if (res == NULL) - return; // Tpool has been stopped, nothing to process - processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res); -#else - processingData_L1tx_t *msgTx = gNB->msgDataTx; //newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0, &gNB->L1_tx_out,NULL); -#endif + if (res == NULL) + return; // Tpool has been stopped, nothing to process + msgTx = (processingData_L1tx_t *)NotifiedFifoData(res); + } else { + msgTx = gNB->msgDataTx; //newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0, &gNB->L1_tx_out,NULL); + } /*const time_stats_t ts = exec_time_stats_NotifiedFIFO(res); merge_meas(&gNB->phy_proc_tx, &ts); */ @@ -225,12 +222,8 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO) * released only when both threads are done with it. */ inc_ref_sched_response(Sched_INFO->sched_response_id); -#ifndef USE_MSGQ - if (gNB->reorder_thread_disable) - pushNotifiedFIFO(&gNB->L1_tx_out,res); - else + if (!gNB->reorder_thread_disable) pushNotifiedFIFO(&gNB->L1_tx_filled,res); -#endif } for (int i = 0; i < number_ul_tti_pdu; i++) { diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 566da85fb8..e24e17920b 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -395,13 +395,11 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH stop_meas(&gNB->ulsch_decoding_stats); } -#define USE_MSGQ 1 void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, uint8_t harq_pid, uint8_t crc_flag, int dtx_flag) { -#ifndef USE_MSGQ - pthread_mutex_lock(&gNB->UL_INFO_mutex); -#endif + if (!get_softmodem_params()->reorder_thread_disable) + pthread_mutex_lock(&gNB->UL_INFO_mutex); NR_gNB_ULSCH_t *ulsch = &gNB->ulsch[ULSCH_id]; NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_process; @@ -560,9 +558,8 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, gNB->UL_INFO.rx_ind.number_of_pdus++; -#ifndef USE_MSGQ - pthread_mutex_unlock(&gNB->UL_INFO_mutex); -#endif + if (!get_softmodem_params()->reorder_thread_disable) + pthread_mutex_unlock(&gNB->UL_INFO_mutex); } // Function to fill UL RB mask to be used for N0 measurements